Redis发布订阅(广播)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 学校时期,学级主任为了提高整个学级学生的写作能力,会要求我们订阅一些周刊例如《读者》《意林》。

生活化场景重现

学校时期,学级主任为了提高整个学级学生的写作能力,会要求我们订阅一些周刊例如《读者》《意林》。

简单模式:

同学各自订阅,然后出版商会把周刊递交给邮局【频道channel】,然后邮局会在递交给所订阅整个周刊的同学们【(订阅者/客户端)client】

复杂模式

出资班费后班级【频道channel】订阅,然后这个周刊,班级内的同学【(订阅者/客户端)client】都可以阅读

img

img

底层实现

服务器将所有的订阅关系都保存在服务器状态的pubsub_channels属性里面,在模式订阅里服务器也将所有模式的订阅关系都保存在服务器状态的pubsub_patterns属性里面。

struct redisServer {
   
   
    // ...
    // 保存所有模式订阅关系
    list *pubsub_patterns;
    // ...
}

pubsub_patterns 属性是一个链表,链表中的每个节点都包含着一个pubsubPattern结构,这个结构的pattern属性记录了被订阅的模式,而client属性则记录了订阅模式的客户端。

typedef struct pubsubPattern {
   
   
    // 订阅模式的客户端
    redisClient *client;
    // 被订阅的模式
    robj * pattern;
} pubsubPattern;

图片描述

每当客户端执行PSUBSCRIBE命令订阅某个或某些模式的时候,服务器会对每个被订阅的模式执行以下两个操作:

  1. 新建一个pubsubPattern结构,将结构的pattern属性设置为被订阅的模式(如:music.*),client 属性设置为订阅模式的客户端。
  2. pubsubPattern结构添加到pubsub_patterns链表的表尾。

实战演练 Gif动画

第一层窗口:发布订阅窗口

第二层窗口:1:订阅 it.new 频道、2:订阅 it.photo 频道

第三层窗口:1:订阅 it. 模式频道、2: 订阅 it 模式频道

img

应用场景

简单的应用场景的话, 以门户网站为例, 当编辑更新了某推荐板块的内容后:

CMS发布清除缓存的消息到channel (推送者推送消息)

门户网站的缓存系统通过channel收到清除缓存的消息 (订阅者收到消息),更新了推荐板块的缓存

Redis 发布订阅缺陷

作为我个人角度来看这个redis发布订阅,觉得挺鸡肋的,首先客户端必须得订阅,发布端才能发布信息,否则发布信息就报异常的错误。还有客户端一直要保持在线才能收到消息,和设计模式中的观察者模式极为相似。 所以总结一下,redis订阅模式有以下缺陷

1、redis系统的稳定性有关 对于旧版的redis来说,如果一个客户端订阅了某个或者某些频道,但是它读取消息的速度不够快,那么不断的积压的消息就会使得redis输出缓冲区的体积越来越大,这可能会导致redis的速度变慢,甚至直接崩溃。也可能会导致redis被操作系统强制杀死,甚至导致操作系统本身不可用。新版的redis不会出现这种问题,因为它会自动断开不符合client-output-buffer-limit pubsub配置选项要求的订阅客户端

2、数据传输的可靠性 任何网络系统在执行操作时都可能会遇到断网的情况。而断线产生的连接错误通常会使得网络连接两端中的一端进行重新连接。如果客户端在执行订阅操作的过程中断线,那么客户端将会丢失在断线期间的消息,这在很多业务场景下是不可忍受的。

所以如果我碰到类似的业务的话,我也不会选择redis的发布订阅模式,我会选择:rabbitMQ,rockedMQ,activitedMQ 等消息中间件

常用命令

下表列出了 redis 发布订阅常用命令:

序号 命令及描述
1 PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道。
2 PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态。
3 PUBLISH channel message 将信息发送到指定的频道。
4 PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道。
5 SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道的信息。
6 UNSUBSCRIBE [channel [channel ...]] 指退订给定的频道。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
存储 缓存 NoSQL
聊聊 Redis 的高级特性之一: 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 图中,消费者1和消费者2 订阅了 Redis 服务的频道 channel ,当生产者通过 PUBLISH 命令发送给频道 channel 时, 这个消息就会被发送给订阅它的两个客户端。
聊聊 Redis 的高级特性之一: 发布订阅
|
7月前
|
消息中间件 移动开发 NoSQL
Redis 协议 事务 发布订阅 异步连接
Redis 协议 事务 发布订阅 异步连接
|
7月前
|
NoSQL Redis
Redis之发布订阅
Redis之发布订阅
|
2月前
|
NoSQL Redis
Redis 发布订阅
10月更文挑战第18天
33 1
Redis 发布订阅
|
3月前
|
消息中间件 存储 NoSQL
18)Redis 的发布订阅模型
18)Redis 的发布订阅模型
41 0
|
7月前
|
存储 NoSQL Redis
Redis 简介 + Python 操作发布订阅
Redis 简介 + Python 操作发布订阅
110 0
|
7月前
|
消息中间件 设计模式 缓存
Redis发布订阅:美丽的陷阱与不宜之境
Redis发布订阅:美丽的陷阱与不宜之境
716 1
|
消息中间件 缓存 NoSQL
探索Redis发布订阅与消息队列:构建实时消息通信系统
本篇深入探讨了Redis的发布订阅模式和消息队列功能,展示了如何使用这两个特性构建实时消息通信系统。我们首先介绍了Redis的发布订阅模式,演示了如何通过PUBLISH命令将消息发布到特定频道,并使用SUBSCRIBE和UNSUBSCRIBE命令进行订阅和取消订阅操作。
593 0
|
7月前
|
消息中间件 NoSQL Redis
Redis发布订阅
【1月更文挑战第7天】 消息队列 Redis 发布订阅(publsub)是一种消息通信模式︰发送者(pub)发送消息,订阅者(sub)接收消息。微信、微博、关注系统! Redis客户端可以订阅任意数量的频道。
206 6
|
7月前
|
消息中间件 NoSQL Java
硬核 | Redis Pub/Sub 发布订阅与宅男有什么关系?
硬核 | Redis Pub/Sub 发布订阅与宅男有什么关系?
85 0
下一篇
DataWorks