引言
redis是当前面试高频的一个板块,常见redis最热门的的话题就是缓存击穿、穿透、雪崩、主从复制原理等等,目前了不起针对redis有好多篇输出,可以直接查看相关redis合集去查看历史文章。
今天了不起带着问题来谈一谈redis批量插入的问题,带着大家一起学习一下redis批量插入数据。
事情是这样的,了不起最近有个项目中,某个需求的实现是每次操作前需要读取一个文件中的数据,并且初始化数据到redis中,用完后有的清除,有的保留。
这里有个需求点就是项目第一次上线需要批量的向redis中放入数据,实现方案可以是读取文件中的内容,然后由代码脚本来一条语句一条语句插入。
当然这样做也没什么问题,不过其实redis自身也是具备从文件中批量插入数据的功能,我们一起来看一看吧!
创建redis命令文件
redis读取的文件内容肯定是要符合redis语法的,所以我们可以将刚刚需求的文件内容进行转义,手动或者自动都是可以的,把它改写成redis命令文件。
代码语言:javascript复制server$ vim d1.txt
set myk12 v1
zadd zset12 0 a 1 b 3 c
sadd sset12 e f g hh
set myk22 v2
hset myset12 k1 v1
hmset myset22 k2 v2 k3 v3 k4 v4
set myk32 v3
只要符合redis客户端语法的都可以,把目标文件内容改程类似上面的格式。
转码
redis-cli客户端命令,只支持dos格式的换行符 rn
。
我们最好都转个码,没有转码的文件,执行会失败。转码指令是使用unix2dos,使用方法如下:
代码语言:javascript复制// 转码指令, 只需要在命令后加入要转码的文件即可:
server> unix2dos d1.txt
unix2dos: converting file d1.txt to DOS format...
注意事项:如果使用unix2dos这个命令进行转码提示没有这个命令,就需要进行安装unix2dos转码工具。
在mac下用brew install unix2dos 安装的unix2dos转码工具
代码语言:javascript复制brew install unix2dos
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
... 部分省略 ...
==> Pouring dos2unix-7.3.4.sierra.bottle.tar.gz
/usr/local/Cellar/dos2unix/7.3.4: 23 files, 344.3K
如果是CentOS,使用unix2dos这个命令进行转码提示没有这个命令,用yum install unix2dos安装unix2dos转码工具。
代码语言:javascript复制yum install unix2dos
已加载插件:fastestmirror, security
... 部分省略 ...
已安装:
unix2dos.x86_64 0:2.2-35.el6
完毕!
执行导入
待文件转码完成后,就可以开始导入数据了。
前置条件是redis服务已经正常启动并运行,这里不展开讲解redis如何启动。
导入使用cat和redis-cli命令组合,cat是用来读取文件内容,将文件内容读取到内存中,redis-cli用来发送文件到redis执行。
代码语言:javascript复制server> cat d1.txt | redis-cli
OK
(integer) 3
(integer) 4
OK
(integer) 1
OK
OK
导入指令输出结果中可以看到每一行的返回记录和输出结果。
如果你导入的指令非常多,可以使用 --pipe
管道这个参数来启用pipe协议,它不仅能减少返回结果的输出,还能更快的执行指令,关于管道pipeline后面也会细讲。
server> cat d1.txt | redis-cli --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 7
如果你需要导入数据在远程主机上,而且端口也是自定义的,那么可以使用下面的命令将文件导入到远程服务器:
代码语言:javascript复制server> cat d1.txt | redis-cli -p 6379 -h 192.168.1.168 --pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 7
数据导入完成后,去redis检查数据是否导入成功了:
代码语言:javascript复制server$ redis-cli -p 6380
127.0.0.1:6380> get myk1
"v1"
127.0.0.1:6380> hgetall myset1
1) "k1"
2) "v1"
127.0.0.1:6380> hgetall myset2
1) "k2"
2) "v2"
3) "k3"
4) "v3"
5) "k4"
6) "v4"
是不是非常的nice,以后redis中有什么数据要处理,直接一行命令搞定!
总结
都是初始化数据到redis,用代码和用这种方式哪个更加方便快捷相信大家心理有数了。
redis从文件中批量插入数据你学会了吗?