redis之發佈訂閱模式

1.列表list的發佈訂閱模式的侷限性

前面我們說通過隊列的rpush 和lpop 可以實現消息隊列(隊尾進隊頭出),但是消費者需要不停地調用lpop查看List 中是否有等待處理的消息
(比如寫一個 while 循環)。爲了減少通信的消耗,可以sleep()一段時間再消費,但是會有兩個問題:
1.如果生產者生產消息的速度遠大於消費者消費消息的速度,List 會佔用大量的內存。
2.消息的實時性降低。
   list 還提供了一個阻塞的命令:blpop,沒有任何元素可以彈出的時候,連接會被阻塞。
3.基於list 實現的消息隊列,不支持一對多的消息分發。   
  所謂不支持消息分發,就是主動通知的功能;

blpop命令使用參考
http://redisdoc.com/list/blpop.html

2.redis的發佈訂閱模式

2.1.概述

1.首先,我們有很多的頻道(channel),我們也可以把這個頻道理解成queue隊列。
2.訂閱者可以訂閱一個或者多個頻道。消息的發佈者(生產者)可以給指定的頻道發佈消息。只要有消息到達了頻道,
  所有訂閱了這個頻道的訂閱者都會收到這條消息。
3.需要注意的注意是,發出去的消息不會被持久化,因爲它已經從隊列裏面移除了,所以消費者只能收到它開始訂閱這個頻道之後發佈的消息。

2.2.相關命令

2.2.1.客戶端訂閱頻道消息

2.2.1.1.完全匹配:subscribe name

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

2.2.1.2.規則匹配:支持?和*佔位符。?代表一個字符,*代表 0 個或者多個字符。

2.2.1.2.1.規則匹配:?代表一個字符
2.2.1.2.2.規則匹配: *代表 0 個或者多個字符。

2.2.2.發佈者發佈頻道消息:publish name gaoxinfu

127.0.0.1:6379> publish name gaoxinfu
(integer) 1
127.0.0.1:6379> 

消息發佈完成之後,訂閱消息的接收端,會收到發佈的內容

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

在這裏插入圖片描述

當然上面的客戶端,只要訂閱了都可以接收到消息內容,所以多個客戶端可以同時訂閱channel頻道

2.2.3.客戶端取消訂閱頻道消息:unsubscribe name (這個不能再訂閱的模式去執行)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章