管道并非Redis自己提供的功能,一般是客户端提供的功能;web
管道就是打包多条无关命令批量执行,以减小多个命令分别执行消耗的网络交互时间(TCP网络交互),能够显著提高Redis的性能;redis
管道使用的场景并不适用于,必须知道每次交互结果的场景或者当前的执行依赖于上一次的执行结果等等,相反的,比较适用于对于可靠性不高,容许必定程度的失败,而且不须要当即获得执行的反馈,好比群发短信服务;网络
须要注意的是,若是以管道处理的形式发送大批的命令,那么Redis必须将这些命令都执行完存储在内存中,也就是说,并非批量的命令个数越多越好,不然会形成资源的浪费;ide
# -*- coding: utf-8 -*-
# @Time : 2019/4/13 5:28 AM
# @Author : George
# @File : pipeline.py
# @Contact : georgewang1994@163.com
from redis import StrictRedis
import time
conn = StrictRedis()
cache_key_list = ['testing_pipeline_%s' for i in range(10)]
count = 10000
num_list = [num for num in range(count)]
# 遍历加入
start_time1 = time.time()
for cache_key in cache_key_list:
for num in num_list:
conn.sadd(cache_key, num)
end_time1 = time.time()
print u"遍历加入花费时间: %s's" % (end_time1 - start_time1)
# 命令一次性加入
start_time2 = time.time()
for cache_key in cache_key_list:
conn.sadd(cache_key, *num_list)
end_time2 = time.time()
print u"命令一次性加入花费时间: %s's" % (end_time2 - start_time2)
# 管道加入
start_time3 = time.time()
pipe = conn.pipeline(transaction=False)
for cache_key in cache_key_list:
pipe.sadd(cache_key, *num_list)
pipe.execute()
end_time3 = time.time()
print u"管道加入花费时间: %s's" % (end_time3 - start_time3)
# 运行结果
# 遍历加入花费时间: 11.5690069199's
# 命令一次性加入花费时间: 0.477045059204's
# 管道加入花费时间: 0.41309595108's
todo: 之后补充性能