4.2 pipeline

  pipeline的中文意思是管道。

  下面通过图示,我们看看认清楚什么是流水线。

  批量网络命令通信模型:n次时间=n次网络时间+n次命令时间

使用场景

Pipeline模型:

使用场景

  pipeline就是把一批命令进行打包,然后传输给server端进行批量计算,然后按顺序将执行结果返回给client端使用Pipeline模型进行n次网络通信需要的时间:

1次pipeline(n条命令) = 1次网络时间 + n次命令时间

  为了更具体,我们可以测试一下时间:(python实现)

import redis
import time

client = redis.StrictRedis(host='192.168.81.100',port=6379)
start_time = time.time()

for i in range(10000):
    client.hset('hashkey','field%d' % i,'value%d' % i)

ctime = time.time()
print(client.hlen('hashkey'))
print(ctime - start_time)

程序执行结果:

10000
2.0011684894561768

  在上面的例子里,直接向Redis中写入10000条hash记录,需要的时间大约为2.00秒,使用pipeline的方式向Redis中写入1万条hash记录

import redis
import time

client = redis.StrictRedis(host='192.168.81.100',port=6379)
start_time = time.time()

for i in range(100):
    pipeline = client.pipeline()
    j = i * 100
    while j < (i+ 1) * 100:
        pipeline.hset('hashkey1','field%d' % j * 100,'value%d' % i)
        j += 1
    pipeline.execute()

ctime = time.time()
print(client.hlen('hashkey1'))
print(ctime - start_time)

程序执行结果:

10000
0.3175079822540283

  可以看到使用Pipeline方式每次向Redis服务端发送100条命令,发送100次所需要的时间仅为0.31秒,可以看到使用Pipeline可以节省网络传输时间

  值得注意的是:

  1. 每次pipeline携带数据量不能太大
  2. pipeline可以提高Redis批量处理的并发的能力,但是并不能无节制的使用
  3. 如果批量执行的命令数量过大,则很容易对网络及客户端造成很大影响,此时可以把命令分割,每次发送少量的命令到服务端执行
  4. pipeline每次只能作用在一个Redis节点上

  还有,记得pipeline命令不是原子命令(要么全部一下子执行,要么不执行),pipeline中命令以子命令的形式穿插在Redis执行的其他命令当中

使用场景

版权声明: 本文为智客工坊「沉晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""