发布订阅
特性
原理:redis-server 维护了一个字典,字典的键就是频道,值则是链表(链表存储订阅该频道的所有客户端)
订阅操作会往字典中 新增 频道-订阅者链表 键值对 或 更新 频道这个键对应的链表值
发布操作会 在字典中查找频道,遍历对应的订阅者链表 发送消息
常见用途:消息队列,网络聊天室,订阅通知
对于复杂场景要借助消息中间件,例如RabbitMQ,Kafka或RocketMQ等
SUBSCRIBE|PSUBSCRIBE|PUBLISH
# 注意:先订阅再发布,不然会错过订阅前发布的消息
# 订阅者1
127.0.0.1:6379> SUBSCRIBE ch1 ch2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
1) "subscribe"
2) "ch2"
3) (integer) 2
# 订阅者2
127.0.0.1:6379> SUBSCRIBE ch1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
# 发布者
127.0.0.1:6379[10]> PUBLISH ch1 "hello ch1"
(integer) 2
127.0.0.1:6379[10]> PUBLISH ch2 "hello ch2"
(integer) 1
# 订阅者1
1) "message"
2) "ch1"
3) "hello ch1"
1) "message"
2) "ch2"
3) "hello ch2"
# 订阅者2
1) "message"
2) "ch1"
3) "hello ch1"
# UNSUBSCRIBE 该命令有设计缺陷,一旦进入订阅模式后就无法再执行命令,而要退出订阅模式只能CTRL+C,此时连客户端一并退出了,客户端一退出,所有订阅都失效(即使再次进入),因此,取消订阅相关的操作都不能执行
# 起码客户端之际进行退订操作是不可行的!!!
# 同理
# 模式支持 glob 风格的正则表达式。
# 每个模式以 * 作为匹配符。
# it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)
# news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
PSUBSCRIBE pattern [pattern ...]
# 同样客户端不可用
PUNSUBSCRIBE
其他命令
PUBSUB
#redis#Redis 文章被收录于专栏
此专栏由于更新观看不便,不会保持及时更新,最新更新见计算机合集专栏https://www.nowcoder.com/creation/manager/columnDetail/04yp33