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

posted @ 2024-06-11 15:33  *一炁化三清*  阅读(16)  评论(0编辑  收藏  举报