redis批量操作pipeline管道操作方法
来源:脚本之家
时间:2022-12-31 14:33:33 191浏览 收藏
知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《redis批量操作pipeline管道操作方法》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!
redis | pipeline(管道)
背景
Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
- 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等待服务端响应。
- 服务端处理命令,并将结果返回给客户端。
Redis 客户端与 Redis 服务器之间使用 TCP 协议进行连接,一个客户端可以通过一个 socket 连接发起多个请求命令。每个请求命令发出后 client 通常会阻塞并等待 redis 服务器处理,redis 处理完请求命令后会将结果通过响应报文返回给 client,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行。
Redis本身是基于一个Request一个Response方式的同步请求,正常情况下,客户端发送一个命令,等待Redis服务器返回结果,Redis服务器接收到命令,处理后响应结果给客户端。
无论网络延如何延时,数据包总是能从客户端到达服务器,并从服务器返回数据回复客户端。 这个时间被称之为 RTT (Round Trip Time - 往返时间)。
如果同时需要执行大量的命令,那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read() 和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响了。
什么是流水线(pipeline)
官网:https://redis.io/docs/manual/pipelining/
管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间,而且 Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。
通俗点:pipeline就是把一组命令进行打包,然后一次性通过网络发送到Redis。同时将执行的结果批量的返回回来。
pipeline,将多个命令一次执行,一次发送出去,节省网络时间。 pipeline技术最显著的优势是提高了 redis 服务的性能。
管道技术并不是Redis特有的技术,管道技术往往需要客户端-服务器的共同配合,大部分工作任务其实是在客户端完成,很显然Redis支持管道技术,按照官网的意思,Redis的最低版本就考虑了管道技术的支持性设计。
如下图,多个连续的incr指令,使用pipeline(管道)后,多个连续的incr指令只会花费一次网络来回开销,这个开销会随着n数值的增大,大幅减少网络io开销,从而提升整体服务的性能。管道技术优化的是网络传输的耗时时间。
总结:使用管道技术可以解决多个命令执行时的网络等待,它是把多个命令整合到一起发送给服务器端处理之后统一返回给客户端,这样就免去了每条命令执行后都要等待的情况,从而有效地提高了程序的执行效率,但使用管道技术也要注意避免发送的命令过大,或管道内的数据太多而导致的网络阻塞。
适用场景
如果出现集中大批量的请求时,因为每个请求都要经历先请求再响应的过程,这就会造成网络资源浪费,此时就需要管道技术来把所有的命令整合一次发给服务端,再一次响应给客户端,这样就能大大的提升了 Redis 的响应速度。
要求实时性也没那么高,但是最求高性能,这时候用 pipeline 最好了。
benchmark压测pipeline
使用Redis提供的benchmark对Redis进行性能测试,
如过你是Windows下的Redis,在安装目录下有个redis-benchmark.exe,进入cmd命令模式测试即可。
如果你是在Linux下的redis,在安装目录的src目录下有个redis-benchmark
通过普通方式测试set指令和pipeline方式测试set指令,可以看到Redis服务不同的QPS:
普通set方式,Redis QPS 大概在5.3万左右
当使用pipeline set时,随着管道内并行请求数量的增加,Redis QPS可以达到100万以上
代码测试-python: StrictRedis
#引入模块
#这个模块中提供了StrictRedis对象,⽤于连接redis服务器,并按照不同类型提供 了不同⽅法,进⾏交互操作
from redis import StrictRedis
我们使用 StrictRedis客户端提供的 Pipeline 对象来实现管道技术。首先先获取 Pipeline 对象,再为 Pipeline 对象设置需要执行的命令,最后再使用excute() 方法来统一执行这些命令,代码如下:
from redis import StrictRedis redis_cli = StrictRedis(host="xx", port=xx, password="xx", db=xx, decode_responses=True) import time def main(): t1 = time.time() pipe = redis_cli.pipeline() num = 1 for i in range(100): pipe.set("name_" + str(num), num) pipe.delete("name_" + str(num)) num += 1 pipe.execute() t2 = time.time() print(t2-t1)
接下来我们用普通的命令执行此循环,看下程序的执行时间,代码如下:
def test(): t1 = time.time() num = 10000 for i in range(100): redis_cli.set("test_" + str(num), num) redis_cli.delete("test_" + str(num)) num += 10 t2 = time.time() print(t2 - t1)
从结果可以看出,管道的执行时间是0.165秒,而普通命令执行时间是9.09秒,管道技术要比普通的执行快了 56 倍。
代码测试-java:Jedis使用pipeline
package com.liziba.redis;
import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; import java.io.IOException; public class PipelineTest { public static void main(String[] args) throws IOException { Jedis client = new Jedis("127.0.0.1", 6379); long startPipe = System.currentTimeMillis(); Pipeline pipe = client.pipelined(); pipe.multi(); for (int i = 0; ipipeline注意事项
管道技术虽然有它的优势,但在使用时还需注意以下几个细节:
- 每次pipeline携带数量不推荐过大,否则会影响网络性能
- 如果管道的数据过多可能会导致客户端的等待时间过长,导致网络阻塞
- 发送的命令数量不会被限制,但输入缓存区也就是命令的最大存储体积为 1GB,当发送的命令超过此限制时,命令不会被执行,并且会被 Redis 服务器端断开此链接
- pipeline每次只能作用在一个Redis节点上
- 部分客户端自己本身也有缓存区大小的设置,如果管道命令没有没执行或者是执行不完整,可以排查此情况
参考资料
分布式缓存Redis之Pipeline(管道)
URL: https://blog.csdn.net/u011489043/article/details/78769428
【推荐】Redis精通系列——Pipeline(管道)
参考URL: https://blog.csdn.net/qq_41125219/article/details/120298689
Redis的批量操作是什么?怎么实现的延时队列?以及订阅模式、LRU
参考URL: https://baijiahao.baidu.com/s?id=1687918953043523907
本篇关于《redis批量操作pipeline管道操作方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于数据库的相关知识,请关注golang学习网公众号!
-
234 收藏
-
416 收藏
-
201 收藏
-
342 收藏
-
361 收藏
-
159 收藏
-
164 收藏
-
221 收藏
-
156 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 聪慧的小丸子
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢大佬分享技术文章!
- 2023-02-14 06:49:19
-
- 发嗲的大炮
- 这篇文章真及时,太细致了,受益颇多,收藏了,关注博主了!希望博主能多写数据库相关的文章。
- 2023-01-31 08:09:49
-
- 高挑的电灯胆
- 细节满满,已加入收藏夹了,感谢老哥的这篇技术文章,我会继续支持!
- 2023-01-29 08:29:14
-
- 甜蜜的水壶
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享技术贴!
- 2023-01-11 06:41:13
-
- 难过的玉米
- 这篇技术文章真及时,太全面了,赞 👍👍,已收藏,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-01-06 19:06:13
-
- 现实的睫毛膏
- 好细啊,码住,感谢up主的这篇技术贴,我会继续支持!
- 2023-01-02 10:20:31