說白了,具體實施步驟如下:
1.創建壹個包含redis命令的新文本文件。
設置Key0值0
設置密鑰1值1
...
設置關鍵值n
如果有原始數據,構造這個文件並不難,比如shell和python。
2.把這些命令變成Redis?協議.
因為Redis管道函數支持Redis?協議,而不是直接的Redis命令。
如何轉換,可以參考以下腳本。
3.使用管道插入
cat data.txt | redis-cli - pipe
殼牌VS?雷迪斯管道
讓我們通過測試來具體看看Shell bulk import和Redis pipe之間的效率。
測試思路:分別通過shell腳本和Redis管道將654.38+萬個相同的數據插入數據庫,檢查各自所用的時間。
殼
腳本如下:
#!/bin/bash for((I = 0;我& lt100000;i++)do echo-en " hello world " | redis-CLI-x set name $ I & gt;& gtredis.log
完成的
每次插入的值都是helloworld,但是鍵不壹樣,name0,name1...名字99999。
雷迪斯管道
Redis管道會麻煩壹點。
1 & gt;首先,構造redis命令的文本文件
在這裏,我選擇了python。
#!/usr/bin/python for I in range(100000):打印' set name'+str(i),' helloworld '
# python 1 . py & gt;redis _ commands.txt
# head -2 redis_commands.txt?
設置名稱0 helloworld
set name1 helloworld
2 & gt?把這些命令變成Redis?草案
這裏,我在github上使用了壹個shell腳本,
#!/bin/bashwhile讀取CMD做
#每個命令都以* {命令中的參數個數}開頭\r\n
XS =($ CMD);printf "*${#XS[@]}\r\n "
#對於每個參數,我們追加${length}\r\n{argument}\r\n?對於X以$CMD表示;do printf " \ $ $ { # X } \ r \ n $ X \ r \ ndonedone & ltredis _ commands.txt
# sh 20.sh & gtredis_data.txt
# head -7 redis_data.txt?
*3套3美元
5美元名稱0
$10helloworld
至此,數據結構完成。
試驗結果
如下所示:
耗時完全不是壹個量級。
最後,我們來看看pipe的實現原理。
redis-cli - pipe嘗試盡快將數據發送到服務器。
同時,它讀取可用的數據,並嘗試對其進行解析。
壹旦從stdin中沒有數據可讀取,它就發送壹個特殊的?回聲?帶有隨機20字節字符串的命令:我們確信這是最新發送的命令,並且我們確信如果我們接收到與批量回復相同的20字節,我們可以匹配回復檢查。
壹旦發送了這個特殊的最終命令,接收回復的代碼就開始用這20個字節匹配回復。當達到匹配的回復時,它可以成功退出。
也就是說,它會盡快將數據發送到Redis服務器,並盡快讀取和解析數據文件中的內容。壹旦數據文件中的內容被讀出,它將發送壹個帶有20字節字符串的echo命令,Redis服務器將根據該命令確認數據已被插入。
總結:
後續好奇的童鞋們,構造redis命令的時間和將命令轉換成協議的時間都貼在這裏:
[root @ MySQL-server 1 ~]# time python 1 . py & gt;redis _ commands.txt
real 0m0.110s
用戶0m0.070s
sys 0m0.040s
[root @ MySQL-server 1 ~]# time sh 20 . sh & gt;redis_data.txt
real 0m7.112s
用戶0m5.861s
sys 0m1.255s