Redis進階實踐之十六 Redis大批量增加數據

原文:Redis進階實踐之十六 Redis大批量增加數據

一、介紹

????????? 有時候,Redis實例需要在很短的時間內加載大量先前存在或用戶生成的數據,以便盡可能快地創建數百萬個鍵。這就是所謂的批量插入,本文檔的目標是提供有關如何以盡可能快的速度向Redis提供數據的信息。如果想查看英文原文,地址如下:https://redis.io/topics/mass-insert


二、操作詳解
?????

?????????? 話不多說,直接進入主題了。

????????? 1、使用協議,盧克(Use the protocol, Luke)

???????????????? 使用普通Redis客戶端的方式執行批量插入的操作并不是一個很好的辦法,原因如下:發送一個命令的方式很慢,因為您必須為每個命令都會有往返的時間消耗。雖然可以使用管道模式來操作,但為了批量插入多條記錄,您需要在讀取回復的同時編寫新命令,以確保盡可能快地插入。

???????????????? 另外,只有一小部分客戶端支持非阻塞 I/O 操作,而且并不是所有的客戶端都能夠以最大化吞吐量這種有效的方式來解析這些回復。 由于以上這些原因,將大量數據導入Redis的首選方式是生成包含Redis協議的文本文件(原始格式),以便調用插入所需數據所需的命令。

??????????????? 例如,如果我需要生成一個大型數據集,其中包含數十億個鍵:“keyN - > ValueN”,我將創建一個包含如下Redis協議格式的命令的文件:

                 SET Key0 Value0SET Key1 Value1...SET KeyN ValueN


???????????????? 一旦創建了該文件,剩下的操作就是盡可能快地將其提供給Redis。在過去,做法是使用如下的netcat的命令:

                (cat data.txt; sleep 10) | nc localhost 6379 > /dev/null


??????????????? 然而,這并不是一個非常可靠的方式來執行批量導入,因為 netcat 命令并不會真正知道所有數據何時傳輸完畢,并且也無法檢查發生的錯誤。在Redis的2.6或更高版本中,redis-cli實用程序支持稱為管道的新模式,該模式就是為了執行批量插入而存在的。

??????????????? 使用管道模式,運行的命令如下所示:

                cat data.txt | redis-cli --pipe


????????? ? ? ? 這將產生類似于這樣的輸出:

                All data transferred. Waiting for the last reply...Last reply received from server.errors: 0, replies: 1000000


?????????????? redis-cli實用程序還將確保只將從Redis實例收到的錯誤重定向到標準輸出。


???????? 2、生成Redis協議(Generating Redis Protocol)

????????????????? Redis協議生成和解析非常簡單,如果想了解協議的詳情,英文原地址點擊《這里》,我翻譯的文章的地址點擊《Redis進階實踐之十七 Redis協議的規范》。然而,為了生成用于大容量插入協議的目標,您不需要了解協議的每個細節,只需要按照以下方式書寫每個命令:

              *<args><cr><lf>$<len><cr><lf><arg0><cr><lf><arg1><cr><lf>...<argN><cr><lf>


???????????? ?? 其中<cr>表示“\r”(或ASCII字符13),<lf>表示“\n”(或ASCII字符10)。

??????????????? 例如,命令 SET key value 由以下協議表示:

              *3<cr><lf>$3<cr><lf>SET<cr><lf>$3<cr><lf>key<cr><lf>$5<cr><lf>value<cr><lf>


????????????? 或者表示為引用的字符串:

              "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n"


???????????? 為批量插入而生成的文件只不過是由以上述方式表示的一個接一個的命令組成的。

???????????? 以下Ruby函數生成有效的協議:

              def gen_redis_proto(*cmd)proto = ""proto << "*"+cmd.length.to_s+"\r\n"cmd.each{|arg|proto << "$"+arg.to_s.bytesize.to_s+"\r\n"proto << arg.to_s+"\r\n"}protoendputs gen_redis_proto("SET","mykey","Hello World!").inspect


???????????? 使用上述功能,可以使用此程序輕松生成上例中的鍵值對:

              (0...1000).each{|n|STDOUT.write(gen_redis_proto("SET","Key#{n}","Value#{n}"))}


????????????? 我們可以在redis-cli的管道中直接運行程序,以執行我們的第一次海量導入會話。

              $ ruby proto.rb | redis-cli -h 192.168.127.130 -p 6379 --pipeAll data transferred. Waiting for the last reply...Last reply received from server.errors: 0, replies: 1000



??????? 3、管道模式如何在引擎下工作(How the pipe mode works under the hoods)

???????????????? redis-cli管道模式的速度和netcat一樣快,與此同時,仍然能夠明白服務器最后一次發送回復的時間。

???????????????? 這是通過以下方式獲得的:

????????????????? 3.1、redis-cli --pipe Redis客戶端會盡可能快的向服務器發送數據。

???????????? ? ?? 3.2、同時,會盡可能快的讀取并解析數據文件中的內容。

