1. 程式人生 > 實用技巧 >redis訊息佇列

redis訊息佇列

1.什麼是訊息佇列

在生活中,其實有很多的例子,都類似訊息佇列。

比如:工廠生產出來的麵包,交給超市,商場來出售,客戶通過超市,商場來買麵包,客戶不會針對某一個工廠去選擇,只管從超市買出來,工廠也不會管是哪一個客戶買了麵包,只管生產出來之後,交給超市,商場來處理。

訊息佇列(Message Queue)是一種應用間的通訊方式,訊息傳送後可以立即返回,有訊息系統來確保資訊的可靠傳遞,訊息生產者只管把訊息釋出到訊息佇列中而不管誰來取,訊息消費者只管從訊息佇列中取訊息而不管誰釋出的,這樣釋出者和使用者都不用知道對方的存在。

2.為什麼使用訊息佇列

首先,我們可以知道,訊息佇列是一種非同步的工作機制,比如說日誌收集系統,為了避免資料在傳輸過程中丟失,還有訂單系統,下單後,會生成對應的單據,庫存的扣減,消費資訊的傳送,一個下單,產生這麼多的訊息,都是通過一個操作的觸發,然後將其他的訊息放入訊息佇列中,依次產生。再就是很多網站的,秒殺活動之類的,前多少名使用者會便宜,都是通過訊息佇列來實現的。

這些例子,都是通過訊息佇列,來實現,業務的解耦,最終資料的一致性,廣播,錯峰流控等等,從而完成業務的邏輯。

3.訊息佇列產品

1)rabbit-MQ(最初起源於金融系統,用於分散式系統中儲存轉發訊息。OpenStack)
2)Zero-MQ(SaltStack)
3)Kafka(JAVA)
4)redis(key:value資料庫,快取,訊息佇列)

4.Redis釋出訊息-任務佇列模式(queuing)

任務佇列:顧名思義,就是“傳遞訊息的佇列”。與任務佇列進行互動的實體有兩類,一類是生產者(producer),另一類則是消費者(consumer)。生產者將需要處理的任務放入任務佇列中,而消費者則不斷地從任務佇列中讀入任務資訊並執行。

任務佇列的好處
1)鬆耦合。
生產者和消費者只需按照約定的任務描述格式,進行編寫程式碼。
2)易於擴充套件。
多消費者模式下,消費者可以分佈在多個不同的伺服器中,由此降低單臺伺服器的負載。

5.Redis釋出訊息-釋出-訂閱模式(publish-subscribe)

其實從Pub/Sub的機制來看,它更像是一個廣播系統,多個訂閱者(Subscriber)可以訂閱多個頻道(Channel),多個釋出者(Publisher)可以往多個頻道(Channel)中釋出訊息。

可以這麼簡單的理解:
1)Subscriber:收音機,可以收到多個頻道,並以佇列方式顯示
2)Publisher:電臺,可以往不同的FM頻道中發訊息
3)Channel:不同頻率的FM頻道

6.訂閱模式實踐

1.訂閱單個頻道

#第一個視窗,訂閱一個頻道
127.0.0.1:6379> SUBSCRIBE gongsiqun
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "gongsiqun"
3) (integer) 1

#第二個視窗向頻道釋出訊息
127.0.0.1:6379> PUBLISH gongsiqun 今晚大保健
(integer) 1

#回到第一個頻道檢視
1) "message"
2) "gongsiqun"
3) "\xe4\xbb\x8a\xe6\x99\x9a\xe5\xa4\xa7\xe4\xbf\x9d\xe5\x81\xa5"

2.訂閱多個頻道

#第一個視窗訂閱多個頻道
127.0.0.1:6379> SUBSCRIBE gongsiqun jiatingqun
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "gongsiqun"
3) (integer) 1
1) "subscribe"
2) "jiatingqun"
3) (integer) 2

#第二個視窗向頻道釋出訊息
127.0.0.1:6379> PUBLISH gongsiqun jiwnandabaojian
(integer) 1
127.0.0.1:6379> PUBLISH jiatingqun jinwanjiaban
(integer) 1

#回到第一個視窗檢視
1) "message"
2) "gongsiqun"
3) "jiwnandabaojian"

1) "message"
2) "jiatingqun"
3) "jinwanjiaban"