Redis 订阅发布(Pub/Sub) 详解 如何使用订阅发布

Pub/Sub (发布订阅)

Redis的**发布订阅(Pub/Sub)**是一种消息传递模式,它允许消息的发送者(发布者)将消息发送到通道,而订阅者则可以订阅一个或多个通道,并接收发布者发送到这些通道的消息。发布订阅模式在实时通信和消息传递系统中非常有用,它可以用于构建聊天应用、实时数据更新、事件通知等场景。

以下是Redis发布订阅功能的主要特点和用法:

  1. 通道(Channel):发布订阅模式通过通道进行消息传递。发布者发布消息到一个或多个通道,而订阅者则可以订阅一个或多个通道以接收相关消息。

  2. 发布(Publish):发布者向指定通道发送消息。一旦发布者发布了一条消息,所有订阅了该通道的订阅者都会接收到这条消息。

  3. 订阅(Subscribe):订阅者可以选择订阅一个或多个通道,以接收发布者发送到这些通道的消息。一旦订阅了某个通道,订阅者将持续接收该通道上的消息。

  4. 模式订阅(Pattern Subscribe):除了普通的通道订阅外,Redis还支持模式订阅,即可以通过订阅模式来匹配多个通道。例如,订阅模式为 "chat:*" 的订阅者将接收到所有以 "chat:" 开头的通道上的消息。

  5. 取消订阅(Unsubscribe):订阅者可以取消订阅一个或多个通道,以停止接收相关通道上的消息。

  6. 消息传递:消息是异步传递的,发布者发布消息后,订阅者可以在稍后的时间接收到该消息。这种方式使得发布者和订阅者之间解耦,从而提高系统的可扩展性和灵活性。

命令

发布消息
复制代码
publish channel message  
订阅消息
复制代码
subscribe channel [channel ...]  
取消订阅
复制代码
unsubscribe [channel [channel ...]]  
example:
bash 复制代码
127.0.0.1:6379> publish sports "test"
(integer) 0
127.0.0.1:6379> publish sports "test2"
(integer) 1
127.0.0.1:6379> publish sports "test3"
(integer) 1
127.0.0.1:6379>
bash 复制代码
127.0.0.1:6379> subscribe sports
1) "subscribe"
2) "sports"
3) (integer) 1
1) "message"
2) "sports"
3) "test2"
1) "message"
2) "sports"
3) "test3"
Reading messages... (press Ctrl-C to quit or any key to type command)
127.0.0.1:6379> unsubscribe sports
1) "unsubscribe"
2) "sports"
3) (integer) 0
按照模式订阅和取消订阅

除了subcribeunsubscribe命令, Redis 命令还支持glob风格的订阅命令 psubscribe 和取消订阅命令 punsubscribe

复制代码
psubscribe pattern [pattern...]
复制代码
punsubscribe [pattern [pattern ...]]  
example
bash 复制代码
psubscribe it*  
查询订阅
查看活跃的频道
复制代码
pubsub channels [pattern]

所谓活跃的频道是指当前频道至少有一个订阅者, 其中[pattern]是可以指定具体的模式

查看频道订阅数
复制代码
pubsub numsub [channel ...]  
查看模式订阅数
复制代码
pubsub numpat
Tips:
  • 客户端在执行订阅命令之后进入了订阅状态, 只能接收subscribe、psubscribe、 unsubscribe、 punsubscribe的四个命令。

  • 发布者和订阅者之间是完全解耦的,它们之间不直接通信,而是通过Redis服务器来中转消息。

  • 新开启的订阅客户端, 无法收到该频道之前的消息, 因为Redis不会对发布的消息进行持久化。

  • 订阅者在断开连接后会自动取消订阅,而重新连接后需要重新订阅才能接收到消息。

  • Redis发布订阅模式并不适合大规模的消息传递,因为Redis是单线程的,如果有大量的订阅者连接到同一个Redis实例,可能会影响到Redis服务器的性能。

  • 发布订阅模式并不保证消息的可靠性传递,即使发布者发布了消息,但订阅者可能会由于网络问题或其他原因而无法接收到该消息。

参考资料:《Redis 开发与运维》

相关推荐
cg50171 小时前
MySQL数据库复杂的增删改查操作
数据库·mysql
虾球xz2 小时前
游戏引擎学习第147天
数据库·学习·游戏引擎
向上的车轮3 小时前
什么是时序数据库?有哪些时序数据库?常见的运用场景有哪些?
数据库·时序数据库
岱宗夫up5 小时前
【Python】Django 中的算法应用与实现
数据库·python·opencv·django·sqlite
比花花解语5 小时前
使用数据库和缓存的时候,是如何解决数据不一致的问题的?
数据库·缓存·数据一致性
QuiteCoder5 小时前
【Linux】软硬连接与动静态库
linux·运维·服务器
꧁༺朝花夕逝༻꧂5 小时前
Linux基础--用户管理
linux·运维
YGGP5 小时前
Redis篇:基础知识总结与基于长期主义的内容更新
数据库·redis·缓存
KINICH ahau5 小时前
数据库1-2章
数据库·oracle
我想吃烤肉肉6 小时前
leetcode-sql数据库面试题冲刺(高频SQL五十题)
数据库·sql·leetcode