redis的訊息通知通過列表型別實現,分為兩種模式:阻塞式、發布/訂閱式:
阻塞式
顧名思義,訊息生產者負責生產訊息,並將訊息放到佇列的一端,訊息的消費者負責消費訊息,從佇列的另一端取出訊息,然後對其進行消費,假如訊息的生產者突然罷工了,或者訊息的生產速度趕不上消費者的消費速度,那麼訊息的消費者會一直翹首以盼地阻塞在那裡,直到達到指定的超時時間,或者訊息佇列中又有新的訊息被它獲取並進行消費。
在redis中提供給了我們命令blpop|brpop來進行阻塞式獲取訊息,且支援可以從多個佇列中進行取數。
消費者命令格式:brpop|blpop key [key...] timeout;從key、key1、key2...中獲取訊息,一次只獲取一條,按照從左往右的順序,只有當key沒有訊息的時候,才會從key1中獲取訊息,當key和key1中都沒有訊息的時候,才會從key2中獲取訊息。timeout指定超時時間,當阻塞時間達到timeout時(單位秒),會終止訊息的獲取。如果timeout=0,表示永遠不會超時,會一直等待下去。
返回結果:
等待超時:會返回兩個值,第乙個值是nil,表示沒有獲取到訊息,第二個值是時間,表示等待了多久後超時。
獲取訊息:獲取訊息會返回三個值,第乙個值是列表的鍵,表示從哪個key中獲得的訊息,第二個值是獲取的訊息,第三個值是等待的時間。
生產者命令格式:lpush|rpush key value [value...];很普通的對列表型別的資料新增資料的操作,返回結果是我們新增成功訊息的數量。
發布/訂閱模式
阻塞式解決了一對一的訊息生產消費模式,但是在某些情況下,如發布加班通知訊息的時候,我們需要有一對多的情況進行消費訊息。
訂閱頻道訊息:subscribe channel [channel...];訂閱乙個或多個頻道。
訂閱頻道後會進入訂閱狀態,在訂閱狀態中只能使用subscribe(訂閱頻道)、unsubscribe(取消訂閱)、psubscribe(按規則訂閱)、punsubscribe(按規則取消)四個命令。
返回結果:
訂閱頻道成功:返回值的個數等於頻道數*3,第乙個值是subscribe,表示訂閱成功,第二個值是訂閱成功的頻道名稱,第三個值是當前訂閱的總頻道數。如果一次訂閱多個頻道,對這三個值進行迴圈返回。
接收頻道訊息:返回三個值,第乙個值是message,表示返回的是訊息,第二個值是頻道名稱,第三個值是訊息內容。
發布頻道訊息:publish channel message;向乙個頻道發布訊息。返回結果是訊息的訂閱數量。
按規則訂閱頻道訊息:psubscribe channel[pattern] [channel[pattern]...];按規則訂閱訊息
返回結果:
訂閱成功:返回值的個數等於頻道數*3,第乙個值是psubscribe,表示訂閱成功,第二個值是訂閱的頻道規則,第三個是當前訂閱的頻道總數。
注意:這裡我們使用同樣的頻道規則進行訂閱,它返回訂閱的頻道總數一直是1,不會重複累加。但是如果我們使用如channel*和ch*這樣的規則,則會對能匹配上的頻道進行重複訂閱。
接受訊息:返回四個值,第乙個值是pmessage,表示接收到的是訊息,第二個值是channel*,表示我們的訂閱規則,第三個值是頻道名稱,表示匹配上的頻道全稱,第四個值是訊息內容。
Redis訊息通知系統的實現
posted on 2012 02 29 by 老王 最近忙著用redis實現乙個訊息通知系統,今天大概總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多...
Redis訊息通知系統的實現
最近忙著用redis實現乙個訊息通知系統,今天大概總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所...
Redis訊息通知系統的實現
最近忙著用redis實現乙個訊息通知系統,今天大概總結了一下技術細節,其中演示 如果沒有特殊說明,使用的都是phpredis擴充套件來實現的。比如要推送一條全域性訊息,如果真的給所有使用者都推送一遍的話,那麼會占用很大的記憶體,實際上不管粘性有多高的產品,活躍使用者同全部使用者比起來,都會小很多,所...