當前位置:成語大全網 - 書法字典 - Redis,如何選擇性加載關鍵數據?

Redis,如何選擇性加載關鍵數據?

在2.6版本中,政府引入了壹個新的功能——管道模式,即將支持Redis協議的文本文件通過管道直接導入服務器。

說白了,具體實施步驟如下:

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