Redis订阅发布
先聊什么是发布订阅模型
你知道CSDN的订阅发布是如何实现的?其实订阅发布模型说起来是相对简单的:存在三个角色。
- 消息发布者:给相应频道发送消息的人
- 频道:相当于发送消息的频道
- 消息订阅者:订阅频道接收消息的人
消息发布者发布消息到频道(Redis中频道的实现其实是一个字典,字典的键是频道名,字典的值是一个个消息订阅者这里不细刨底层实现了
),然后消息订阅者就能从频道中拿到对应的消息(消息订阅者能知道消息是从哪个频道发送过来的)
使用场景
- 你看到的CSDN的关注系统其实就是一个订阅发布系统,虽然其可能不是Redis来实现的,但是Redis是可以实现的。
- 公众号,微博(微博的频道关注系统等)等。
- 实时聊天系统,实时聊天系统相当于聊天室就是频道。
因此发布订阅模型是重要的!值得研究和学习。
Redis中发布订阅系统的命令
命令 | 描述 |
---|---|
PSUBSCRIBE pattern [pattern] | 订阅一个或多个符合给定模式的频道 |
PUSBLISH channel message | 将消息发送到指定的频道 |
PUBSUB subcommand [argument [argument …]] | 查看订阅与发布系统状态 |
PUNSUBSCRIBE [pattern [pattern …]] | 退订所有给定模式的频道 |
SUBSCRIBE channel [channel…] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel…]] | 退订给定的频道 |
测试使用
发布端
mylocalhost:0>PUBLISH leiyu "hello,fans" #发布消息"hello,fans"到频道leiyu
"1"
mylocalhost:0>
订阅者
local:0>SUBSCRIBE leiyu # 订阅频道leiyu
切换到推送/订阅模式,关闭标签来停止接收信息
1) "subscribe"
2) "leiyu"
3) "1"
1) "message" #消息
2) "leiyu" #哪个频道传来的消息
3) "hello,fans" #具体的消息信息
实现原理简单剖析
Redis通过PUBLISH、SUBSCRIBE和PSUBSCRIBE等命令实现发布订阅功能的。
通过SUBSCRIBE命令订阅某频道后,redis-server里维护了一个字典,字典的键就是一个个频道,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。SUBSCRIBE命令的关键,就是将客户端添加到给定的channel的订阅链中。
通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel字典中查找记录了订阅这个频道的所有客户端额链表,遍历这个链表,将消息发布给所有订阅者。
小结
Pub/Sub从字面上理解就是发布(PUBLISH)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布以及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能就是作为实时消息系统,比如普通的聊天室,群聊等。
消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能就是作为实时消息系统,比如普通的聊天室,群聊等。
之后我可能会系统的学习消息队列,之后也会发布博客。