Redis设计与实现(七)| 发布 & 订阅

发布与订阅

  • 概述

Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。
通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者( subscriber ):每当有其他客户端向被订阅的频道发送消息 (message)时,频道的所有订阅者都会收到这条消息。

  • 命令使用
# 如果三个客户端都执行了这个,那么三个客户端都是这个频道的订阅者
SUBSCRIBE "news.it"
# 某个客户端发送这个,那么三个订阅者都会收到
PUBLISH "news.it" "hello"

在这里插入图片描述

  • PSUBSCRIBE

这个命令可以让客户端订阅一个模式或多个模式,假设如下图A订阅it,B订阅et,C、D订阅一个ie模式,那么向it频道发送消息,C、D也会收到
通配符中?表示一个占位符,*表示任意个占位符(包括0个),?*表示一个以上占位符

# PSUBSCRIBE可以订阅一个或多个模式,类似于通配符
PSUBSCRIBE "news.?t"

在这里插入图片描述

1.频道的订阅和退订

  • 概述

订阅同一频道的客户端会在redisServer结构中以链表的形式放在pubsub_channels的字典中,如下图
在这里插入图片描述

1.1 订阅频道

  • 加入字典,会遍历输入的所有频道
  • 加入频道的对应键,如果不存在该频道,那么必然不存在键,所以会先在字典中添加键
  • 如果存在频道,那么直接加入队尾

1.2 退订

  • 概述

这个动作就是刚才订阅动作的逆序

UNSUBSCRIBE "频道1" "频道2"

2.模式的订阅和退订

  • 概述

模式订阅和退订会在redisServer的pubsub_patterns属性中,同样也是一个链表,每个节点的结构为pubsubPattern
在这里插入图片描述

  • 实例

在这里插入图片描述

2.1 订阅模式

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

2.2 退订

  • 概述

模式的退订命令PUNSUBSCRIBE是 PSUBSCRIBE命令的反操作:当一个客户端退订某个或某些模式的时候,服务器将在pubsub_patterns链表中查找并删除那些pattern属性为被退订模式,并且client属性为执行退订命令的客户端的pubsubPattern结构。

3.发送消息

  • 概述

当一个Redis客户端执行PUBLISH <channel> <message>命令将消息message发送给频道channel的时候,服务器需要执行以下两个动作:

  1. 将消息message发送给channel频道的所有订阅者。
  2. 如果有一个或多个模式pattern与频道channel相匹配,那么将消息message发送给pattern模式的订阅者。

4.查看订阅消息

  • 概述

PUBSUB命令是Redis 2.8新增加的命令之一,客户端可以通过这个命令来查看频道或者模式的相关信息,比如某个频道目前有多少订阅者,又或者某个模式目前有多少订阅者,诸如此类。

4.1 PUBSUB CHANNELS

  • 概述

PUBSUB CHANNELS <pattern>,子命令用于返回服务器当前被订阅的频道,其中pattern是可选的

  • 不给定模式,那么返回所有被订阅的频道
  • 给定模式,那么就符合模式的所有频道

4.2 PUBSUB NUMSUB

  • 概述

PUBSUB NUMSUB [channel-1 -2 ...-n]子命令,返回对应频道的订阅者数,底层就是通过遍历字典对应的频道名,对应的链表长度

4.3 PUBSUB NUMPAT

  • 概述

PUBSUB NUMPAT子命令用于返回服务器当前被订阅模式的数量。这个子命令是通过返回pubsub patterns链表的长度来实现的,因为这个链表的长度就是服务器被订阅模式的数量,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一个开源的内存数据库管理系统,根据键值存储的方式进行数据存储和读取。它的设计实现相当巧妙。 首先,Redis以C语言编写,无依赖,内存占用低,延迟低,处理高并发请求的能力强。它的设计使得它可以快速处理各种读写操作,非常适合用作缓存服务器。 其次,Redis的核心数据结构是基于键值对的,主要有字符串、列表、集合、有序集合和哈希表。这些数据结构设计简洁高效,支持丰富的操作,可以满足不同场景的需求。例如,列表支持从两端插入和提取元素的操作,集合支持交集、并集和差集的操作,而有序集合则可以进行排名和范围查询等。 此外,Redis还具备持久化和复制功能,保证数据的安全性和可用性。它提供了两种持久化方式:RDB快照和AOF日志。RDB快照可以将数据库状态保存到硬盘上,以便在Redis重启时进行恢复;AOF日志则以追加的方式记录每次写操作,以保证数据的完整性。而复制功能使得可以将数据复制到多台服务器上,以提供更高的可用性和负载均衡。 最后,Redis还提供了丰富的扩展功能,如发布/订阅模式、事务、Lua脚本、管道和集群等。这些功能的设计实现都遵循了简洁、高效、易用的原则,为用户提供了更多的选择和灵活性。 总之,Redis设计实现非常出色,它以高效的内存读写、多种数据结构的支持、持久化和复制功能、丰富的扩展性等优势,成为了一个非常受欢迎和广泛使用的内存数据库管理系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值