一、什么是发布订阅
其实就是MQ,被订阅者写消息,订阅者们实时读到消息进行处理。
二、Redis里的发布订阅
在说这之前,前面提到的list类型blpop也是可以模拟单播阻塞队列的。但是他终归是模拟。Redis为我们提供了属于他自己的发布订阅。核心命令:
三、实操
1、说明
只有已订阅的客户端才能收到消息,比如我给test发送了一条helloworld,他会发给当前所有订阅test的客户端推送helloworld这条消息,后来的客户端再去订阅test,也不会收到这个历史消息。
2、代码
# 客户端1给test发送hello
127.0.0.1:6379> PUBLISH test helloworld
(integer) 0
# 这时候启动client2去订阅test,结果发现不会输出任何内容,也就是历史的helloworld我不会收到
127.0.0.1:6379> SUBSCRIBE test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
# 这时候我在去客户端1给test这个channel发送hello
127.0.0.1:6379> PUBLISH test hello
(integer) 1
# 切换到client2,发现收到了hello这条消息
1) "message"
2) "test"
3) "hello"
四、需求
1、需求描述
比如微信,它可以看历史时间的聊天记录,然后发消息能及时收到。
2、实现原理图
2.1、文字
- 实时聊天采取Redis的发布订阅模式,发完消息订阅者收到消息写sorted_set以及db
- 历史消息根据调研一般用户只查看3天内的居多,3天后的数据很少翻阅,所以将3天内的消息放到sorted_set里,3天后的去db里查
- 为什么用zset处理历史消息,因为zset可以排序,历史消息肯定需要按照时间排序,时间作为score。
2.2、图解
五、总结
- 发布订阅概念
- redis的blpop模拟单播阻塞队列
- redis的发布订阅
- 利用发布订阅完成需求
六、个人公众号
微信公众号【Java码农社区】