最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis消息隊列的三種實現(xiàn)方式

 更新時間:2023年12月06日 10:57:00   作者:zmbwcx2003  
本文主要介紹了Redis消息隊列的三種實現(xiàn)方式,主要包括List實現(xiàn)消息隊列,PubSub消息隊列,Stream消息隊列,具有一定的參考價值,感興趣的可以了解一下

前言

為什么要使用Redis的消息隊列?

成本低,對于RabbitMQ或是Kafka來說,已經(jīng)是重量級的消息隊列。

Redis的三種實現(xiàn)方式:

  • List結構:一種有序的雙向鏈表
  • PubSub發(fā)布訂閱:基于點對點的消息模型
  • Stream:在Redis5.0之后提供的,比較完善的消息隊列模型

List實現(xiàn)消息隊列

我們可以利用Redis中List的命令LPUSH與RPOP來實現(xiàn)消息的發(fā)送與接收,但是需要注意的是,隊列中沒有消息時,RPOP會返回null,不會向JVM中阻塞隊列一樣進行阻塞并等待消息,因此這里應該使用BRPOP來實現(xiàn)阻塞效果。

優(yōu)點:利用Redis存儲,不受限于JVM內(nèi)存上限。

基于Redis的持久化機制,數(shù)據(jù)安全性有保證。

可以滿足消息有序性。

缺點:無法避免消息丟失。

只支持單消費者。

PubSub消息隊列

是Redis2.0版本引入的消息傳遞模型,顧名思義,消費者可以訂閱一個或多個channel,生產(chǎn)者向?qū)腸hannel發(fā)送消息后,所有訂閱者都能收到相關信息。

PubSub消息隊列的基本命令

# 訂閱一個或多個頻道
SUBSCRIBE channel [channel]
# 向一個頻道發(fā)送消息
PUBLISH channel msg
# 訂閱與pattern格式匹配的所有頻道
PSUBSCRIBE pattern [pattern]

優(yōu)點:采用發(fā)布訂閱模式,支持多生產(chǎn)者,多消費者。

缺點:不支持數(shù)據(jù)持久化。

無法避免消息丟失。

消息堆積有上限,超出時數(shù)據(jù)丟失。

Stream消息隊列

Stream是Redis5.0之后引入新的數(shù)據(jù)類型,支持持久化,因此相比于PubSub更加安全,可以通過Stream實現(xiàn)一個功能完善的消息隊列

發(fā)送消息的命令:

XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID filed value[filed value]

命令解釋:

  • key:隊列名稱
  • NOMKSTREAM:如果隊列不存在,是否自動創(chuàng)建隊列,默認是自動創(chuàng)建
  • MAXLEN|MINID [=|~] threshold [LIMIT count]:設置消息隊列的最大消息數(shù)量
  • *|ID:消息的唯一ID,*代表由Redis自動生成,格式是"時間戳-遞增數(shù)字"
  • field value:發(fā)送到隊列的消息名稱為Entry

讀取消息的第一種方法

命令如下 

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

命令解釋:

  • COUNT count:每次讀取消息的最大數(shù)量
  • BLOCK milliseconds:當沒有消息時進行阻塞,并指定阻塞時長,如果為0則指永久阻塞
  • STREAMS key:要從哪個隊列讀取消息
  • ID:起始ID,只返回大于該ID的消息,0表示從第一個消息開始讀取,$表示從最新消息開始

XREAD命令的特點:

  • 消息可回溯
  • 一個消息可以被多個消費者拿到
  • 可以阻塞讀取
  • 有消息漏讀的風險

讀取消息的第二種方法

將多個消費者劃分到一個組(Consumer Group)當中,監(jiān)聽同一個隊列。特點如下

  • 消息分流:隊列中的消息會分流給組內(nèi)的不同消費者,而不是重復消費,從而加快消息處理的速度
  • 消息標識:消費者組會維護一個標示記錄最后一個被處理的消息哪怕消費者宕機重啟,還會從標示之后讀取消息。確保每一個消息都會被消費
  • 消息確認:消費者獲取消息后,消息處于pending狀態(tài),并存入一個pending-list。當處理完成后需要通過XACK來確認消息,標記消息為已處理,才會從pending-list移除。

創(chuàng)建消費者組命令:

XGROUP CREATE key groupName ID [MKSTREAM]

命令解釋:

  • key:隊列名稱
  • groupName:消費者組名稱
  • ID:起始ID標識,$代表隊列中最后一個消息,0則代表隊列中第一個消息
  • MKSTREAM:隊列不存在時自動創(chuàng)建
# 刪除指定的消費者組
XGROUP DESTORY key groupName
# 給指定的消費者組添加消費者
XGROUP CREATECONSUMER key groupName consumername
# 刪除消費者組中的指定消費者
XGROUP DELCONSUMER key groupname comsumername 

從消費者組中讀取消息

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID[ID ...]

