Redis實(shí)現(xiàn)消息隊(duì)列的方式

實(shí)現(xiàn)方式

  1. 通過數(shù)據(jù)結(jié)構(gòu)list來(lái)實(shí)現(xiàn)
  2. 通過pub/sub實(shí)現(xiàn)

通過List實(shí)現(xiàn)

實(shí)現(xiàn)機(jī)制
一個(gè)客戶端通過LPUSH命令將消息放入隊(duì)列中,
而另一個(gè)客戶端通過RPOP或者BRPOP命令取出隊(duì)列中等待時(shí)間最長(zhǎng)的消息,
即 FIFO.
優(yōu)點(diǎn)
  1. 能夠?qū)崿F(xiàn)持久化:可以通過多個(gè)client來(lái)提高消費(fèi)速度
  2. 支持集群:可以通過多個(gè)client來(lái)提高消費(fèi)速度
  3. 接口使用簡(jiǎn)單:生產(chǎn)者,消費(fèi)者模式,生產(chǎn)者lpush消息,消費(fèi)者brpop消息,并設(shè)定超時(shí)時(shí)間,可以減少redis的壓力
缺點(diǎn)
  1. 生產(chǎn)者寫入太快,消費(fèi)者消費(fèi)太慢,導(dǎo)致Redis的內(nèi)存問題,處理機(jī)制需要自己實(shí)現(xiàn)
  2. 生產(chǎn)者或者消費(fèi)者崩潰后的處理機(jī)制,需要自己實(shí)現(xiàn)
  3. Redis上消息只會(huì)被一個(gè)消費(fèi)者消費(fèi),不會(huì)有多個(gè)消費(fèi)者消費(fèi)同一個(gè)消息,簡(jiǎn)單一對(duì)一;
  4. 消息沒有狀態(tài),消息取出后依賴于client的記錄或者重新push到隊(duì)列中,消息被重新消費(fèi),需要實(shí)現(xiàn)一致性補(bǔ)償或異步冪等;

通過pub/sub實(shí)現(xiàn)

實(shí)現(xiàn)機(jī)制
即發(fā)布-訂閱模式:
訂閱,取消訂閱和發(fā)布實(shí)現(xiàn)了發(fā)布/訂閱消息范式;
發(fā)布者通過PUBLISH發(fā)布的消息分到不同的channel,不關(guān)注發(fā)給誰(shuí);
訂閱者通過SUBSCRIBE訂閱對(duì)一個(gè)或多個(gè)channel,不關(guān)注是誰(shuí)發(fā)布;
優(yōu)點(diǎn)
  1. 一個(gè)發(fā)布者可以對(duì)應(yīng)多個(gè)生產(chǎn)者;
  2. 支持集群;
  3. 可以模糊匹配訂閱,取消訂閱,發(fā)布;
缺點(diǎn)
  1. 非持久化:消息發(fā)布者和訂閱者必須同時(shí)在線,否則一旦消息訂閱者由于各種異常情況而被迫斷開連接,在其重新連接后,其離線期間的消息是無(wú)法被重新通知的(即發(fā)即棄);
  2. 數(shù)據(jù)庫(kù)的可靠性不能保證:在redis宕機(jī)之后,redis沒有專門定制消息的備份與恢復(fù);
  3. 擴(kuò)展不靈活:當(dāng)大量的消息到達(dá)redis服務(wù)時(shí),如果消息訂閱者來(lái)不及完成處理,會(huì)導(dǎo)致消息堆積,如果數(shù)據(jù)最終要落地?cái)?shù)據(jù)庫(kù),那么數(shù)據(jù)不同步的狀態(tài)越久,風(fēng)險(xiǎn)越大;
  4. 不支持分組,即 做不到同一個(gè)組里只有一個(gè)訂閱者會(huì)收到消息,做簡(jiǎn)單的負(fù)載均衡;
總結(jié)
  1. redis 輕量級(jí),低延遲,高并發(fā),可靠性低
  2. 輕量級(jí):相對(duì)于 開源的mq來(lái)說;
  3. 低延遲:實(shí)時(shí)性高,redis作為高效的緩存服務(wù)器,所有數(shù)據(jù)都存在在服務(wù)器中,所以它具有更高的實(shí)時(shí)性
  4. 高并發(fā):高效的緩存服務(wù)器
  5. 可靠性低:沒有相應(yīng)的機(jī)制保證消息的可靠消費(fèi),如果發(fā)布者發(fā)布一條消息,而沒有對(duì)應(yīng)的訂閱者的話,這條消息將丟失,不會(huì)存在內(nèi)存中;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 消息隊(duì)列 什么是消息隊(duì)列(Message Queue,MQ)呢? 首先回憶下生活中在餐館點(diǎn)餐的場(chǎng)景,當(dāng)你點(diǎn)完餐之后...
    JunChow520閱讀 3,153評(píng)論 0 29
  • Redis實(shí)現(xiàn)輕量級(jí)的消息隊(duì)列與消息中間件相比,沒有高級(jí)特性也沒有ACK保證,無(wú)法做到數(shù)據(jù)不重不漏,如果業(yè)務(wù)簡(jiǎn)單而...
    JunChow520閱讀 39,668評(píng)論 3 11
  • 安全性 設(shè)置客戶端連接后進(jìn)行任何其他指令前需要使用的密碼。 警告:因?yàn)閞edis 速度相當(dāng)快,所以在一臺(tái)比較好的服...
    OzanShareing閱讀 1,944評(píng)論 1 7
  • 1.1 資料 ,最好的入門小冊(cè)子,可以先于一切文檔之前看,免費(fèi)。 作者Antirez的博客,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,293評(píng)論 1 51
  • Zookeeper用于集群主備切換。 YARN讓集群具備更好的擴(kuò)展性。 Spark沒有存儲(chǔ)能力。 Spark的Ma...
    Yobhel閱讀 7,597評(píng)論 0 34

友情鏈接更多精彩內(nèi)容