Redis之发布订阅
发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
消息发送者&消息接收者&频道
可以想象这么一个场景。我们抖音、微博关注了哪个博主,当他发布一条文章时,系统就会给我们推送他发布的消息内容。
此时,博主=消息发送者,我们用户=消息订阅者,我们关注博主的这个动作=订阅频道。
当然像抖音等这种大型复杂的功能用redis来实现有些吃力,只能说redis可以实现这么一个功能,一般都会用专门的MQ,像rabbitmq、kafka等。
订阅频道
SUBSCRIBE命令:可以让客户端订阅任意数量的频道,每当有新消息发送到被订阅的频道时,信息就会发送给订阅这个频道的所有客户端。
命令格式:SUBSCRIBE [频道1名称] [频道2名称]
消息传送过程
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 publish 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
为什么要用发布订阅?
熟悉消息中间件的同学都知道,针对消息订阅发布功能,市面上很多大厂使用的是kafka、RabbitMQ、ActiveMQ, RocketMQ等这几种。
redis的订阅发布功能跟这三者相比,相对轻量,针对数据准确和安全性要求没有那么高可以直接使用,适用于小公司。
redis 的List数据类型结构提供了 blpop 、brpop 命令结合 rpush、lpush 命令可以实现消息队列机制,基于双端链表实现的发布与订阅功能
- 双端队列图解
双端队列模式只能有一个或多个消费者轮着去消费,却不能将消息同时发给其他消费者
- 发布/订阅模式图解
redis订阅发布模式,生产者生产完消息通过频道分发消息,给订阅了该频道的所有消费
发布/订阅如何使用?
Redis有两种发布/订阅模式
- 基于频道(Channel)的发布/订阅
- 基于模式(pattern)的发布/订阅
序号 | 命令 | 描述 |
---|---|---|
1 | subscribe channel [channel ... ] | 订阅给定的一个或多个频道 |
2 | unsubscribe channel [channel ... ] | 退订给定的频道,说明:若没有指定channel,则默认退订所有频道 |
3 | publish channel message | 将消息发送给指定频道 channel,返回结果:接收到信息的订阅者数量,无订阅者返回0 |
4 | pubsub channels [argument [atgument ...] ] | 查看订阅与发布系统的状态,说明:返回活跃频道列表(即至少有一个订阅者的频道,订阅模式的客户端除外) |
5 | psubscribe pattern1 [pattern...] | 订阅一个或多个符合给定模式的频道,说明:每个模式以 * 作为匹配符;例如 cn* 匹配所有以cn开头的频道:cn.java、cn.csdn |
6 | punsubscribe [pattern [pattern ...] ] | 退订所有给定模式的频道,说明:pattern 未指定,则订阅的所有模式都会被退订,否则只退订指定的订阅的模式 |
案例
- 开启一个终端,订阅一个频道(订阅端)
127.0.0.1:6379> SUBSCRIBE weibo #订阅一个频道,频道的名字weibo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "weibo"
3) (integer) 1 #等待读取推送的信息
- 另起一个终端发送消息(发送端)
127.0.0.1:6379> PUBLISH weibo "hello weibo" #发布者发送消息到频道
(integer) 1
127.0.0.1:6379> PUBLISH weibo "hello redis"
(integer) 1
127.0.0.1:6379>
- 第一个终端收到消息
127.0.0.1:6379> SUBSCRIBE weibo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "weibo"
3) (integer) 1
1) "message" #消息
2) "weibo" #来自哪个频道
3) "hello weibo" #消息的内容
1) "message"
2) "weibo"
3) "hello redis"
参考
https://blog.csdn.net/w15558056319/article/details/121490953
https://blog.csdn.net/yi_qingjun/article/details/128172464