redis訊息佇列
阿新 • • 發佈:2020-08-06
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"