Redis发布、订阅模式(Pub/Sub)详解

Redis发布、订阅模式(PUB-SUB)详解

Redis的发布订阅(Pub/Sub)机制是一种消息通信模式,用于消息的广播。它允许多个客户端订阅(Subscribe)特定的频道(Channel),并在消息发布者(Publisher)向频道发布消息时,所有订阅该频道的客户端都能接收到消息。

工作原理

  1. 通信方式

    • Redis的发布-订阅模式基于消息的发布与订阅。消息由发布者发布到频道(Channel),而订阅者则可以订阅一个或多个频道,接收发布者发送到这些频道的消息。
  2. 频道(Channel)

    • 频道是消息的通道,发布者将消息发送到特定的频道,订阅该频道的订阅者会接收到这些消息。频道在Redis中是一个由字符串标识的名字。
  3. 发布消息

    • 发布者通过向指定频道发送消息来发布消息。多个订阅者可以订阅同一个频道,发布者发送的消息将被所有订阅了该频道的订阅者接收。
  1. 订阅消息
  • 订阅者通过执行订阅命令来订阅一个或多个频道。一旦订阅成功并且频道有消息发布,订阅者将接收到这些消息。
  1. 取消订阅
    • 订阅者可以随时取消对某个或所有频道的订阅,取消订阅后将不再接收该频道的消息。

使用方法

  1. 发布消息
    • 使用Redis的 PUBLISH 命令向指定的频道发布消息。

      redis 复制代码
      PUBLISH channel message

      其中,channel 是频道的名称,message 是要发送的消息内容。

  1. 订阅频道

    • 使用Redis的 SUBSCRIBE 命令订阅一个或多个频道。

      redis 复制代码
      SUBSCRIBE channel [channel ...]
    • Redis还支持模式订阅(Pattern Subscription),可以使用 PSUBSCRIBEPUNSUBSCRIBE 命令订阅和取消订阅模式。

    • 例如 PSUBSCRIBE news* 可以订阅所有以 news 开头的频道。

    • 订阅成功后,Redis客户端将进入订阅模式,等待接收频道发布的消息。

    • 返回值为当前订阅的频道数量。

  2. 取消订阅

    • 使用Redis的 UNSUBSCRIBE 命令取消对一个或多个频道的订阅。

      redis 复制代码
      UNSUBSCRIBE [channel [channel ...]]

      如果不指定频道名称,则取消所有频道的订阅。

Tips:

  1. 消息丢失
    • 如果订阅者在消息发布之前或之后才订阅或取消订阅某个频道,那么该订阅者可能会错过在它未订阅期间发布的消息。也就是说,只有在订阅者实时在线并且订阅了频道的情况下才能接收到消息。
  1. 无持久化
    • Redis的Pub/Sub模式不会持久化消息,也就是说,消息在发布后立即被传递给当前在线的订阅者,之后不会保存。如果订阅者断开连接或Redis服务器重启,已发布但未接收的消息将会丢失。


  1. 无确认机制
    • Pub/Sub模式中没有类似于消息队列中的确认机制,没有办法确保消息一定被所有订阅者成功处理。例如,如果某个订阅者在处理消息时崩溃,消息不会重新发送给该订阅者。
  1. 非事务性
    • 消息的发布和接收是非事务性的。发布者发布消息后,不会等待订阅者的应答,即便订阅者在消息发布后立即掉线,发布者也不会知道。

由于这些无保证性,Redis的Pub/Sub模式主要适用于那些对消息可靠性要求不高的应用场景。

相关推荐
吠品1 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
SelectDB2 小时前
Apache Doris Variant 动态 JSON 实战教程:从建表到跑通 100M Agent 日志查询
数据库
sg_knight2 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
星空露珠3 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
踏月的造梦星球4 小时前
DM8 DSC 单机双实例部署
运维·开发语言·数据库
Database_Cool_4 小时前
企业级多模态分析计算引擎选型:首选 AnalyticDB MySQL 向量 + SQL + 实时一体化方案
数据库·sql·mysql
SelectDB4 小时前
从 Oracle、Hadoop 到 Apache Doris:哥瑞利泛半导体智能制造数据平台实践
数据库
ihuyigui4 小时前
海外签收通知短信接口
android·java·开发语言·前端·数据库·后端
海棠Flower未眠4 小时前
SpringBoot 消息死信队列(荣耀典藏版)
java·数据库·spring boot
Y3815326624 小时前
SERP API + Redis 缓存层:4 种方案对比与选型
数据库·redis·缓存