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模式主要适用于那些对消息可靠性要求不高的应用场景。

相关推荐
qq_3422958217 分钟前
c++怎么获取文件的压缩比例信息_Windows压缩卷特性【详解】
jvm·数据库·python
weixin_4585801219 分钟前
CSS如何控制列表间距_使用padding-left与盒模型
jvm·数据库·python
m0_6178814220 分钟前
Tailwind CSS如何实现固定定位布局_使用fixed与z-index控制CSS层级
jvm·数据库·python
m0_6742946435 分钟前
Cgo 中正确处理 const char- 类型回调参数的实践方法
jvm·数据库·python
justjinji43 分钟前
Chart.js 4 中实现基于数据极值的垂直线性渐变填充
jvm·数据库·python
小菜同学爱学习1 小时前
夯实基础!MySQL数据类型进阶、约束详解与报错排查
开发语言·数据库·sql·mysql
桌面运维家1 小时前
IDV云桌面vDisk机房课表联动部署方案
大数据·服务器·数据库
m0_684501981 小时前
CSS如何实现左图右文布局_利用float属性与清除浮动
jvm·数据库·python
若兰幽竹1 小时前
【从零开始编写数据库系统:架构设计与实现】第1章 ToyDB全景架构与核心概念
数据库·架构·数据库内核
-XWB-1 小时前
【Oracle】Oracle诊断系列(5/6):统计信息与执行计划——优化器的“大脑”管理
数据库·oracle