批量資料匯入Redis(Mass Insertion)
前言
一覺醒來改好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