所謂發佈訂閱,其實就是一個生產者消費者模型:redis
如上圖:由發佈者將消息發佈到頻道,再由訂閱者去訂閱頻道,這樣一來,發佈者每發佈一條消息到對應頻道,那麼訂閱了該頻道的訂閱者所有都會收到消息 (注意:若是一個新的訂閱者訂閱頻道,那麼它是沒法收到歷史消息的,即以前該頻道發佈的消息)緩存
publish [channel message] --- 向頻道channel發佈消息message,返回值是訂閱者的個數。數據結構
subscribe [channel...] --- 訂閱頻道(一個或多個)返回對應頻道的信息spa
unsubscribe [channel...] --- 取消一個或多個訂閱隊列
psubscribe [pattern...] --- 按模式訂閱,如訂閱以什麼字母開頭的頻道。消息隊列
punsubscribe [pattern...] --- 退訂指定的模式。channel
pubsub channels --- 列出至少有一個訂閱者的頻道。im
pubsub numsub [channel...] --- 列出給定頻道的訂閱者數量數據
pubsub numpat [pattern...] --- 列出被訂閱模式的數量img
發佈訂閱和消息隊列都是生產者消費者模型,它們不一樣的是,當消息發佈者發佈一條消息時,發佈訂閱的全部訂閱者(訂閱了該頻道的)都會收到對應的消息。而消息隊列是一個搶的特色,即只有一個消費者能拿到這條消息。redis中並無提供一個叫消息隊列的功能,但咱們能夠用list這種數據結構,配合lpush,brpop來實現一個消息隊列。
那麼如何選擇消息隊列仍是發佈訂閱呢?
舉例:1.若是咱們須要同時刪除全部訂閱者的本地緩存,這種場景那就能夠使用發佈訂閱,由於他們都能收到消息,從而執行清除本地緩存 2. 若是是一個搶紅包隊列,這時候能夠用消息隊列,只要一個消費者拿到就ok。