1. 程式人生 > >批量資料匯入Redis(Mass Insertion)

批量資料匯入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

結果如下

這裡寫圖片描述