cvmachine.com - 申博开户网

查找: 您的方位主页 > 网络频道 > 阅览资讯:向Redis刺进很多的数据的办法技巧

向Redis刺进很多的数据的办法技巧

2016-12-04 10:00:17 来历:www.cvmachine.com 【

向Redis刺进很多的数据的办法技巧

最近有个哥们在群里问,有一个日志,里边存的是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 Value0
SET 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/bash
for ((i=0;i<100000;i++))
do
echo -en "helloworld" | redis-cli -x set name$i >>redis.log
done

每次刺进的值都是helloworld,但键不同,name0,name1...name99999。

Redis pipe

Redis pipe会略微费事一点

1> 首要结构redis指令的文本文件

在这儿,我选用了python

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

# python 1.py > redis_commands.txt

# head -2 redis_commands.txt

set name0 helloworld
set name1 helloworld

2> 将这些指令转化成Redis Protocol

在这儿,我运用了github上一个shell脚本,

#!/bin/bash

while 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"; done
done < redis_commands.txt

# sh 20.sh > redis_data.txt

# head -7 redis_data.txt

*3
$3
set
$5
name0
$10
helloworld

至此,数据结构结束。

测验成果

如下:
向Redis刺进很多的数据的办法技巧

时刻耗费彻底不是一个量级的。

最终,来看看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.txt

real 0m0.110s
user 0m0.070s
sys 0m0.040s
[root@mysql-server1 ~]# time sh 20.sh > redis_data.txt

real 0m7.112s
user 0m5.861s
sys 0m1.255s

以上便是本文的全部内容,期望对咱们的学习有所协助,也期望咱们多多支撑申博开户。


本文地址:http://www.cvmachine.com/a/question/85290.html
m88 188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
Tags: Redis 高效 刺进
修改:申博开户网
关于咱们 | 联络咱们 | 友情链接 | 网站地图 | Sitemap | App | 回来顶部