redis的pipeline---管道技术

1. Redis客户端与server的请求/响应模型

在学习pipeline管道技术之前,首先需要了解redis客户端与服务端是如何通信的。redis的底层协议是RESP(REdis Serialization Protocol), 基于TCP的应用层协议。

Redis客户端与server通信,使用的是客户端-服务器(CS)模式;每次交互,都是完整的请求/响应模式。比如你在客户端执行如下命令

set foo ok

客户端根据RESP协议,将协议串发送给redis-server执行,redis-server执行完成后再同步返回结果,这一来一回就是一次交互,简单,清晰,明了,很容易理解。

假如,我现在要求你删除redis里的一百万个key,你怎么办呢? 你可以在客户端执行一百万次删除操作,这样做一定能够完成要求,但是,这一百万次操作对应着一百万次的交互,客户端发送命令,服务端返回结果。redis确实很快,执行一次删除操作或许只需要几毫秒,但是这几毫秒乘以一百万就不是一个小数字了。

能不能把这一百万个命令一次性的发送到服务端呢?这样,就不需要一百万次交互了,不就节省时间了么?这就是pipeline要做的事情

2. 管道技术

pipeline一次性将多条命令发送给redis,redis在执行结束后一次性返回执行结果。这个过程减少了客户端与服务端的通信次数,进行节省了时间。

前面说把一百万条命令一次性发送给redis,不是一个准确的描述,事实上,不会将这么多的命令一次性发送过去的,因为命令太多,意味着数据量会很大,通信性能降低,反而得不偿失。你应当根据实际情况来控制一次pipeline执行的命令的个数,我的建议是实际测试,找到一个合理的数值。

下面的代码向你演示如何使用管道技术

from redis.client import Redis

r = Redis(host='127.0.0.1', port=6379, db=0, password='198671724zds')
with r.pipeline()as p:
    for i in range(100):
        p.set(f'key_{i}', i)

    p.execute()     # 不要忘记

print(r.get('key_1'))

管道技术不是万能的,不要乱用,只有那些彼此孤立的,无相关性的命令才可以使用管道技术来执行,如果某个命令依赖于前一个命令的执行,那么他们两个就不可以放在pipeline里同时执行。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案