美文网首页
从MySQL导出数据到Redis

从MySQL导出数据到Redis

作者: 米刀灵 | 来源:发表于2016-09-20 10:38 被阅读1050次

    1.当向Redis中一次性导入大数据时,可以将所有的插入命令写到一个txt文件中,如插入 key-value

    SET test0 abc
    SET test1 bcd
    SET test3 abcd
    

    或者

    sadd miaopai M44xschlTD19MkDL zoPKSNHdMiwz41tM sDSF-A6w6ewLuYLs BLsKbF6JmRjvMEf~ cWGJTDIa-DjfZClg17C6mA__ kHMb23MaqpohIVsM KZDTlh1aOWFjIbsW
    

    每个SET命令前要留一个空格,保存为data.txt,然后使用 redis的客户端 redis-cli的管道传输(redis的版本要大于2.6)
    linux下使用命令:

    cat data.txt | redis-cli --pipe
    cat sadd.txt | redis-cli --pipe -a password
    

    成功的话就会出现如下结果:

    All data transferred. Waiting for the last reply...
    Last reply received from server.
    errors: 0, replies: 3
    

    2.使用符合redis协议格式的数据,虽然第一种方法比较方便,不过存在的问题是,有时redis无法正确解释数据,所有推荐的第二种方式,此协议数据的格式如下:

    *3<cr><lf>
    $3<cr><lf>
    SET<cr><lf>
    $3<cr><lf>
    key<cr><lf>
    $5<cr><lf>
    value<cr><lf>
    

    意义如下:
    第一行: 3<cr><lf> : 星号是规定格式;3是参数的个数(如上:SET、key、value) ;<cr>是'\r'; <lf>是'\n'。\r\n代表回车换行。
    第二、三行: $3<cr><lf> : $是规定格式;3是对应命令SET的长度(3个字母);<cr><lf>同上
    所以上述格式又可写成:

    *3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n 
    

    3.使用mysql一次性导入大量数据的原理是一样的,将数据按上述协议的格式导出来,然后再通过redis-cli --pipe导入
    建表语句:

    CREATE TABLE events_all_time (  
      id int(11) unsigned NOT NULL AUTO_INCREMENT,  
      action varchar(255) NOT NULL,  
      count int(11) NOT NULL DEFAULT 0,  
      PRIMARY KEY (id),  
      UNIQUE KEY uniq_action (action)  
    ); 
    

    准备在每行数据中执行的redis命令如下:
    HSET events_all_time [action] [count] ,使用了redis哈希的数据类型。
    按照以上redis命令规则,创建一个events_to_redis.sql文件,内容是用来生成redis数据协议格式的SQL:

    -- events_to_redis.sql  
    SELECT CONCAT(  
      "*4\r\n",  
      '$', LENGTH(redis_cmd), '\r\n',  
      redis_cmd, '\r\n',  
      '$', LENGTH(redis_key), '\r\n',  
      redis_key, '\r\n',  
      '$', LENGTH(hkey), '\r\n',  
      hkey, '\r\n',  
      '$', LENGTH(hval), '\r\n',  
      hval, '\r' 
    )  
    FROM (  
      SELECT 
      'HSET' as redis_cmd,  
      'events_all_time' AS redis_key,  
      action AS hkey,  
      count AS hval  
      FROM events_all_time  
    ) AS t 
    

    用下面的命令执行:

    mysql -h192.168.0.104 -uroot -p123  db_name --skip-column-names --raw < events_to_redis.sql | redis-cli --pipe 
    

    很重要的mysql参数说明:
    --raw: 使mysql不转换字段值中的换行符。
    --skip-column-names: 使mysql输出的每行中不包含列名。

    4.使用java读文本,写入redis

    Pipeline p = redis.pipelined();
    
    private void loadDictionary(final URL dictionaryUrl) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(dictionaryUrl.openStream());
        BufferedReader reader = new BufferedReader(inputStreamReader);
        String word;
        while((word = reader.readLine()) != null) {
            word = word.trim();
            // Add the word if the word does not start with #
            if(!word.isEmpty() && !word.startsWith("#")) {
                addWord(word);
            }
        }
        reader.close();
        inputStreamReader.close();
    }
    
    private void addWord(final String word) {
        // Add all the possible prefixes of the given word and also the given
        // word with a * suffix.
        p.zadd(redisKey, 0, word + "*");
        for(int index = 1, total = word.length(); index < total; index++) {
            p.zadd(redisKey, 0, word.substring(0, index));
        }
    
    }

    相关文章

      网友评论

          本文标题:从MySQL导出数据到Redis

          本文链接:https://www.haomeiwen.com/subject/vrtoettx.html