你还不懂Redis的发布订阅模式呢?

一、什么是发布订阅

其实就是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码农社区】
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章