Redis发布与订阅

命令介绍

Redis的发布与订阅由PUBLISH、SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE。

  1. PUBLISH:往频道发送一条消息。
PUBLISH <channel> <msg>
  1. SUBSCRIBE:订阅某一个频道的消息。
  2. UNSUBSCRIBE:取消订阅某一个频道。
  3. PSUBSCRIBE:通过模式订阅频道。
  4. PUNSUBSCRIBE:取消某一个模式。
    概念解释:
  5. 频道:类似消息中间件中topic的概念,订阅频道之后可以收到在该频道上发布的消息,在Redis内部中,频道其实就是channel字典中的key。
  6. 模式:模式是一个类似正则表达式的概念,频道匹配某一个模式时,也会发消息给订阅该模式的客户端。

SUBSCRIBE和UNSUBSCRIBE(订阅和取消)

在redisServer(redis服务器对象)中存在pubsub_channels属性,该属性是一个字典对象,其中字典key为频道名,value为一个链表(由所有订阅该频道的客户端形成)。
假如client1、client2、client3订阅了频道“news.it”,那么就会形成以下架构。
在这里插入图片描述

SUBSCRIBE

那么SUBSCRIBE的行为就很好理解了,当客户端执行以下命令时,服务器将会发生的操作:

SUBSCRIBE "news.other"
  1. 先判断"news.other"作为key是否存在pubsub_channels字典中。
  2. 存在则表示这个频道已经有客户端订阅,那么拿到该频道对应的链表,将节点加到链表尾部。
  3. 如果不存在,表示该频道第一次订阅,以频道名做key,用该客户端为头部节点的链表做value,加入到pubsub_channels字典中。

UNSUBSCRIBE

客户端执行UNSUBSCRIBE时,要找到该频道,并把客户端从链表中移除,如果移除之后链表为空,那么就把该频道表示的键值对在pubsub_channels字典中删除。

PSUBSCRIBE和PUNSUBSCRIBE(模式的订阅和取消)

当用模式去订阅和取消,实际上是在操作redisServer对象的pubsub_patterns属性,该属性是一个链表,聊表对象包含表达式和客户端对象。

PSUBSCRIBE

用模式表达式和客户端产生一个链表节点,加入到pubsub_patterns属性中。

PUNSUBSCRIBE

在链表中移除匹配的节点。

PUBLISH

当客户端执行发布命令时,具体流程如下:

PUBLISH "news.it" "hello"
  1. 取得频道名“news.it”。
  2. pubsub_channels字典中获取该频道对应的客户端链表,遍历该链表,将消息发送该客户端。
  3. 循环pubsub_patterns链表,检查频道名与模式表达式是否匹配,匹配就将消息发送给节点记录的客户端。

发布订阅模型图示

在这里插入图片描述
发布消息到频道“news.et”,那么客户端B、C、D都会受到消息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值