hooyantsing's Blog

30_Redis订阅发布

字数统计: 708阅读时长: 2 min
2020/08/19

30 Redis订阅发布

Redis最新超详细版教程通俗易懂

Redis发布订阅

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。微信、微博、关注系统。

Redis客户端可以订阅任意数量的频道。

订阅/发布消息图:

  • 消息发布者
  • 队列
  • 消息订阅者

7385e3e129d08606a21445cb40478ba5.png
下图展示了频道 channel1 ,以及订阅这个频道的三个客户端—client2、client5和client1之间的关系。

当有新消息通过 PUBLISH 命令发送给频道 channel1 时,这个消息就会被发送给订阅它的三个客户端:

da6b1776cf057f022ce41ee3e81c39bf.png

5cebba130a62860727995665b21f369e.png

命令

这些命令被广泛用于构建即时通讯应用,比如网络聊天室(chatroom)和事实广播、实时提醒等。

410187da813d79c7cc8b5fd7d8269003.png

消息订阅者:

通过 SUBSCRIBE 订阅频道:

06cb5b1b3d8947db3e53a5c52fe6361f.png

消息发布者:

通过 PUBLISH 向频道发布消息:

8a0a35279083b9a6a4b9eef6770c08f6.png

那么 消息订阅者 将会收到频道里的消息:

cc441e302457e802d6a57b1f3a48dffa.png

原理

Redis 是使用C实现的,通过分析Redis源码里的 pubsub.c 文件,了解发布和订阅机制的底层实现,籍此加深对 Redis 的理解。

Redis 是通过 PUBLISHSUBSCRIBEPSUBSCRIBE 等命令实现发布和订阅功能。

通过 SUBSCRIBE 命令订阅某频道后,redis-server 里维护了一个字典,字典的键就是一个个 channel,而字典的值则是一个链表,链表中保存了所有订阅这个 channel 的客户端。SUBSCRIBE 命令的关键,就是将客户端添加到了给定的 channel 的订阅链表中。

51816d73ad13abbb53dd3443b352b27b.png

通过 RUBLISH 命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。

Pub/Sub从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。

使用场景:

  1. 实时消息系统。举个例子:斗鱼里面的全站消息,实际上就是当你注册了一个新账号,那么新账号就默认关注了 “全站消息” 这个频道。当网站管理者向全站消息里发布了一条消息,那么全站的用户都将收到这个消息。
  2. 实时聊天。即发布者也是订阅者。
  3. 订阅、关注系统。
    稍微复杂的场景我们就会使用消息中间件 MQ
CATALOG
  1. 1. 30 Redis订阅发布
    1. 1.1. Redis发布订阅