1. 程式人生 > >redis釋出與訂閱

redis釋出與訂閱


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的快速和高效能的特點,也避免了傳統方式的輪循作法。

完結。