深入浅出Redis(九):Redis的发布订阅模式

简介: 深入浅出Redis(九):Redis的发布订阅模式

引言

Redis是一款基于内存的键值对数据库,提供了多种数据结构存储数据,存取数据的速度还非常快,除了这些优点它还提供了其他特色功能,比如:管道、lua脚本、发布订阅模型

本篇文章主要描述发布订阅模型,将围绕发布订阅深入浅出的描述发布订阅的使用和数据结构实现原理

发布订阅

发布订阅是一种消息通信模式

发送者(pub)发送消息到频道(channel),订阅者(sub)接收频道的消息

其中发送者、订阅者都是客户端,频道维护在服务端

Redis提供订阅频道、模式两种方式,模式可以理解为匹配正则的频道 (比如 new.it 匹配 new.*模式)

image.png

使用命令

subscribe channel...订阅一个或多个频道

unsubscribe channel...退订一个或多个频道

psubscribe pattern...订阅一个或多个符合模式的频道 (比如 new.it 符合new.*模式)

publish channel message将消息发送到指定频道

pubsub subcommand argument...查看订阅与发布系统状态

punsubscribe pattern...退订所有给定模式的频道

使用

#testchannel为频道 hello!caicai为消息
 #客户端A发送消息 返回0 表示0个客户端接收 此时还没订阅频道   
 127.0.0.1:6379> publish testchannel hello!caicai
 (integer) 0
 
 #客户端B订阅testchannel频道
 127.0.0.1:6379> subscribe testchannel
 Reading messages... (press Ctrl-C to quit)
 1) "subscribe"
 2) "testchannel"
 3) (integer) 1
 
 #客户端A发送消息 返回1 说明1个客户端接收到 
 127.0.0.1:6379> publish testchannel hello!caicai
 (integer) 1
 
 #客户端B收到消息
 1) "message"
 2) "testchannel"
 3) "hello!caicai"
 
 #客户端C使用模式进行订阅 订阅符合test*模式的频道(*为通配) testchannel符合test*
 127.0.0.1:6379> psubscribe test*
 Reading messages... (press Ctrl-C to quit)
 1) "psubscribe"
 2) "test*"
 3) (integer) 1
 
 #客户端A发送消息 返回2 说明2个客户端接收到 
 127.0.0.1:6379> publish testchannel hello!caicai2
 (integer) 2
 
 #客户端B显示
 1) "message"
 2) "testchannel"
 3) "hello!caicai2"
 
 #客户端C显示
 1) "pmessage"
 2) "test*"
 3) "testchannel"
 4) "hello!caicai2"

原理

subscribe channel 订阅频道维护字典,K为频道,V为链表,节点为订阅频道的客户端;客户端订阅或退订频道则是在字典中添加/删除

psubscribe pattern 订阅模式维护链表,节点为模式名与客户端;客户端订阅或退订模式频道则是在链表上遍历添加/删除

publish 发送消息时,先找到字典中的K频道遍历链表发送消息,再去模式中的链表上遍历频道是否与节点上的模式名匹配,匹配则发送消息给对应客户端

  • pubsub查看订阅信息则是通过字典和链表获取到信息
  • pubsub channels (pattern)则是找到字典中的频道返回链表长度表示这个频道的订阅数量,如果携带了pattern则返回满足匹配的频道
  • pubsub numsub channels 返回字典中频道对应的链表长度
  • pubsub numpat pattern模式数量,返回模式链表长度

通过发布订阅模型能够实现订阅、通知系统,哨兵模式中也使用发布订阅模式,哨兵订阅主节点,主节点收到某个哨兵命令后发布返回信息,各个哨兵收到消息后能够感知其他哨兵的存在

总结

本文围绕Redis的发布订阅模型,深入浅出描述了发布订阅模型的使用、发布订阅模型实现的数据结构以及使用发布订阅模型的场景

发布订阅是一种通信模式,哨兵通过发布订阅来与节点进行交流,发布订阅能够实现关注、订阅系统的实现

发布订阅的两种方式订阅频道、模式是通过维护频道字典和模式链表实现的,其中发送消息会先遍历字典和链表找出匹配频道的订阅客户端进行发送,其他pubsub相关查看订阅信息命令都是从频道字典和模式链表中获取信息

最后

  • 参考资料
  • 《Redis深度历险》
  • 《Redis设计与实现》


相关文章
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
1115 5
|
9月前
|
存储 运维 NoSQL
Redis集群模式
Redis集群是一种分布式存储方案,旨在解决数据存储容量不足的问题。它通过将数据分片存储在多个节点上,实现数据的横向扩展。常见的分片算法包括哈希求余、一致性哈希和哈希槽分区。其中,Redis采用哈希槽分区算法,将数据均匀分配到16384个槽位中,每个分片负责一部分槽位。当节点故障时,集群通过故障检测和主从切换机制,确保服务的高可用性。集群还支持自动的数据迁移和负载均衡,保障系统稳定运行。
|
存储 运维 NoSQL
Redis Cluster集群模式部署
Redis Cluster集群模式部署
377 4
|
缓存 运维 NoSQL
Redis主从模式部署
Redis主从模式部署
195 4
|
运维 监控 NoSQL
Redis Sentinel哨兵模式部署
Redis Sentinel哨兵模式部署
507 2
|
NoSQL Java Redis
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
464 0
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
420 0
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
593 4
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
224 2
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
430 1