????????????????? 3.3、一旦從標準輸入設備讀取數據完畢,它將會發送一個帶有20個字節的字符串的特殊的ECHO命令到服務器:我們確信這是最新發送的命令,如果我們收到作為批量回復的相同的20個字節的消息,我們確信可以做“答復匹配檢查”。

????????????????? 3.4、這個特殊的最終命令一經發送,Redis服務器端將接收到回復和這20個字節的回復消息做匹配。如果匹配,它可以成功退出,表示插入完畢。


?????????????? 使用這個技巧,我們不需要解析我們發送給服務器的協議,以了解我們發送了多少條命令,僅僅是一個答復而已。

?????????????? 但是,在解析回復時,我們會對所有解析的回復進行計數,以便在最后我們能夠告訴用戶傳輸到服務器的命令的數量在這次批量插入的會話中。


???? 4、示例代碼操作


?????????? 4.1、準備數據文件,格式是文本文件,名稱是:redis_commands.txt。

???????????? ? ? ? 我在Windows環境下生成了一個txt文件,一條數據一行,代碼如下:

                 SET Key0 Value0SET Key1 Value1SET Key2 Value2SET Key3 Value3SET Key4 Value4SET Key5 Value5SET Key6 Value6SET Key7 Value7SET Key8 Value8SET Key9 Value9SET Key10 Value10...SET KeyN ValueN


?????????????????? 我生成了500萬的數據,因為這個文本文件我是在Windows環境下生成的,所以需要格式轉換。


????????? 4.2、如果使用Windows環境下生成的文件,需要進行格式轉換,如果是在Linux環境下生成的文件就不需要格式轉換,如果文本文件比較大,執行轉換時間會有幾秒,等待即可。

????????????????? 執行格式轉換

              [root@linux ~]# unix2dos redis_commands.txtunix2dos:converting file redis_commands.txt to DOS format ...


????????????????? 以上代碼進行格式轉換完畢

????????????????? 需要說明一點,unix2dos這個命令需要先安裝,如果沒有安裝,會提示:command not found。

????????????????? 執行以下命令安裝:

              [root@linux ~]# yum install unix2dos


?????????? 4.3、進行數據批量插入

             [root@linux ~]# cat redis_commands.txt | redis-cli -h 192.168.127.130 -p 6379 [-a "password"] -n 0 --pipeAll data transferred.Waiting for the last reply...Last reply received from server.errors:0,replies:10000000


????????????????? 批量插入數據成功,一千萬的數據大概要花費50幾秒左右。


三、總結

?????????? 好的,今天就寫到這里,大批量數據插入的就是這么容易。只要理解了,其實也不是很難,技術就是一層窗戶紙,一捅就破,但是沒人捅就比較麻煩。下一篇文章,我們將寫一些關于redis協議格式的文章,如果要涉及大批量數據插入,就會涉及到redis規范協議的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452330.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452330.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452330.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目經理溝通的四個好習慣

一名項目經理溝通的時間占到工作時間的80%&#xff0c;所以如何提高溝通效率就變成了項目經理提高工作效率的重點。 一名優秀的項目經理&#xff0c;無疑是一個好的溝通者。因為&#xff0c;專業的技能可以使你成為某個領域的專家&#xff0c;但出色的溝通技能&#xff0c…

u盤安裝成功計算機里找不到文件夾,u盤里的文件不見了,詳細教您U盤內容不顯示怎么辦...

在工作、學習中&#xff0c;我們需要把資料攜帶外出的時候&#xff0c;首選的存儲工具基本上都是U盤。不過有用戶在使用U盤時卻遇到了U盤的所有的文件夾不見了的情況&#xff0c;但內存的明明文件還在&#xff0c;這到底是為什么呢&#xff1f;難道U盤的文件真的不見了嗎&#…

五分鐘實現SpringBoot快速入門

文章目錄一、創建Maven工程二、添加SpringBoot的起步依賴三、編寫SpringBoot引導類四、編寫Controller五、測試六、SpringBoot工程熱部署一、創建Maven工程 二、添加SpringBoot的起步依賴 文件位置&#xff1a;pom.xml SpringBoot要求&#xff0c;項目要繼承SpringBoot的起步…

分布式系統開發工具包 —— 基于Kryo的Java對象序列化

Kryo是用于Java語言的一個快速和高效的對象圖序列化框架。Kryo項目的目的是快速、高效、方便地使用API。當需要持久化對象的時候&#xff0c;不論是持久化到文件、數據庫還是網絡&#xff0c;都可以使用Kryo。 目前Kryo已經到了4.0.1版本以上了。本文的介紹適用于V2.0以上版本。…

代碼編輯器Sublime Text 可以跨平臺(linux,window,os x)

說到代碼編輯器&#xff0c;大部分人首先會想到UltraEdit&#xff0c;EmEditor和notepad。但今天要介紹的是另一款功能非常強大的代碼編輯器——Sublime Text。Sublime Text還是一款跨 OS X、Linux 和 Windows 三大平臺的文字/代碼編輯器。除了Sublime Text出色的功能&#xff…

