Redis之PubSub

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
82 0
|
存储 负载均衡 NoSQL
把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
“表达欲”是人类成长史上的强大“源动力”,恩格斯早就直截了当地指出,处在蒙昧时代即低级阶段的人类,“以果实、坚果、根作为食物;音节清晰的语言的产生是这一时期的主要成就”。而在网络时代人们的表达欲往往更容易被满足,因为有聊天软件的存在。通常意义上,聊天大抵都基于两种形式:群聊和单聊。群聊或者群组聊天我们可以理解为聊天室,可以有人数上限,而单聊则可以认为是上限为2个人的特殊聊天室。
把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
116 1
|
13天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
155 85
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
53 2
数据的存储--Redis缓存存储(二)
|
3月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
85 6
|
11天前
|
缓存 监控 NoSQL
Redis经典问题:缓存穿透
本文详细探讨了分布式系统和缓存应用中的经典问题——缓存穿透。缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致大量请求直接落到数据库上,可能引发数据库崩溃或性能下降。文章介绍了几种有效的解决方案,包括接口层增加校验、缓存空值、使用布隆过滤器、优化数据库查询以及加强监控报警机制。通过这些方法,可以有效缓解缓存穿透对系统的影响,提升系统的稳定性和性能。
|
2月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
2月前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
2月前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
325 22