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 开发与运维》

相关推荐
Blossom i40 分钟前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
雾时之林2 小时前
Linux--软件管理、源码包安装
linux·服务器·数据库
江南风月2 小时前
如何使用WGCLOUD实现智能运维
运维·zabbix·运维开发·prometheus
thesky1234562 小时前
智能体面试准备(二十六):Agent 成本工程——模型路由、缓存、预算控制与大小模型分工
缓存·llmops·智能体·模型路由·成本工程·预算控制·小模型分工
xiaoxiangsiyan2 小时前
HCIA 网络技术基础核心模块详解
运维·网络·网络协议·tcp/ip·运维开发·网络基础
老纪的技术唠嗑局3 小时前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
CLOUD ACE3 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
MuMuMu12233 小时前
工业园区 VOCs 绿岛集中治理:越华环保集团项目技术方案与工程实践
大数据·运维
AI大模型-小雄4 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex
少晓年4 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql