Redis之PubSub

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis之PubSub

消息多播

使用Redis的 list 和 zset 数据结构分别可以实现队列与延时队列的功能,但是这两种实现没有办法做到多播,即一份消息可以让多个消费者消费,

消息多播是生产只需要生产一份消息,中间件负责将消息复制到多个消息队列中,每个消息队列由对应的消费组进行消费,

消息多播是分布式系统常用的一种解耦方式,每个消费组的处理逻辑不同,可以将消费组放在不同的系统中,

image.png

如果消息只有一份的话,则只能将所有的处理逻辑放在同一个系统中,不同的消费组通过内部传递共同使用一份消息。

image.png

PubSub

Redis通过 PubSub 模块支持消息多播,即 PublisherSubscriber (发布/订阅者模式)。

Java使用Jedis演示消息多播:

image.png

可以看到一个发布者发布的消息可以被多个消费者消费到,

需要注意的是生产者和消费者的连接必须使用不同的连接,redis不允许连接在subscribe消息时进行其他操作。

完整代码:https://github.com/qiaomengnan16/redis-demo/tree/main/redis-pub-sub

订阅模式

多主题

消息订阅支持消费者订阅多个主题,即 subscribe 多个主题名称

127.0.0.1:6379> subscribe c1 c2 c3

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "c1"

3) (integer) 1

1) "subscribe"

2) "c2"

3) (integer) 2

1) "subscribe"

2) "c3"

3) (integer) 3

publish给多个主题发送消息


127.0.0.1:6379> publish c1 helloc1

(integer) 1

127.0.0.1:6379> publish c2 helloc2

(integer) 1

127.0.0.1:6379> publish c3 helloc3

(integer) 1

127.0.0.1:6379>

此时可以看到,消费者收到了多个主题的消息。

image.png

模式订阅

如果此时需要新增c4、c5主题的话,客户端又需要重新进行 subscribe 将需要订阅的加入进去,

因此redis提供了 pattern subscribe,这样就可以一次订阅多个主题,即使增加了新主题,消费者也可以立即收到消息。

即 psubscribe c* ,订阅c开头的主题,这样所有c开头的消息,这边都能消费到了。

image.png

127.0.0.1:6379> psubscribe c*

Reading messages... (press Ctrl-C to quit)

1) "psubscribe"

2) "c*"

3) (integer) 1

1) "pmessage"

2) "c*"

3) "c4"

4) "helloc4"

1) "pmessage"

2) "c*"

3) "c5"

4) "helloc5"

消息结构

消费者接收到消息时不单单仅有message一个信息,还有其他几个内容。

  1. data 即消息的内容。
  2. channel 即订阅主题名称。
  3. type 消息类型,取值有 message(普通消息)、subscribe(订阅指令反馈)、psubscribe(模式订阅反馈)、unsubscribe(取消订阅指令反馈)、punsubscribe(取消模式订阅反馈)。
  4. pattern 即当前消息使用哪种模式订阅得到,通过 subscribe 订阅的即为空。

缺点

当生产者发布一个消息时,Redis会找到相应的消费者发送过去,如果没有消费者的话,此时这个消息将被丢弃,

如果有三个消费者,挂掉了一个,另外两个可以正常消费生产者的消息,但是挂掉的那个消费者重连的时候,挂掉期间内的消费,将无法消费到,即丢消息了,

PubSub的消息不会被持久化,因此Redis重启或者宕机,这些消息将会被直接丢弃。

由于PubSub无法保证消息的可靠性,易丢失,在需要保证消息可靠性的消息队列的场景中,基本没有合适的应用场景,

如果需要保证消息的可靠性,Redis5.0新增了Stream数据结构,该结构支持持久化,但是PubSub不是一无是处,适用于一些时效性要求高的场景。

例如Master要求所有的Slave上报一下当前自身的负载,可以用过PubSub发布一条指令,如果有Slave处于宕机状态也没事,

宕机自然无法上传,宕机恢复后也不需要再上传,因为过了时效性,只需后面收到指令时在汇报实时的负载即可,

如果作为指令中介的Redis实例重启或宕机,消息也没必要持久化指令在队列中,因为当Redis恢复后已经过了要求上报的时效期,

也可以用作在线集群间的通信,例如一个节点通知其他节点,给所有在线节点发送一个消息。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
目录
相关文章
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
223 0
|
存储 负载均衡 NoSQL
把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
“表达欲”是人类成长史上的强大“源动力”,恩格斯早就直截了当地指出,处在蒙昧时代即低级阶段的人类,“以果实、坚果、根作为食物;音节清晰的语言的产生是这一时期的主要成就”。而在网络时代人们的表达欲往往更容易被满足,因为有聊天软件的存在。通常意义上,聊天大抵都基于两种形式:群聊和单聊。群聊或者群组聊天我们可以理解为聊天室,可以有人数上限,而单聊则可以认为是上限为2个人的特殊聊天室。
把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
|
4月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
4月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
632 0
|
4月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
168 32
|
4月前
|
缓存 NoSQL Java
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
94 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
|
6月前
|
缓存 监控 NoSQL
Redis--缓存击穿、缓存穿透、缓存雪崩
缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
1045 29
|
6月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
354 16
Redis应用—8.相关的缓存框架
|
5月前
|
人工智能 缓存 NoSQL
Redis 与 AI:从缓存到智能搜索的融合之路
Redis 已从传统缓存系统发展为强大的 AI 支持平台,其向量数据库功能和 RedisAI 模块为核心,支持高维向量存储、相似性搜索及模型服务。文章探讨了 Redis 在实时数据缓存、语义搜索与会话持久化中的应用场景,并通过代码案例展示了与 Spring Boot 的集成方式。总结来看,Redis 结合 AI 技术,为现代应用提供高效、灵活的解决方案。
|
9月前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
356 85