redis釋出與訂閱
阿新 • • 發佈:2019-02-05
redis在2.8.0版本之後出了一個新功能,叫Pub/Sub,也叫"釋出與訂閱"
。
在這篇文章中不僅要介紹它是如何用的,更重要的是要介紹它的應用場景。
redis_thread = Thread.new do
Redis.new.subscribe "chat" do |on|
on.message do |channel, message|
tubesock.send_data message
end
end
end
tubesock.onmessage do |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的快速和高效能的特點,也避免了傳統方式的輪循作法。
完結。