Redis7--基础篇5(管道、发布订阅)

管道是什么

管道(pipeline)可以一次性发送多条命令给服务端,服务端依次处理完完毕后,通过一条响应一次性将结果返回,通过减少客户端与redis的通信次数来实现降低往返延时时间。pipeline实现的原理是队列,先进先出特性就保证数据的顺序性。

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

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

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

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

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

*Pipeline是为了解决RTT往返时过多的消耗,将命令打包进行一次性发送,对整个Redis的执行不造成其他任何影响*

案例演示

总结

pipeline与原生批量命令的对比

  • 原生批量命令有原子性,pipeline没有原子性
  • 原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令
  • 原生批量命令是服务端实现,pipeline需要服务端和客户端一起实现

pipeline与事务的对比

  • 管道是一次性将多条命令发送到服务器,事务是一条一条的发,事务只有接收到EXEC命令时才会执行
  • 执行事务时,会阻塞其他命令的执行,而执行管道中的命令时不会

pipeline注意事项

  • pipeline缓冲的命令会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令
  • 使用pipeline组装的命令个数不宜太多,不然数据量过大客户端阻塞的时间可能过久,同时服务器端此时也被迫回复一个队列答复,占用很多内存

发布订阅是什么 是一种消息通讯模式,发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递。

Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。

发布订阅的作用

Redis客户端可以订阅任意数量的频道

当有新消息通过PUBLISH命令发送给频道channel1时

发布/订阅其实是一个轻量的队列,只不过数据不会被持久化,一般用来处理实时性较高的异步消息

常用命令

案例演示

开启三个客户端,演示客户端A、B订阅消息,C发布消息

  1. 消息的种类
  2. 消息的频道
  3. 消息的实际内容

演示批量订阅发布


取消订阅

总结

  • 发布的消息在Redis系统中不能持久化,因此,必须先执行订阅,再等待消息发布。如果先发布了消息,那么该消息由于没有订阅者,消息将直接被丢弃。
  • 对于发布者而言,消息是即发即失的,不管接收,也没有ACK机制,无法保证消息的消费成功。
  • Redis5.0版本新增了Stream数据结构,不但支持多播,还支持数据持久化。
相关推荐
fat house cat_2 小时前
【redis】线程IO模型
java·redis
敖云岚3 小时前
【Redis】分布式锁的介绍与演进之路
数据库·redis·分布式
让我上个超影吧5 小时前
黑马点评【基于redis实现共享session登录】
java·redis
懒羊羊大王呀8 小时前
Ubuntu20.04中 Redis 的安装和配置
linux·redis
John Song10 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
Zfox_19 小时前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
呼拉拉呼拉19 小时前
Redis内存淘汰策略
redis·缓存
咖啡啡不加糖1 天前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
MickeyCV1 天前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
肥仔哥哥19301 天前
springCloud2025+springBoot3.5.0+Nacos集成redis从nacos拉配置起服务
redis·缓存·最新boot3集成