redis在2.8.0版本之後出了乙個新功能,叫pub/sub,也叫"發布與訂閱"
。
在這篇文章中不僅要介紹它是如何用的,更重要的是要介紹它的應用場景。
在之前介紹websocket之用tubesock在rails實現聊天室(五)的時候,就用redis的pub/sub實現過聊天室。相關的**是這樣的:
redis_thread
=thread
.new
doredis
.new
.subscribe
"chat"do|
on|on.
messagedo|
channel
,message
|tubesock
.send_data
message
endend
endtubesock
.onmessagedo|
m|redis
.new
.publish
"chat",m
end
說到這個發布與訂閱,必須說到乙個詞叫"channel"
(通道)。接收訊息者在通道上訂閱訊息,而發布訊息者在通道上發布訊息,發布者和接收者就是這樣來互動資訊的。
比如,我現在有乙個客戶端a,在訂閱通道room
,它就一直在等待,直到有訊息到來,而我又開了另乙個客戶端b,它在通道room
上發布了一條訊息「hello"
,客戶端a馬上就可以收到訊息"hello"
。而類似a這樣的客戶端有很多個。這種方式就是可以實現聊天室的。因為它像廣播訊息,有乙個訊息出來了,每個只要訂閱通道的客戶端就會收到。
我們來實現一下。
首先用redis-cli
進入redis的客戶端命令互動介面。
輸入subscribe room
,表示訂閱通道"room"
。
127.0.0.1:6379> subscribe room
reading messages... (press ctrl-c to quit)
1)"subscribe"
2)"room"
3)(integer) 1
現在再開啟另乙個redis-cli
客戶端。
在通道"room"
通道 上傳送一條資訊"hello"
。
> publish room hello
先前的客戶端會收到這樣的訊息:
1)
"message"
2)"room"
3)"hello"
這樣就完成了整個訂閱與發布的流程。
publish
那個客戶端一直停在那,它沒有退出,只要給它傳送訊息,它就可以接收訊息。
當然,像publish
那個客戶端可以開啟多個,只要訂閱"room"
這個通道的客戶端都會收到相同的訊息。
還需要注意的乙個點就是當沒有任何訂閱的客戶端時,進行publish
時,資料是不會被儲存起來的。
也就是說,下次有人訂閱的時候,是收不到訊息的。
127.0.0.1:6379> publish room hello
(integer) 0
redis的訂閱與發布比較常見的應用就是聊天室,當然還有其他的,比如做乙個推送系統。
手機等客戶端可以用redis訂閱乙個通道,然而後台可以給通道發布訊息,這樣,所有的手機客戶端都可以通過通道得到後台發布的訊息。
這樣子實現,又能利用redis的快速和高效能的特點,也避免了傳統方式的輪循作法。
完結。
Redis 發布與訂閱
redis 自從2.0版本後,增加發布與訂閱等新特性,該功能有點類似設計模式中的觀察者模式,對訊息的生產者與接收者進行松耦合。也可以用該特性實現系統與系統之間的訊息傳遞,該功能的 的實現非常實用和高效。下面我們介紹一下,如何使用發布與訂閱 redis提供發布與訂閱幾個命令 subscribe cha...
Redis發布與訂閱
訂閱 發布訊息圖 第乙個 訊息傳送者,第二個 頻道 第三個 訊息訂閱者!下圖展示了頻道 channel1 以及訂閱這個頻道的三個客戶端 client2 client5 和 client1 之間的關係 當有新訊息通過 publish 命令傳送給頻道 channel1 時,這個訊息就會被傳送給訂閱它的三...
Redis發布與訂閱模式
redis的pub sub實現了發布 訂閱訊息正規化,發布者將訊息發布到不同的頻道,訂閱者訂閱感興趣的頻道訊息,而不需要關心是誰在發布。這種發布者和訂閱者的解耦合方式可以極大的擴充套件的擴充套件性網路拓撲。為了訂閱foo和bar,客戶端發出乙個訂閱的頻道名稱 subscribe foo bar其他客...