計算機畫圖怎樣更改文字,如何在圖片上改字|超簡單的修改圖片里文字方法

這篇文章將要給大家介紹的是&#xff0c;不用聯網&#xff0c;不用下載專業的圖像處理軟件&#xff0c;單純用畫圖工具&#xff0c;就能修改表情包、圖片上文字的方法&#xff0c;只適合簡單的圖片處理&#xff0c;復雜的還是交給專業的圖像處理工具吧。下面系統吧就給大家帶來…

軟件維護

所謂軟件維護就是在軟件已經交付使用之后&#xff0c;為了改正錯誤或滿足新的需要而修改軟件的過程。可以通過描述軟件交付使用后可能進行的4項活動&#xff0c;具體地定義軟件維護。 1.改正性維護 因為軟件測試不可能暴露出一個大型軟件系統中所有潛藏的錯誤&#xff0c;所以…

【intellij idea】Project Structure 講解

參考文章&#xff1a;戳這里 謝謝樓主分享

將以太坊封裝為 ERC20

將以太坊封裝為 ERC20 TOKEN 很多 DAPP 都是在處理 ERC20接口的 token, 其實很容易將以太坊封裝為 ERC20,這樣就可以統一處理, 至少我目前在做的雷電網絡就是這么處理的. 主要內容復制在網絡https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-tok…

javascript高級程序設計學習之數值轉換 |Number(),parseInt(),parseFloat()

2019獨角獸企業重金招聘Python工程師標準>>> 將非數值轉換成數值的函數有三個&#xff1a;Number(),parseInt(),parseFloat(); 小記tip&#xff1a;Number()可以用于任何數據類型&#xff1b;parseInt(),parseFloat()針對的是將字符串&#xff1b; Number()的轉換規…

軟件的可維護性

可以把軟件的可維護性定性地定義為&#xff1a;維護人員理解、改正、改動或改進這個軟件的難易程度。 提高可維護性是支配軟件工程方法學所有步驟的關鍵目標。

服務器內存延遲,內存帶寬、延遲性能測試

內存帶寬、延遲性能測試華為FusionServer 2488H V5服務器主板集成了48個內存插槽&#xff0c;但送測機器配備有限。由于送測機型整合了四通道內存控制器&#xff0c;這樣使得平臺的內存帶寬得到了明顯的提升。SiSoftware Sandra Lite 2011中提供了內存帶寬、內存延遲和緩存性能…

Git學習的最佳教程

身為網頁設計師或者網頁開發者的你&#xff0c;可能已經聽說過Git這個正快速成長的版本控制系統。它由GitHub維護&#xff1b;GitHub是一個開放性的、存儲眾人代碼的網站。如果你想學習如何使用Git&#xff0c;請參考本文。在文章最后&#xff0c;我們羅列了其他Git學習資源。 …

如何使用idea快速創建SpringBoot項目

文章目錄一、二、三、四、五、一、 二、 三、 四、 五、

解決pip安裝模塊報錯Cannot fetch index base URL http://pypi.python.org/simple/

產生這個問題的原因呢和github一樣,因為他們用的cdn被墻.經小伙伴反饋,解決辦法如下. 通過指定國內鏡像源來安裝: pip --trusted-host 鏡像源 install 模塊名 -i 鏡像源路徑 例如:pip --trusted-host pypi.doubanio.com install paramiko -i http://pypi.doubanio.com/simple 注…

閃光css,CSS實現的一閃而過的圖片閃光效果

只需要兩個html元素和一個css變換&#xff0c;我就能創造出我自己的閃光效果。讓我們來實現它&#xff01;呈現光澤圖片下面就是這張addy在他博客上使用的圖片&#xff1a;比我需要的要大一些&#xff0c;但你可以把它裁剪一些。注意&#xff1a;左邊的那張是純白色的&#xff…

什么是可重用性

所謂重用&#xff08;reuse&#xff09;是指同一事物不做修改或稍加改動就在不同環境中多次重復使用。大量使用可重用的軟件構件來開發軟件&#xff0c;可以從下述兩個方面提高軟件的可維護性。 (1) 通常&#xff0c;可重用的軟件構件在開發時都經過很嚴格的測試&#xff0c;可…

MATLAB矩陣操作和算術運算符

矩陣的表示 矩陣之間用空格或者是逗號間隔 矩陣可以拼接&#xff08;可以用矩陣拼接&#xff09; 實部矩陣和虛部矩陣構成復數矩陣&#xff0c;一一對應。 冒號表達式&#xff1a; 格式&#xff1a; e1:e2:e3 e1表示初始值 e2表示步長 e3表示終止值 e2省略則e2為1 lins…

循序漸進學好編程,不要太急!!!

軟件開發人員是一個日新月異的領域—–IT中的大師&#xff0c;今天的編程方式與明天的編程或許截然不同&#xff0c;技術在不斷地革新&#xff0c;新語言、新平臺的如雨后春筍般出現、更好的解決方案的冒出&#xff0c;因此我們需要跟得上節奏&#xff0c;我們別無選擇&#xf…