背景:
推荐系统实战过程中,需要将生成的item-item:score数据导入到redis数据库中,便于之后的在线查询
方法:
Redis2.6之后,redis-cli支持pipe模式进行批量插入数据
我们只需要将数据格式化为:
SET key value(空格隔开)
之后在命令行使用管道的方式导入即可:
cat insert_file | redis-cli --pipe
具体操作如下:
1.原始数据(cf.redis)
itema item1:score1,item2:score2,item3:score3…
例如:
2.将原始数据转换为:SET key value格式
cat cf.redis | awk -F\\t '{print "SET "$1" "$2}' > cf.insert
转换之后的数据(cf.insert)
SET itema item1:score1,item2:score2,item3:score3…
例如:
3. 批量插入数据
cat cf.insert | redis-cli --pipe
直接执行上文批量插入命令时,报错
*****报错原因:*****插入的数据没有遵循Redis协议。
Redis协议的生成和解析可以参考这里。我们不需要了解具体的细节,只需要按照以下方式书写每个命令:
*<args><cr><lf>
$<len><cr><lf>
<arg0><cr><lf>
<arg1><cr><lf>
...
<argN><cr><lf>
其中表示“\r”(或ASCII字符13),表示“\n”(或ASCII字符10)。
例如:SET key value由以下协议表示:
*3<cr><lf>
$3<cr><lf>
SET<cr><lf>
$3<cr><lf>
key<cr><lf>
$5<cr><lf>
value<cr><lf>
由以上Redis协议可知,每个命令后都有一个\r\n的换行符。由于Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n。所以我们必须将unix&Linux文件的换行符转换为\r\n,具体做法运用unix2dos命令完成。它是将Linux&Unix格式文件转换为Windows格式文件的命令。
unix2dos cf.insert
以上代码进行格式转换完毕
需要说明一点,unix2dos这个命令需要先安装,如果没有安装,会提示:command not found。
再次执行批量插入命令:
总结
批量插入Redis时,注意两点,一是数据格式(SET key value),二是Redis协议(unix2dos格式转换)。
求解
Redis采用pipe模式批量插入数据时,数据量有上限吗?必要的时候是不是可以采用split分割数据,分批插入 。