redis的发布订阅模式

1.发布订阅模式的结构

结合上图和消息中间件,可以将channel和消息中间件中的topic主题对应起来

2. Redis发布订阅功能

(1)发送消息

Redis采用PUBLISH命令发送消息,其返回值为接收到该消息的订阅者的数量。

(2)订阅某个频道

Redis采用SUBSCRIBE命令订阅某个频道,其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道。

上图 指令说明 subscribe first second 表示订阅者订阅 订阅的 channel,这里可以多个,因为语法中这个是channel[]类型,返回的话,一般是三行式:第一行:subscribe 作为一种回应告诉是订阅,第二行 代表订阅的内容,消息,第三个 订阅的个数

(3)模式匹配

模式匹配功能允许客户端订阅符合某个模式的频道,Redis采用PSUBSCRIBE订阅符合某个模式所有频道,用""表示模式,""可以被任意值代替。

假设客户端同时订阅了某种模式和符合该模式的某个频道,那么发送给这个频道的消息将被客户端接收到两次,只不过这两条消息的类型不同,一个是message类型,一个是pmessage类型,但其内容相同。

(4)取消订阅

Redis采用UNSUBSCRIBE和PUNSUBSCRIBE命令取消订阅,其返回值与订阅类似。

由于Redis的订阅操作是阻塞式的,因此一旦客户端订阅了某个频道或模式,就将会一直处于订阅状态直到退出。在SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE和PUNSUBSCRIBE命令中,其返回值都包含了该客户端当前订阅的频道和模式的数量,当这个数量变为0时,该客户端会自动退出订阅状态

3. redis 发布订阅的原理

每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构, 结构的 pubsub_channels 属性是一个字典, 其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。

比如说,在下图展示的这个 pubsub_channels 示例中, client2 、 client5 和 client1 就订阅了 channel1 , 而其他频道也分别被别的客户端所订阅:

当客户端调用 SUBSCRIBE 命令时, 程序就将客户端和要订阅的频道在 pubsub_channels 字典中关联起来。

发送信息到频道

了解了 pubsub_channels 字典的结构之后, 解释 PUBLISH 命令的实现就非常简单了: 当调用 PUBLISH channel message 命令, 程序首先根据 channel 定位到字典的键, 然后将信息发送给字典值链表中的所有客户端。

比如说,对于以下这个 pubsub_channels 实例, 如果某个客户端执行命令 PUBLISH channel1 "hello moto" ,那么 client2 、 client5 和 client1 三个客户端都将接收到 "hello moto" 信息:

退订频道

使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作: 它从 pubsub_channels 字典的给定频道, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。

4. redis的发布订阅和ActiveMQ的区别

(1)ActiveMQ支持多种消息协议,包括AMQP,MQTT,Stomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持;

(2)ActiveMQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失;

(3)ActiveMQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障。

相关推荐
吠品5 分钟前
高性能JS数组操作:何时选用push、unshift、splice或扩展运算符?
linux·服务器·数据库
洛水水12 分钟前
【Redis入门】一篇详解Redis五大数据结构
数据结构·数据库·redis
woodykissme17 分钟前
日产汽车花键测绘,为什么总踩坑?
数据库·汽车·齿轮·渐开线花键
雨辰AI38 分钟前
从 MySQL 迁移至人大金仓 V9 完整改造指南|分页 / 函数 / 语法兼容全部解决
java·开发语言·数据库·后端·mysql·政务
阿维的博客日记1 小时前
介绍一下Redisson的看门狗机制
java·redis·缓存
Chengbei111 小时前
AI大模型网关存在SQL注入、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·安全·web安全·网络安全·系统安全
zx2859634001 小时前
Laravel 9.x:全面升级与核心特性
数据库
庞轩px1 小时前
第四篇:多级缓存架构——Caffeine + Redis + MySQL 三级协同
java·redis·mysql·读写分离·caffeine·本地缓存
x***r1511 小时前
Redis-x64-3.2.100安装步骤详解(附Redis服务注册与配置)
redis
努力努力再努力wz1 小时前
【MySQL进阶系列】一文打通事务机制:从锁、Undo Log 到 MVCC 与隔离级别
c语言·数据结构·数据库·c++·mysql·算法·github