欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

批量数据导入Redis(Mass Insertion)

程序员文章站 2022-06-11 08:07:23
...

前言

一觉醒来改好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)

相关标签: redis 数据