redis 客戶端可以訂閱任意數量的頻道。
第乙個:訊息傳送者, 第二個:頻道 第三個:訊息訂閱者!
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:
當有新訊息通過 publish 命令傳送給頻道 channel1 時, 這個訊息就會被傳送給訂閱它的三個客戶端:
訂閱端:
# 訂閱qwe這個頻道
127.0.0.1:6379> subscribe qwe
reading messages... (press ctrl-c to quit)
1)"subscribe"
2)"qwe"
3)(integer) 1
# 等待讀取推送資訊
# 訊息
1)"message"
# 哪個頻道
2)"qwe"
# 訊息內容
3)"hello,qwe,test1"
1)"message"
2)"qwe"
3)"hello,qwe,test2"
傳送端:
# 發布者傳送資訊到頻道
127.0.0.1:6379> publish qwe "hello,qwe,test1"
(integer) 1
127.0.0.1:6379> publish qwe "hello,qwe,test2"
(integer) 1
redis是使用c實現的,通過分析 redis 原始碼裡的 pubsub.c 檔案,了解發布和訂閱機制的底層實現。
通過 subscribe 命令訂閱某頻道後,redis-server 裡維護了乙個字典,字典的鍵就是乙個個 頻道!,而字典的值則是乙個鍊錶,鍊錶中儲存了所有訂閱這個 channel 的客戶端。subscribe 命令的關鍵,就是將客戶端新增到給定 channel 的訂閱鍊錶中。
通過 publish 命令向訂閱者傳送訊息,redis-server 會使用給定的頻道作為鍵,在它所維護的 channel字典中查詢記錄了訂閱這個頻道的所有客戶端的鍊錶,遍歷這個鍊錶,將訊息發布給所有訂閱者。
使用場景:
實時訊息系統
實時聊天(頻道當做聊天室,將資訊回顯給所有人即可)
訂閱、關注系統
稍微複雜的場景還是最好使用訊息中介軟體來實現
11 Redis 集合物件
本文內容均來自 redis設計與實現 一書 集合物件的編碼可以是intset或者hashtable。intset編碼的集合物件使用整數集合作為底層實現,集合物件包含的所有元素都被儲存在整數集合裡面。hashtable編碼的集合物件使用字典作為底層實現,字典的每個鍵都是乙個字串物件,每個字串物件包含了...
Redis 發布訂閱
redis 發布訂閱 pub sub 是一種訊息通訊模式 傳送者 pub 傳送訊息,訂閱者 sub 接收訊息。redis 客戶端可以訂閱任意數量的頻道。下圖展示了頻道 channel1 以及訂閱這個頻道的三個客戶端 client2 client5 和 client1 之間的關係 當有新訊息通過 pu...
Redis 發布訂閱
redis 發布訂閱 pub sub 是一種訊息通訊模式 傳送者 publish 傳送訊息,訂閱者 subscribe 接收訊息。redis 客戶端可以訂閱任意數量的頻道。下圖是 頻道 channel1 以及訂閱這個頻道的三個客戶端 client1 client2和 client3 當有新訊息通過 ...