Redis消息隊列


        一般來說,消息隊列有兩種場景,一種是發布者訂閱者模式,一種是生產者消費者模式。利用redis這兩種場景的消息隊列都能夠實現。

生產者消費者模式:生產者生產消息放到隊列里,多個消費者同時監聽隊列,誰先搶到消息誰就會從隊列中取走消息;即對於每個消息只能被最多一個消費者擁有;

發布者訂閱者模式:發布者生產消息放到隊列里,多個監聽隊列的消費者都會收到同一份消息;即正常情況下每個消費者收到的消息應該都是一樣的;

對應的使用場景包括:A系統向隊列中存放數據;B系統在隊列中取數據;

1、redis隊列模式:可以實現B系統不在線狀態下,A系統向隊列中存數據,當B系統上線后,可以手動去取隊列中的數據;

2、redis訂閱模式:可以實現A系統向隊列中存數據,當B系統訂閱了此隊列並且在線時,可以自動監聽此隊列去取數據,但之前不在線時的數據無法獲取;

一、Producer/Consumer Mode

      該方法是借助redis的list結構實現的。Producer調用redis的lpush往特定key里塞入消息,Consumer調用brpop去不斷監聽該key。

Producer:

1 // producer code 2 String key = "demo:mq:test"; 3 String msg = "hello world"; 4 redisDao.lpush(key, msg);

Consumer:

1 // consumer code
2 String key = "demo:mq:test";
3 while (true) {
4 // block invoke
5 List<String> msgs = redisDao.brpop(BLOCK_TIMEOUT, listKey);
6 if (msgs == null) continue;
7 String jobMsg = msgs.get(1);
8 processMsg(jobMsg);
9 }

當有多個consumers的時候,它會按照brpop調用的順序分派消息,並非隨機。BLOCK_TIMEOUT不建議設成infinity(有些redis驅動也直接不支持inifinity),我們目前設成30(單位是秒)情況良好。

二、Pub/Sub Mode

 Redis 從 2.0.0 版本開始支持 pub/sub 指令。詳情參見:http://redis.io/topics/pubsub

 實現思想:Publisher調用redis的publish方法往特定的channel發送消息,Subscriber在初始化的時候要subscribe到該channel,一旦有消息就會立即接收。

 比較簡單的demo可參見:http://shift-alt-ctrl.iteye.com/blog/1867454

1、Redis消息的發布與訂閱

     Redis的Subscribe命令可以讓客戶端訂閱任意數量的頻道,每當有新信息發送到被訂閱的頻道時, 信息就會被發送給所有訂閱指定頻道的客戶端。作為例子,下圖展示了頻道channe11, 以及訂閱這個頻道的三個客戶端:client2、client5和client1之間的關系:

    當有新消息通過 Publish命令發送給頻道channe11時, 這個消息就會被發送給訂閱它的三個客戶端:

訂閱bar頻道。格式:Subscribe name1 name2

成功訂閱回復,分別對應訂閱類型、訂閱頻道、訂閱數量。

127.0.0.1:6379> SUBSCRIBE bar Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bar" 3) (integer) 1

重新啟一發布者client,發送消息。格式:publish channelName Message

#對有一個訂閱者的頻道發送信息
127.0.0.1:6379> publish bar val (integer) 1
#對沒有訂閱者的頻道發送信息
127.0.0.1:6379> publish bar "can any body hear me?"
(integer) 0

訂閱client回復,分別對應消息類型,頻道,消息。

1) "message" 2) "bar" 3) "val"

 詳情請參見:http://www.cnblogs.com/mushroom/p/4470006.html

                    http://redis.readthedocs.org/en/2.4/pub_sub.html

 2、鍵空間通知(Keyspace notifications)

   在訂閱頻道之前,設置set notify-keyspace-events KEA參數,然后再運行Subscribe name1 name2訂閱頻道。

   此時,當有某一指定鍵更新時會發送消息給訂閱者

  請參見:http://redis.io/topics/notifications

                http://blog.csdn.net/chaijunkun/article/details/27361453


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM