从MySQL导出数据到Redis

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
$3
SET
$3
key
$5
value

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

*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)