批量导入数据到Redis

时间:2024-03-30 15:22:24

背景:
推荐系统实战过程中,需要将生成的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…
例如:
批量导入数据到Redis

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…
例如:
批量导入数据到Redis
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

批量导入数据到Redis
以上代码进行格式转换完毕

需要说明一点,unix2dos这个命令需要先安装,如果没有安装,会提示:command not found。

再次执行批量插入命令:
批量导入数据到Redis
总结
批量插入Redis时,注意两点,一是数据格式(SET key value),二是Redis协议(unix2dos格式转换)。

求解
Redis采用pipe模式批量插入数据时,数据量有上限吗?必要的时候是不是可以采用split分割数据,分批插入 。