你還不懂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碼農社區】
在這裏插入圖片描述

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