Redis之PubSub

简介: 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恢复后已经过了要求上报的时效期,

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

目录
相关文章
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
470 0
|
存储 负载均衡 NoSQL
把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
“表达欲”是人类成长史上的强大“源动力”,恩格斯早就直截了当地指出,处在蒙昧时代即低级阶段的人类,“以果实、坚果、根作为食物;音节清晰的语言的产生是这一时期的主要成就”。而在网络时代人们的表达欲往往更容易被满足,因为有聊天软件的存在。通常意义上,聊天大抵都基于两种形式:群聊和单聊。群聊或者群组聊天我们可以理解为聊天室,可以有人数上限,而单聊则可以认为是上限为2个人的特殊聊天室。
把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1915 0
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
1049 25
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
483 1
Redis专题-实战篇二-商户查询缓存
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
1986 3
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
457 32
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
724 85