麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > Redis > 正文

如何高效地向Redis插入大量的數據(推薦)

2020-10-28 21:38:30
字體:
來源:轉載
供稿:網友

最近有個哥們在群里問,有一個日志,里面存的是IP地址(一行一個),如何將這些IP快速導入到Redis中。

我剛開始的建議是Shell+redis客戶端。

今天,查看Redis官檔,發現文檔的首頁部分(http://www.redis.io/documentation)有一個專門的主題是講述“Redis Mass Insertion”的,才知道自己的建議很low。

官方給出的理由如下:

Using a normal Redis client to perform mass insertion is not a good idea for a few reasons: the naive approach of sending one command after the other is slow because you have to pay for the round trip time for every command. It is possible to use pipelining, but for mass insertion of many records you need to write new commands while you read replies at the same time to make sure you are inserting as fast as possible.

Only a small percentage of clients support non-blocking I/O, and not all the clients are able to parse the replies in an efficient way in order to maximize throughput. For all this reasons the preferred way to mass import data into Redis is to generate a text file containing the Redis protocol, in raw format, in order to call the commands needed to insert the required data.

大意是:

1> 每個redis客戶端命令之間有往返時延。

2> 只要一部分客戶端支持非阻塞I/O。

個人理解是,redis命令從執行到結果返回,有一定的時延,即便采用多個redis客戶單并發插入,也很難提高吞吐量,因為,只有非阻塞I/O只能針對有限個連接操作。

那么如何高效的插入呢?

官方在2.6版本推出了一個新的功能-pipe mode,即將支持Redis協議的文本文件直接通過pipe導入到服務端。

說來拗口,具體實現步驟如下:

1. 新建一個文本文件,包含redis命令

SET Key0 Value0SET Key1 Value1...SET KeyN ValueN

如果有了原始數據,其實構造這個文件并不難,譬如shell,python都可以

2. 將這些命令轉化成Redis Protocol。

因為Redis管道功能支持的是Redis Protocol,而不是直接的Redis命令。

如何轉化,可參考后面的腳本。

3. 利用管道插入

cat data.txt | redis-cli --pipe

Shell VS Redis pipe

下面通過測試來具體看看Shell批量導入和Redis pipe之間的效率。

測試思路:分別通過shell腳本和Redis pipe向數據庫中插入10萬相同數據,查看各自所花費的時間。

Shell

腳本如下:

#!/bin/bashfor ((i=0;i<100000;i++))doecho -en "helloworld" | redis-cli -x set name$i >>redis.logdone

每次插入的值都是helloworld,但鍵不同,name0,name1...name99999。

Redis pipe

Redis pipe會稍微麻煩一點

1> 首先構造redis命令的文本文件

在這里,我選用了python

#!/usr/bin/pythonfor i in range(100000):  print 'set name'+str(i),'helloworld'

# python 1.py > redis_commands.txt

# head -2 redis_commands.txt

set name0 helloworldset name1 helloworld

2> 將這些命令轉化成Redis Protocol

在這里,我利用了github上一個shell腳本,

#!/bin/bashwhile read CMD; do # each command begins with *{number arguments in command}/r/n XS=($CMD); printf "*${#XS[@]}/r/n" # for each argument, we append ${length}/r/n{argument}/r/n for X in $CMD; do printf "/$${#X}/r/n$X/r/n"; donedone < redis_commands.txt

# sh 20.sh > redis_data.txt

# head -7 redis_data.txt

*3$3set$5name0$10helloworld

至此,數據構造完畢。

測試結果

如下:

時間消耗完全不是一個量級的。

最后,來看看pipe的實現原理,

  • redis-cli --pipe tries to send data as fast as possible to the server.
  • At the same time it reads data when available, trying to parse it.
  • Once there is no more data to read from stdin, it sends a special ECHO command with a random 20 bytes string: we are sure this is the latest command sent, and we are sure we can match the reply checking if we receive the same 20 bytes as a bulk reply.
  • Once this special final command is sent, the code receiving replies starts to match replies with this 20 bytes. When the matching reply is reached it can exit with success.

即它會盡可能快的將數據發送到Redis服務端,并盡可能快的讀取并解析數據文件中的內容,一旦數據文件中的內容讀取完了,它會發送一個帶有20個字節的字符串的echo命令,Redis服務端即根據此命令來確認數據已插入完畢。

總結:

后續有童鞋好奇,構造redis命令的時間和將命令轉化為protocol的時間,這里一并貼下:

[root@mysql-server1 ~]# time python 1.py > redis_commands.txtreal  0m0.110suser  0m0.070ssys  0m0.040s[root@mysql-server1 ~]# time sh 20.sh > redis_data.txtreal  0m7.112suser  0m5.861ssys  0m1.255s

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 午夜爱爱福利 | 羞羞答答www网站进入 | 久久久久亚洲国产精品 | 日韩视频在线观看免费视频 | av日韩在线免费观看 | 久久久三级免费电影 | 女18一级大黄毛片免费女人 | 黄www片 | 国产精品一区2区3区 | av成人在线免费观看 | 在线观看免费污视频 | 欧美黄色视屏 | 国产精品久久久久久久久久尿 | 亚洲网站在线观看视频 | a黄色网| 有兽焉免费动画 | 久久国产精品免费视频 | 一级黄色毛片播放 | 成人店女老板视频在线看 | 欧美成人三级视频 | 99视频有精品视频高清 | 综合精品一区 | 亚洲成人精品一区二区 | 日本aaaa片毛片免费观蜜桃 | 久久艹综合 | 成人福利免费在线观看 | 久久精品亚洲成在人线av网址 | 日韩av片网站 | av在线更新 | 亚州成人在线观看 | 久久久久久艹 | 性少妇videosexfreexxx片 | 国产精品一区二区三区99 | 性毛片视频 | 亚洲精品7777 | 天天骑夜夜操 | 欧美日韩色 | jizzzzxxxxx | 第四色成人网 | 黄色大片www| 欧美性受xxxxxx黑人xyx性爽 |