首页 > 数据库 >Redis管道

Redis管道

时间:2023-12-05 23:22:36浏览次数:27  
标签:Pipeline Redis 命令 管道 执行 服务端 客户端

背景

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤:

1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应。

2 服务端处理命令,并将结果返回给客户端。

上述两步称为:Round Trip Time(简称RTT,数据包往返于两端的时间),问题笔记最下方

image-20231205201634359

如果同时需要执行大量的命令,那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read()和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响了,性能不太好,o(╥﹏╥)o

如何优化频繁命令往返造成的性能瓶颈——管道

Pipeline是为了解决RTT往返时,仅仅是将命令打包一次性发送,对整个Redis的执行不造成其它任何影响。是批处理命令变种优化措施类似于Redis的原生批命令(mget和mset)

案例

image-20231205203400719

小结

Pipeline与原生批量命令对比:

  1. 原生批量命令是原子性(如mset,mget),Pipeline是非原子性。

  2. 原生批量命令一次只能执行一种命令,Pipeline支持批量执行不同的命令。

  3. 原生批量命令是服务端实现,而Pipeline需要服务端与客户端共同完成。

Pipeline与事物对比:

  1. 事务具有原子性,管道不具有原子性。

  2. 管道一次性将多条命令发送到服务器,事务是一条一条的发,事务只有在接收到exec命令后才会执行,管道不会。

  3. 执行事务时会阻塞其他命令的执行,而执行管道中的命令时不会。

使用PIpeline注意事项:

  • PIpeline缓冲的指令只是会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令。

  • 使用PIpeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能过久,同时服务端此时也被迫恢复一个队列的答复,占用很多内存。

标签:Pipeline,Redis,命令,管道,执行,服务端,客户端
From: https://www.cnblogs.com/chenyonghua/p/17878582.html

相关文章

  • springboot整合redis
    spring:redis:port:6379host:192.168.88.101password:111111lettuce:pool:max-active:8max-wait:-1msdatabase:0yml配置(单机版)spring:redis:password:111111lettuce:cluster:refr......
  • i/o重定向与管道
    第六章i/o重定向与管道 i/o重定向:I/O重定向是指改变程序的标准输入、标准输出和标准错误输出的默认设备,将其与其他设备或文件进行关联。通过I/O重定向,我们可以将程序的输入从键盘转向文件或其他设备,将程序的输出和错误信息输出到文件或其他设备而不是屏幕上。标准输入重定......
  • I/O重定向与管道
    I/O重定向date显示出当前时间tty显示进程运行终端date>date.txt结果写入date.txtdate>/dev/pts/4将终端3的date输出结果重定向到终端4执行passwd命令改密码时,系统会产生一个进程,其PID为10277passwdpsaux|greppasswd在/proc虚拟文件系统中,可以查看内核与进程的......
  • .NET——中间件与管道
    中间件:中间件是什么,可以干什么:在.NET中,中间件是一种用于处理HTTP请求和响应的组件。它们将请求传递给下一个中间件或终端处理程序,并允许开发人员在请求处理的不同阶段执行自定义操作。以下是一些常见的.NET中间件:AuthenticationMiddleware:用于认证用户身份并授权访问......
  • redis 规则设置
    必须明确应用场景,1)作为缓存还是存储;2)数据丢失对应用的影响解释:与持久化关系数据库(MySQL通过Redo可保证数据不丢)不同,Redis在故障时会丢失分钟级别数据,业务必须确保不会受到影响禁止命令:keys、flushall、flushdb;针对大key禁止命令:hgetall,hkeys,smembers,lindex0-1解释1:Redis为......
  • redisTest
    importjava.util.Map;importredis.clients.jedis.Jedis;publicclassredisTest{/***@paramargs*/publicstaticJedisjedis;publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubjedis=newJedis(&qu......
  • 七、标准IO和管道
    七、标准IO和管道重定向I/O,为什么要进行重定向?可以帮我们解决什么问题?使用管道符连接命令1、I/O输入输出显示器是Linux系统中创建默认的输出设备I/O:input和output重定向:将原本标准设备,替换为我们想要的内容目的:在shell脚本中对脚本输出的内容进行处理,屏蔽不......
  • redis2
    redis为什么这么快1、纯内存操作,避免io操作2、单线程架构(数据读写)避免了线程,进程间切换3、使用了io多路复用网络模型-io模型-同步io-异步io-io多路复用-poll-epoll-select读写都是单线程,不需要锁,不会......
  • 【Azure Redis】中国区Redis在东三区的资源无法在通过门户上与北三区资源之间建立灾备
    问题描述为应用启用灾备管理,在北三区建立了一个AzureRedis,同时,在东三区也建立了一个同样的Prem级Redis服务。但是在建立灾备(DR:DiseaseRecovery)时候,却无法选择东三区的资源。 问题解答目前(2023-12-05),中国Azure的东三区是作为北三区的AvailableZone存在的,普通的用户是......
  • java 操作redis更新子节点数据
    1.引入Jedis依赖确保在你的Java项目中引入了Jedis依赖。你可以使用Maven添加以下依赖:<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.11.1</version></dependency>2.示例代码importredis......