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
所以上述格式又可写成:
*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));
}
}