前言:用了redis也有一段时间了,但是发布与订阅的使用频率也不高,趁着这次空闲,深究下redis的发布与订阅模式。

一、订阅频道和信息发布

功能说明:Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。

订阅例子示意图:下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

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

二、订阅频道结构原理解析

说明:每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构, 结构的 pubsub_channels 属性是一个字典, 这个字典就用于保存订阅频道的信息,其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。

例子示意图:在下图展示的这个 pubsub_channels 示例中, client2 、 client5 和 client1 就订阅了 channel1 , 而其他频道也分别被别的客户端所订阅。

操作:当客户端调用 SUBSCRIBE 命令时, 程序就将客户端和要订阅的频道在 pubsub_channels 字典中关联起来。

示意图:如果客户端 client10086 执行命令 SUBSCRIBE channel1 channel2 channel3 ,那么前面展示的 pubsub_channels 将变成下面这个样子,通过遍历所有输入频道。

结论:通过 pubsub_channels 字典, 程序只要检查某个频道是否为字典的键, 就可以知道该频道是否正在被客户端订阅; 只要取出某个键的值, 就可以得到所有订阅该频道的客户端的信息。

 三、发布信息到频道结构解析

原理说明:当调用 PUBLISH channel message 命令, 程序首先根据 channel 定位到字典的键, 然后将信息发送给字典值链表中的所有客户端。

例子示意图:对于以下这个 pubsub_channels 实例, 如果某个客户端执行命令 PUBLISH channel1 "hello moto" ,那么 client2 、 client5 和 client1 三个客户端都将接收到 "hello moto" 信息,通过遍历订阅频道的所有客户端。

四、退订频道

原理:使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作: 它从 pubsub_channels 字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。

 

以上就是本篇文章的全部了,其中redis还有一种基于模式的订阅与信息发送。带后续补上。

参考链接:https://redisbook.readthedocs.io/en/latest/feature/pubsub.html

最新文章

  1. 探索C#之虚拟桶分片
  2. Linux常用命令集合
  3. pycharm远程上传文件到Linux
  4. Objective-C 学习笔记(1)
  5. <转>DNS服务系列之二:DNS区域传送漏洞的安全案例
  6. crm操作货币实体
  7. css 设置全屏背景图片
  8. CQOI2011分金币&HAOI2008糖果传递
  9. Python之路,Day18 - 开发一个WEB聊天来撩妹吧
  10. iOS-OC命名规范
  11. 什么时候该使用NoSQL存储数据库?
  12. css 实现table 隔行变色
  13. nginx服务器上遇到了acces denied,报错是fastCGI只要好好修改配置就行了
  14. Tsinsen-A1490 osu! 【数学期望】
  15. 使用Nginx搭建本地流媒体服务器
  16. 自学Zabbix3.5.2-监控项item-types监控类型
  17. Python数据分析(一): ipython 技巧!
  18. ROS机器人编程实践----琐碎知识点
  19. HTML基础【5】:表单标签
  20. cordova打开文件系统插件的使用: cordova-plugin-file-opener2

热门文章

  1. configure -help
  2. SpringMVC与uploadify结合进行上传
  3. 用 jQuery.getJSON() 跨域请求 JSON 数据
  4. 八大排序算法 JAVA实现 亲自测试 可用!
  5. nginx搭建静态网站
  6. AcWing 164. 可达性统计
  7. 打包成war包之后如何读取配置文件
  8. 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类
  9. 【docker学习一】CentOS7.5+Docker安装及使用「安装、查看、pull、创建、进入镜像」
  10. Ember报错