批量数据导入Redis(Mass Insertion)

时间:2022-03-17 14:52:53

前言

一觉醒来改好bug的感觉真爽,可惜周围小伙伴都睡了,不能让我欢呼雀跃一下。

正文

本篇主要通过一个典型的K—V批量数据导入例子来总结redis的数据导入过程,同时穿插了一些格式化数据的处理方式。

需求

我的项目需要将 ‘英文单词’ – ‘汉译’ 以K-V的形式保存在redis中,然后进行查询功能,这里就采用了Redis的批量导入功能。

笨方法

如果在客户端,我们想要插入一条数据,就直接做就好

SET key value

然而当遇到成千上万条呢?

我自己想到的笨方法就是写个循环呗。。。让程序自己跑。。
但是既然有更高效和简单的办法,为什么不用呢?

优雅的方法

从Redis2.6开始,redis-cli支持使用pipe模式插入大量数据。
我们只需要将数据格式化、协议化便可以简单高效的完成批量插入。
如下,将数据处理之后保存在文件file,只需要

$ cat file | redis-cli --pipe

就完成了

格式化数据

我们将需要的 ‘英语单词’和‘汉译’进行一一对应,用空格分开。
内容如下

software n.(计算机的)软件
solar a.利用太阳光的
solidarity n.团结;休戚相关
solidify vt.&vi.团结;凝固

然后添加命令(其实这里可以不添加,因为直接使用SET)

SET software n.(计算机的)软件  
SET solar a.利用太阳光的
SET solidarity n.团结;休戚相关
SET solidify vt.&vi.团结;凝固

本文重点:协议化数据

我们需要将刚才的数据协议化为Redis的交互协议,因为一开始不知道,同时,在官方文档中,感觉是默认读者了解这个协议,所以并没有很详细的解释,导致我自己在这部分踩了很多坑。
我们只要知道这里的协议格式,就非常清晰该如何处理了。
在这里,我们不详细展开redis的协议格式,仅就处理本文中的例子而说明。
例子:

SET software n.(计算机的)软件

协议化之后

*3\r\n
$3\r\n
SET\r\n
$
8\r\n
software\r\n
$?\r\n //这里的问号下文说明
n.(计算机的)软件\r\n

可以看到,每行的结尾都是\r\n,第一个*3表示内容一共有3行(命令+key+value),$3表示有3个字节(也就是下面的SET),然后就是命令,$8表示有8个字节(也就是下面的software),而下面是中文了,所以这里的字节数我们需要根据实际的编码去判断,所以我采用了?来表示。
而网上的一些协议化程序,往往没有对中文进行处理。。。(导致我踩了好长时间的坑),所以不如针对你自己的格式化数据写个程序处理一下。

和本文无关的一点感想
看到很多人都用python处理,其实这么小的事情,你只要拿你熟练的语言快速写一个程序,能正确就好,我就是拿C写的。。。

#include<stdio.h>
#include<string.h>
int main(void)
{
char str[200],str2[200];
FILE *f1,*f2;
f1 = fopen("source","r"); //格式化数据
f2 = fopen("result","w"); //协议化之后的结果
while(fscanf(f1,"%s %s",str,str2)!=EOF){ //这里我的格式化数据就只有英文和汉译,没有SET命令
fprintf(f3,"*3\r\n$3\r\nset\r\n$%d\r\n%s\r\n$%d\r\n%s\r\n",strlen(str),str,strlen(str2),str2);
}
fclose(f1);
fclose(f2);
}

然后就是直接导入了

$ cat result | redis-cli --pipe

结果如下

批量数据导入Redis(Mass Insertion)