一、什麼是發佈訂閱
其實就是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碼農社區】