发布/订阅是一种消息传输设计模式,消息的发布者将自己的信息发送给订阅者,
他并不是直接将消息发送给接受者,而是通过管道广播给订阅者
这里是存在中间介质的
-
在redis中,提供了发布订阅功能,可以用于消息都传输,在redis中定义了这样三个模型,publisher(消息发布者) channel(管道/频道) subscriber(订阅者),三者可以通过用户的关系绑定来进行消息都传递,订阅者关注对应频道,然后发布者通过频道发布消息,然后再进行消息传递到发布者手上
-
这种模式是松耦合的,减少了消息发布者与关注者之间的耦合
发布订阅分类
实现原理
字典理解
在redis中,其中关于发布订阅的底层数据结构是list-链表型数据结构
也就是channel的数据结构底层,那么对于上图就存在一种细节划分了
订阅频道
从机订阅一个频道,然后主机进行消息传输
细节:
- 当从机订阅了一个频道时,会自动进行等待,等待主机发送消息传递到相关的从机之中,然后打印出来
127.0.0.1:6379> subscribe dongqing
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "dongqing"
3) (integer) 1
1) "message"
#订阅的频道
2) "dongqing"
#传入的message
3) "ace"
127.0.0.1:6379> publish dongqing woshizhgeshijieshangzuiniubi1deren
(integer) 1
127.0.0.1:6379> publish dongqing jack
(integer) 1
127.0.0.1:6379> publish dongqing queen
(integer) 1
127.0.0.1:6379> publish dongqing king
(integer) 1
127.0.0.1:6379> publish dongqing ace
(integer) 1
127.0.0.1:6379>
- 结构化传输
关于一个订阅者关注频道底层的数据结构的操作理解,这里当一个订阅者关注一个频道了之后,如果这个频道存在订阅者,那么直接在链表后面添加
- 如果没有订阅者,直接将当前的频道设置为新的频道,等待新的订阅者添加
- 反之,就是直接进行删除操作,空链表操作
取消订阅
127.0.0.1:6379> unsubscribe dongqing
1) "unsubscribe"
2) "dongqing"
3) (integer) 0
127.0.0.1:6379>
订阅模式
订阅模式
使用psubscribe 操作传输理解
订阅模式就是多个频道之间的嵌合理解,复合结构操作这是非常必要的
底层就是将链表中的各个节点实现为list集合,不同的部分对应不同的内容理解
-注意这里的理解操作,联合其中的psubscribel结合复合键的操作,其实这里看起来是三个单独的键值,但是底层则是嵌合的操作理解
127.0.0.1:6379> psubscribe users name age
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "users"
3) (integer) 1
1) "psubscribe"
2) "name"
3) (integer) 2
1) "psubscribe"
2) "age"
3) (integer) 3
1) "pmessage"
2) "users"
3) "users"
4) "dongqing"
1) "pmessage"
2) "name"
3) "name"
4) "jack"
1) "pmessage"
2) "age"
3) "age"
4) "20"
127.0.0.1:6379> publish user dongqing
(integer) 0
127.0.0.1:6379> publish users dongqing
(integer) 1
127.0.0.1:6379> publish name jack
(integer) 1
127.0.0.1:6379> publish age 20
(integer) 1
127.0.0.1:6379>
取消订阅模式
使用命令punsubscribe
127.0.0.1:6379> punsubscribe user name age
1) "punsubscribe"
2) "user"
3) (integer) 0
127.0.0.1:6379>
能力应用
Redis 发布订阅应用场景比较广泛,类似微博/微信公众号这种关注/订阅以及消息推送能力,同样还可以作为实时消息系统(类似聊天/群聊能力支持)
聊天室这种类型的理解如何实现才是非常必要的
我是一位爱生活的程序员,欢迎大家关注我的频道:)