介绍
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。客户端请求会遵循以下步骤:客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应并将结果返回给客户端。(补:阻塞?上一条请求结果没回来,就无法进行下一条请求。)
客户端和服务器通过网络传输数据,一次请求响应时间单位时间称为RTT(往返时间)。如果客户端连续发出多个请求,是有性能影响的,即使服务处理得再快,RTT传输也大大影响响应的快慢(补:类比网购,发货很快,快递运输很慢)。因此需要管道技术(pipeline)。
管道技术使得客户端即使没有读取旧的响应,也可以将多个请求发送到服务器,而无需等待回复,最后只需一步一步地读取应答。
代码
import redis r = redis.StrictRedis(host='localhost',port=6379,db=0) # r.set('foo','bar') # print(r.get('foo')) pipeline = r.pipeline(transaction=False) pipeline.incr('a') pipeline.incr('b') pipeline.incr('c') pipeline.incr('d') pipeline.execute() print(r.get('a'),' ',r.get('b'),r.get('c'),' ',r.get('d'))
结果
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32 runfile('E:/舒碧/项目/Redis_pipeline/redis_pipline.py', wdir='E:/舒碧/项目/Redis_pipeline') b'6' b'6' b'6' b'6'
由于电脑环境原因、目前只能进行简单测试。
深入了解
开发管道技术原因:
- 降低RTT的延迟成本(补:服务器明明可以处理更多,就是因为传输慢导致的请求少)
- 改进Redis服务器上每秒执行的总操作数。为什么能改进呢?
1、在不使用流水线操作的情况下,服务器read()和write()的系统调用过程中,上下文切换是很耗性能的。
2、当使用管道时,通常单个read()系统调用可以读取许多命令,并通过单个write()系统调用递送多个回复。
官网的Pipelining VS Scripting???待学习~