共计 2220 个字符,预计需要花费 6 分钟才能阅读完成。
Redis 公布订阅
Redis 公布订阅(pub / sub)是一种音讯通信模式
- 发送者发送音讯 pub
- 接受者订阅音讯 sub
例如微信,微博这样的关注零碎
Redis 的客户端能够订阅任意数量的频道,不受限制
来看看图示
- 音讯发布者
- 音讯订阅者
- 频道
这里的音讯发布者,和音讯订阅者都是 redis 客户端,订阅者订阅某个频道,发布者在该频道中公布相干信息,例如文章,例如沸点,等等,音讯订阅者就能实时收到方才发布者发送的内容了
如下图中,频道 channel1
以及订阅这个频道的三个客户端 —— client2、client5 和 client1 之间的关系:
当有新音讯通过 PUBLISH 命令发送给频道 channel1 时
这个音讯就会被发送给订阅它的三个客户端:
常用命令
下表列出了 redis 公布订阅常用命令:
序号 | 命令及形容 |
---|---|
1 | PSUBSCRIBE pattern [pattern …] 订阅一个或多个合乎给定模式的频道。 |
2 | PUBSUB subcommand [argument [argument …] 查看订阅与公布零碎状态。 |
3 | PUBLISH channel message 将信息发送到指定的频道。 |
4 | [PUNSUBSCRIBE [pattern [pattern …] 退订所有给定模式的频道。 |
5 | SUBSCRIBE channel [channel …] 订阅给定的一个或多个频道的信息。 |
6 | UNSUBSCRIBE [channel [channel …] 指退订给定的频道。 |
理论测试和验证
- subscribe channel [channel …]
订阅一个或者多个通道
- PUBLISH channel message
向频道中发送音讯
接收端:
接收端订阅 xiaomotong 频道,只有发送端有 publish 音讯到频道中,接收端就能马上收到
127.0.0.1:6379> subscribe xiaomotong
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "xiaomotong"
3) (integer) 1
1) "message"
2) "xiaomotong"
3) "hellowrold"
1) "message"
2) "xiaomotong"
3) "hello_redis"
1) "message"
2) "xiaomotong"
3) "xiaozhupeiqi"
发送端:
发送端向 xiaomotong 频道顺次发送 message,hellowrold,hello_redis,xiaozhupeiqi
root@iZuf66y3tuzn4wp3h02t7pZ:~# redis-cli
127.0.0.1:6379> publish xiaomotong hellowrold
(integer) 1
127.0.0.1:6379> publish xiaomotong hello_redis
(integer) 1
127.0.0.1:6379> publish xiaomotong xiaozhupeiqi
(integer) 1
那么这个实现的原理是啥呢?
实现原理
redis 是 C 语言实现的,单过程的开源组件
通过剖析 redis 源码外面的 publish.c 文件,咱们能够理解到 redis 公布订阅的底层实现,这能加深咱们对 redis 的了解
redis 通过 publish,subscribe 和 psubscribe 等命令来实现公布和订阅性能
例如咱们每个人都会应用的微信:
subscribe
通过 subscribe 订阅某个频道后,redis-server 外部会保护一个字典,字典的键就是这个频道的名字,而字典的值是一个链表,这个链表外面保留了所有订阅这个频道的客户端
因而,咱们就晓得,subscribe 指令就是将客户端增加到频道的订阅链表外面
publish
redis 通过 publish 向频道中发送音讯,redis-server 会应用给定的键作为频道的名字,在它本人保护的频道字典外面记录了订阅这个频道所有的客户端的链表,遍历这个链表,将音讯发送给所有的订阅者
pub / sub
pub / sub 见名知意就是公布(publish)和订阅(subscribe)
在 redis 外面,咱们能够设定对某一个 key 值,进行音讯公布及音讯订阅,当在一个 key 值下面进行了音讯公布后,所有订阅他的客户端都会收到它方才公布的音讯,这一性能最显著的用法就是用作实时音讯零碎
例如咱们平时都会应用到的聊天零碎,即时通信零碎等等
然而这里咱们须要 留神
Redis 集群为了实现所有订阅的客户端都能够接管到公布的音讯,然而不同的客户端可能连贯的是不同的主节点,为此 redis 会播送所有的公布的音讯到所有的节点,如果公布的音讯较大,网络开销将会很大,因而须要防止发送大音讯
Redis 公布 / 订阅利用场景
1、实时音讯零碎
2、即时通信,频道作为聊天室,将信息回显给订阅频道的所有人
3、订阅零碎,关注零碎都是 ok 的
对于简单的场景,咱们就不必思考 redis 了,能够间接应用业余的 MQ 开源组件,例如 rabbitMQ 或者 kafka
应用 Redis 公布 / 订阅 须要留神的点
应用 Redis 公布 / 订阅是有缺点的
1、对于音讯解决可靠性要求不强
2、生产能力无需通过减少生产方进行加强
参考资料:
redis_doc
欢送点赞,关注,珍藏
敌人们,你的反对和激励,是我保持分享,提高质量的能源
好了,本次就到这里
技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。
我是 小魔童哪吒,欢送点赞关注珍藏,下次见~