为什么要用pipeline批量读写Redis数据

举报
芥末拌个饭吧 发表于 2022/11/16 09:21:14 2022/11/16
【摘要】 说到缓冲区,大家应该都不陌生。在端与端进行数据交互的时候,考虑到两端有速度不匹配的情况,通常会用缓冲区来解决,比如操作系统就有网络缓冲区、客户端缓冲区等。 我们在使用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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。