Redis实现消息的发布订阅原理分析
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Redis实现消息的发布订阅原理分析》,聊聊订阅、发布、Redis消息,我们一起来看看吧!
一、什么是发布和订阅
- Redis 发布订阅 (pub/sub) 是一种
消息通信模式
:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。 特点:
Redis 客户端可以订阅任意数量的频道。- 这就好比粉丝们关注了我,当我写完文章发布的时候,你们打开CSDN也会接收到我写的文章。此时,我就是发送者(pub);粉丝们就是订阅者(sub)。
结构图如下:发布者发送自己的消息到redis服务器,订阅者从redis服务器中获取发布者发布的消息
二、Redis的发布和订阅
为了方便后面讲解发布和订阅命令行的使用,我先用两张图简单的介绍redis实现发布和订阅的整体流程。
客户端可以订阅频道如下图:
当给这个频道发布消息后,消息就会发送给订阅的客户端,如下图:
三、redis 发布订阅常用命令
下表列出了 redis 发布订阅常用命令:
四、命令实战
在演示redis消息的发布和订阅之前,我们需要打开两个客户端,一个充当消息发布者,一个充当消息接受者。
1、基本使用
先用一个客户端订阅频道csdn_blog
,等待消息:
127.0.0.1:6379> SUBSCRIBE csdn_blog Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "csdn_blog" 3) (integer) 1
接着一个客户端在csdn_blog
频道发送消息hello,cabbage
:
127.0.0.1:6379> PUBLISH csdn_blog "hello,cabbage" (integer) 1
最后接受者接收到消息:
1) "message"
2) "csdn_blog" # 接收消息所在的频道
3) "hello,cabbage" # 接收到的消息
2、订阅符合要求的频道
订阅以csdn
开头的频道,*
表示任意字符
127.0.0.1:6379> PSUBSCRIBE csdn* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "csdn*" 3) (integer) 1
发布者在两个频道发布消息:
127.0.0.1:6379> PUBLISH csdn_blog "hello" (integer) 1 127.0.0.1:6379> PUBLISH csdn_sing "sing" (integer) 1
最后订阅者接收到两个频道的消息:
1) "pmessage"
2) "csdn*"
3) "csdn_blog"
4) "hello"
1) "pmessage"
2) "csdn*"
3) "csdn_sing"
4) "sing"
3、查看活跃频道
订阅者订阅两条频道:
127.0.0.1:6379> SUBSCRIBE csdn_one csdn_two Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "csdn_one" 3) (integer) 1 1) "subscribe" 2) "csdn_two" 3) (integer) 2
发布者在三条频道发送消息:
127.0.0.1:6379> PUBLISH csdn_one "one" (integer) 1 127.0.0.1:6379> PUBLISH csdn_two "two" (integer) 1 127.0.0.1:6379> PUBLISH csdn_three "three" (integer) 0
在发布者客户端显示活跃的频道:
127.0.0.1:6379> PUBSUB channels 1) "csdn_one" 2) "csdn_two"
五、发布订阅原理
每个Redis服务器进程都维持着一个表示服务器状态的redis.h
/redisServer
结构, 结构的pubsub_channels
属性是一个字典, 这个字典就用于保存订阅频道的信息,其中,字典的键为正在被订阅的频道
, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端
。
1、订阅频道原理
假设订阅频道前有如下图所示的频道和订阅该频道的客户端:从图中可以清楚的知道,channelA频道有三个人订阅;channelB频道没有人订阅;channelC频道有两个人订阅。
当客户端clientF
调用SUBSCRIBE
命令时,程序就将客户端和要订阅的频道在 pubsub_channels
字典中关联起来。执行以下指令,对应的结果图为:
127.0.0.1:6379> SUBSCRIBE channelB channelC channelA
结论:通过pubsub_channels
字典, 程序只要检查某个频道是否为字典的键,就可以知道该频道是否正在被客户端订阅; 只要取出某个键的值, 就可以得到所有订阅该频道的客户端的信息。
2、发布信息原理
原理说明:
当调用PUBLISH channel message
命令, 程序首先根据channel
定位到字典的键, 然后将信息发送给字典值链表中的所有客户端。
对于上图来说,如果客户端channelA执行命令PUBLISH channelA “hello,cabbage”,那么clientA
,clientB
,clientC
,clientF
这四个客户端都将接收到"hello,cabbage"信息,通过遍历订阅频道的所有客户端。
3、退订信息原理
原理:
使用UNSUBSCRIBE
命令可以退订指定的频道,这个命令执行的是订阅的反操作: 它从pubsub_channels
字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。
参考文章:http://t.zoukankan.com/rxbook-p-12652198.html
今天关于《Redis实现消息的发布订阅原理分析》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

