为什么要用pipeline批量读写Redis数据
前言
说到缓冲区,大家应该都不陌生。在端与端进行数据交互的时候,考虑到两端有速度不匹配的情况,通常会用缓冲区来解决,比如操作系统就有网络缓冲区、客户端缓冲区等。
我们在使用Redis时同样也会有这样的场景。比如我们需要批量写数据到到Redis,就可以用到缓冲区。这篇我们来说说类似于缓冲作用pipeline的用法。
pipeline和普通命令的区别
我们都知道,Redis处理读写请求采用单线程的做法。普通做法客户端执行命令的步骤是:
发送命令 --> 命令排队等待 --> 命令执行 --> 结果返回
通俗来说就是客户端发出一个个的请求,等待Redis处理,然后Redis一个个的处理并返回结果。
请求不密集的时候,Redis压力不大。但是如果瞬间有大量的写请求,就会影响访问的性能。有些数据类型可批量处理请求,比如mset、hmset等。但大部分的命令都是单个处理的,因此pipeline就派上用场了。
pipeline使用后,客户端就不再是发送一个命令,接收一次结果了。
多个命令进pipeline --> redis一个个执行命令 --> 批量返回结果
看下图,客户端先是把一批的命令都暂存到缓冲区中,然后一次性的将所有命令发送到Redis服务端。服务端再将命令都执行了,最后一次性的返回结果。
pipeline的好处在于,可大大减少网络IO的次数,降低延迟,提高访问的性能。当然,为了防止Redis的缓冲区内存增大,我们可控制好pipeline命令的数量。
说完了pipeline和普通命令的区别,下面就看看Python是如何使用pipeline的。
Python使用pipeline操作Redis
先来看看pipeline是如何写数据的,看例子好理解:
import redis
pool = redis.ConnectionPool(host="{host}", port={port}, db="{db}")
redis = redis.Redis(connection_pool=pool, decode_responses=True)
# 新建一个Redis管道
pipe = red.pipeline()
# 批量写入一部分数据
data = ['a1', 'a2', 'a3', 'a4']
for i in data:
pipe.hset('ahash', i, 100)
res = pipe.execute()
批量读数据,示例:
import redis
pool = redis.ConnectionPool(host="{host}", port={port}, db="{db}")
red = redis.Redis(connection_pool=pool, decode_responses=True)
data = ['a1', 'a2', 'a3', 'a4']
with red.pipeline(transaction=False) as pipe:
for i in data:
pipe.hget('ahash', i)
res = pipe.execute()
小结
这节讲了Redis中pipeline的原理及使用示例,pipeline类似一个缓冲区,能有效降低IO次数,提升效率。我们在批量读写大量Redis数据时,可以用pipeline来提升访问性能。
- 点赞
- 收藏
- 关注作者
评论(0)