📢📢📢📣📣📣
哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!😜😜😜
✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。
✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。
✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注【一心同学】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
一、什么是Redis的发布/订阅?
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。Redis 客户端可以订阅任意数量的频道。
就好比当我们在CSDN中关注了【一心同学】这位博主,那么当【一心同学】发布博文的时候,有关注【一心同学】这位博主的所有粉丝都可以收到消息。
为了可以更加清晰理解这个概念,我们来看一下订阅/发布的消息图:
二、频道与订阅者之间的关系
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
三、基本命令
序号命令及描述1PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道。2PUBSUB subcommand [argument [argument ...]]
查看订阅与发布系统状态。3PUBLISH channel message
将信息发送到指定的频道。4PUNSUBSCRIBE [pattern [pattern ...]]
退订所有给定模式的频道。5SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道的信息。6UNSUBSCRIBE [channel [channel ...]]
指退订给定的频道。
四、命令讲解
为了演示Redis的发布订阅是如何工作的,我们打开两个redis-cli 客户端。
🌴 简单发布订阅使用
第一个redis-cli客户端(订阅端)
操作:订阅频道“yixin"。
127.0.0.1:6379> subscribe yixin
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "yixin"
3) (integer) 1
第二个redis-cli客户端(发送端)
操作:往”yixin"这个频道里面发布消息,这样订阅者就可以立刻收到消息了。
127.0.0.1:6379> publish yixin "hello,yixin"
(integer) 1
现在我们的第一个redis-cli客户端,也就是订阅者已经能够收到这条消息了。
🌴 订阅符合规定的频道
语法****:PSUBSCRIBE pattern [pattern ...]
作用****:订阅一个或多个符合给定模式的频道。
每个模式以 * 作为匹配符,比如 yi 匹配所有以 yi 开头的频道*
订阅端:
操作:订阅所有以“yi”开头的频道。
127.0.0.1:6379> psubscribe yi*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "yi*"
3) (integer) 1
发送端:
操作:往”yixin"这个频道发送消息。
127.0.0.1:6379> publish yixin "hello"
(integer) 1
这时候我们的订阅端就已经能够成功接收到信息了。
如果我们要退订符合规定的频道,那么使用以下命令即可:
语法:PUNSUBSCRIBE [pattern [pattern ...]]
操作:退订所有以"yi"开头的频道。
127.0.0.1:6379> psubscribe yi*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "yi*"
3) (integer) 1
🌴 查看活跃的频道
语法:PUBSUB CHANNELS
我们可以开多个redis-cli进行订阅,当我们要查看当前的活跃频道,之间输入命令即可。
127.0.0.1:6379> pubsub channels
1) "java"
2) "yixin"
五、原理分析
🔥 订阅频道原理
🚀 原理说明:每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构, 结构的 pubsub_channels 属性是一个字典, 这个字典就用于保存订阅频道的信息,其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。
操作:当客户端调用 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】中的【发布/订阅】功能,通过这个【发布/订阅】功能,我们可以将其应用到类似于社交网站的【关注功能】上面,这样的实现效果将会非常【整洁】!
如果这篇【文章】有帮助到你,希望可以给【一心同学】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
版权归原作者 一心同学 所有, 如有侵权,请联系我们删除。