- 上一篇
- Redis实现事物以及锁的方法

- 下一篇
- 详解redis集群的三种方式
-
- 悲凉的胡萝卜
- 这篇文章内容出现的刚刚好,老哥加油!
- 2023-02-06 14:30:53
-
- 昏睡的发夹
- 这篇文章内容太及时了,太全面了,受益颇多,已收藏,关注博主了!希望博主能多写数据库相关的文章。
- 2023-02-05 23:55:24
-
- 迅速的皮带
- 这篇文章内容出现的刚刚好,楼主加油!
- 2023-02-05 14:25:15
-
- 玩命的砖头
- 这篇博文真是及时雨啊,好细啊,很有用,mark,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-01-25 02:17:52
-
- 聪慧的舞蹈
- 很棒,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢博主分享文章!
- 2023-01-22 05:57:49
-
- 高兴的魔镜
- 太给力了,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢师傅分享文章内容!
- 2023-01-19 23:39:13
-
- 直率的夕阳
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享文章!
- 2023-01-18 08:42:28
-
- 冷静的画板
- 这篇技术贴太及时了,太细致了,真优秀,已加入收藏夹了,关注博主了!希望博主能多写数据库相关的文章。
- 2023-01-16 19:09:00
-
- 曾经的百褶裙
- 太细致了,码起来,感谢up主的这篇技术贴,我会继续支持!
- 2023-01-13 00:53:22
-
- 糊涂的老鼠
- 这篇技术文章真及时,好细啊,感谢大佬分享,已加入收藏夹了,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-01-09 13:50:58
-
- 调皮的薯片
- 很详细,码住,感谢楼主的这篇文章内容,我会继续支持!
- 2023-01-07 09:57:34
-
- 能干的西牛
- 这篇博文真是及时雨啊,老哥加油!
- 2023-01-05 22:27:43
-
- 寒冷的火车
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享文章内容!
- 2023-01-04 20:53:10
-
- 诚心的火龙果
- 这篇文章真是及时雨啊,太全面了,太给力了,mark,关注作者大大了!希望作者大大能多写数据库相关的文章。
- 2023-01-03 23:09:01
-
- 负责的蓝天
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢师傅分享文章!
- 2023-01-02 20:11:45
-
- 饱满的手套
- 太详细了,收藏了,感谢作者大大的这篇博文,我会继续支持!
- 2023-01-01 07:57:33
-
- 数据库 · Redis | 33分钟前 |
- Redis性能监控工具有哪些
- 124浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- RedisList队列优化方法分享
- 378浏览 收藏
-
- 数据库 · Redis | 1小时前 |
- Redis位图实现用户签到优化方案
- 322浏览 收藏
-
- 数据库 · Redis | 10小时前 |
- Redis数据安全防护全攻略
- 112浏览 收藏
-
- 数据库 · Redis | 10小时前 |
- Redis哈希技巧与实战应用
- 204浏览 收藏
-
- 数据库 · Redis | 10小时前 |
- 扩展Redis集群节点的步骤与注意事项
- 163浏览 收藏
-
- 数据库 · Redis | 11小时前 |
- 高并发Redis优化技巧分享
- 147浏览 收藏
-
- 数据库 · Redis | 12小时前 |
- Redis主从复制故障排查指南
- 477浏览 收藏
-
- 数据库 · Redis | 15小时前 |
- Redis与HBase存储方案详解
- 414浏览 收藏
-
- 数据库 · Redis | 18小时前 |
- Redis与MongoDB缓存优化方法
- 193浏览 收藏
-
- 数据库 · Redis | 23小时前 |
- Redis安全配置更新操作教程
- 313浏览 收藏
-
- 数据库 · Redis | 1天前 |
- Redis单节点迁移到集群的步骤详解
- 362浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 95次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 89次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 106次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 98次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 98次使用
-
- golang redigo发布订阅使用的方法
- 2023-01-01 375浏览
-
- K8s部署发布Golang应用程序的实现方法
- 2023-01-07 381浏览
-
- redis发布和订阅_动力节点Java学院整理
- 2022-12-30 346浏览
-
- 在redis中防止消息丢失的机制
- 2023-02-25 364浏览