命令解釋:

  • group:消費組名稱
  • consumer:消費者名稱,如果消費者不存在,會自動創(chuàng)建一個消費者
  • count:本次查詢的最大數(shù)量
  • BLOCK milliseconds:當沒有消息時最長等待時間
  • NOACK:無需手動ACK,獲取到消息后自動確認
  • STREAMS key:指定隊列名稱
  • ID:獲取消息的起始ID。" > "表示從下一個未消費的消息開始。其它則是根據(jù)指定id從pending-list中獲取已消費但未確認的消息,例如0,是從pending-list中的第一個消息開始

Group類型的消息隊列特點:

  • 消息可回溯
  • 可以多消費者爭搶消息
  • 可以阻塞讀取
  • 沒有消息漏讀風險
  • 有消息確認機制,保證消息至少被消費一次

三種實現(xiàn)方式對比

LIST

PubSub

Stream

消息持久化

支持

不支持

支持

阻塞讀取

支持

支持

支持

消息堆積處理

受限于內(nèi)存空間,可以利用多消費者加快處理

受限于消費者緩沖區(qū)

受限于隊列長度,可以利用消費者組提高消費速度,減少堆積

消息確認機制

不支持

不支持

支持

消息回溯

不支持

不支持

支持

 到此這篇關于Redis消息隊列的三種實現(xiàn)方式的文章就介紹到這了,更多相關Redis消息隊列 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Redis Stream秒殺系統(tǒng)實現(xiàn)

    Redis Stream秒殺系統(tǒng)實現(xiàn)

    文章瀏覽閱讀345次,點贊7次,收藏3次。高性能: Lua腳本原子操作,毫秒級響應高并發(fā): 異步處理,支持10萬+ QPS數(shù)據(jù)一致性: 庫存不會超賣可靠性: 消息隊列確保訂單不丟失用戶體驗: 立即返回結果,無需等待。
    2025-11-11
  • Redisson分布式鎖解鎖異常問題

    Redisson分布式鎖解鎖異常問題

    文章主要描述了在使用Redisson進行分布式鎖操作時,遇到的`IllegalMonitorStateException`異常,通過分析報錯信息,作者發(fā)現(xiàn)了問題的根源在于線程嘗試解鎖但未按順序執(zhí)行,作者提出了兩種解決方案:在解鎖前增加判斷,確保線程已獲得鎖
    2024-12-12
  • Redis?Lua同步鎖實現(xiàn)源碼解析

    Redis?Lua同步鎖實現(xiàn)源碼解析

    這篇文章主要為大家介紹了Redis?Lua同步鎖實現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 在CentOS 7環(huán)境下安裝Redis數(shù)據(jù)庫詳解

    在CentOS 7環(huán)境下安裝Redis數(shù)據(jù)庫詳解

    Redis是一個開源的、基于BSD許可證的,基于內(nèi)存的、鍵值存儲NoSQL數(shù)據(jù)本篇文章主要介紹了在CentOS 7環(huán)境下安裝Redis數(shù)據(jù)庫詳解,有興趣的可以了解一下。
    2016-11-11
  • Redis三種特殊數(shù)據(jù)類型的具體使用

    Redis三種特殊數(shù)據(jù)類型的具體使用

    本文主要介紹了Redis三種特殊數(shù)據(jù)類型的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Redis緩存使用的BigKey問題解決

    Redis緩存使用的BigKey問題解決

    BigKey在Redis中存儲的單個Key對應的Value過大,本文主要介紹了Redis緩存使用的BigKey問題解決,具有一定的參考價值,感興趣的可以了解一下
    2025-05-05
  • redis分布式鎖的問題與解決方法

    redis分布式鎖的問題與解決方法

    這篇文章主要給大家介紹了關于redis分布式鎖的問題與解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • redis使用skiplist跳表的原因解析

    redis使用skiplist跳表的原因解析

    經(jīng)常會有人問這個問題,redis中為什么要使用跳表?這個問題,redis作者已經(jīng)給出過明確答案,今天通過本文再給大家講解下這個問題,對redis?skiplist跳表知識感興趣的朋友一起看看吧
    2022-10-10
  • redis主從切換導致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案

    redis主從切換導致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案

    這篇文章主要介紹了redis主從切換導致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案的相關資料,需要的朋友可以參考下
    2023-05-05
  • redis如何設置key的有效期

    redis如何設置key的有效期

    這篇文章主要介紹了redis如何設置key的有效期方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

安化县| 玛曲县| 玛沁县| 万荣县| 宜城市| 黄石市| 郁南县| 龙里县| 乐山市| 城固县| 绥宁县| 达州市| 芦山县| 会昌县| 二连浩特市| 无为县| 哈尔滨市| 明光市| 屏东县| 阳江市| 贡觉县| 昌图县| 米泉市| 鄢陵县| 黔东| 普兰县| 元谋县| 顺义区| 牟定县| 新宾| 泰安市| 新闻| 长汀县| 黄平县| 苗栗市| 马山县| 平乐县| 玛沁县| 镇巴县| 景宁| 涞水县|