为什么要用pipeline批量读写Redis数据
【摘要】 说到缓冲区,大家应该都不陌生。在端与端进行数据交互的时候,考虑到两端有速度不匹配的情况,通常会用缓冲区来解决,比如操作系统就有网络缓冲区、客户端缓冲区等。
我们在使用Redis时同样也会有这样的场景。比如我们需要批量写数据到到Redis,就可以用到缓冲区。这篇我们来说说类似于缓冲作用pipeline的用法。
前言
说到缓冲区,大家应该都不陌生。在端与端进行数据交互的时候,考虑到两端有速度不匹配的情况,通常会用缓冲区来解决,比如操作系统就有网络缓冲区、客户端缓冲区等。
我们在使用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来提升访问性能。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)