Redis隊(duì)列和阻塞隊(duì)列的實(shí)現(xiàn)
redis 隊(duì)列的優(yōu)點(diǎn)是輕量級(jí),業(yè)務(wù)足夠簡(jiǎn)單時(shí)不需要使用rabbitMq這樣專業(yè)的消息中間件;缺點(diǎn)是彈出隊(duì)列中的元素時(shí),即使該消息處理失敗也無法再次進(jìn)行消費(fèi)
Redis隊(duì)列 List
簡(jiǎn)單演示如下
普通的redis隊(duì)列,為了實(shí)現(xiàn)業(yè)務(wù),通常會(huì)使用while進(jìn)行循環(huán),這樣的話沒有消息時(shí)依舊會(huì)頻繁的執(zhí)行循環(huán),造成cpu的空轉(zhuǎn),所以一般會(huì)在代碼中增加sleep來解決該問題,但因此又會(huì)造成消息延遲問題。
阻塞隊(duì)列可以很好的解決這些問題。
Redis阻塞隊(duì)列
redis隊(duì)列提供了 “阻塞式” 拉取消息的命令:BRPOP / BLPOP,這里的 B 指的是阻塞(Block)。如果隊(duì)列為空,消費(fèi)者在拉取消息時(shí)就「阻塞等待」,一旦有新消息過來,就通知消費(fèi)者立即處理新消息。
阻塞隊(duì)列實(shí)現(xiàn):
使用 BRPOP 這種阻塞式方式拉取消息時(shí),還支持傳入一個(gè)「超時(shí)時(shí)間」,如果設(shè)置為 0,則表示不設(shè)置超時(shí),直到有新消息才返回,否則會(huì)在指定的超時(shí)時(shí)間后返回 NULL
下面是某業(yè)務(wù)完整的消費(fèi)者代碼
注意:
- 阻塞時(shí)間結(jié)束后代碼會(huì)繼續(xù)向下執(zhí)行
- 如果設(shè)置的超時(shí)時(shí)間太長(zhǎng),這個(gè)連接太久沒有活躍過,可能會(huì)被 Redis Server 判定為無效連接,之后 Redis Server 會(huì)強(qiáng)制把這個(gè)客戶端踢下線。所以,客戶端要有處理機(jī)制。實(shí)際項(xiàng)目中redis連接超時(shí)時(shí)間遠(yuǎn)大于20s,因此正常情況不會(huì)出現(xiàn)redis超時(shí)問題。以防萬(wàn)一增加redis異常捕獲,出現(xiàn)異常時(shí)殺掉當(dāng)前進(jìn)程,同時(shí)supervisord會(huì)自動(dòng)重新拉起該進(jìn)程
到此這篇關(guān)于Redis隊(duì)列和阻塞隊(duì)列的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis隊(duì)列和阻塞隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- redis實(shí)現(xiàn)分布式延時(shí)隊(duì)列的示例代碼
- Redis如何實(shí)現(xiàn)延遲隊(duì)列
- Redis實(shí)現(xiàn)延遲隊(duì)列的全流程詳解
- Redis優(yōu)雅地實(shí)現(xiàn)延遲隊(duì)列的方法分享
- Redisson 分布式延時(shí)隊(duì)列 RedissonDelayedQueue 運(yùn)行流程
- Redisson延遲隊(duì)列執(zhí)行流程源碼解析
- 詳解Redis Stream做消息隊(duì)列
- Redis消息隊(duì)列、阻塞隊(duì)列、延時(shí)隊(duì)列的實(shí)現(xiàn)
相關(guān)文章
Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用
這篇文章主要為大家介紹了Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04詳解Redis緩存預(yù)熱的實(shí)現(xiàn)方法
緩存預(yù)熱是一種在程序啟動(dòng)或緩存失效之后,主動(dòng)將熱點(diǎn)數(shù)據(jù)加載到緩存中的策略,本文將給大家分享一下如何實(shí)現(xiàn)Redis的緩存預(yù)熱,文中有詳細(xì)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-10-10redis哈希和集合_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了redis哈希和集合的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08使用lua+redis解決發(fā)多張券的并發(fā)問題
這篇文章主要介紹了使用lua+redis解決發(fā)多張券的并發(fā)問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Redis sentinel節(jié)點(diǎn)如何修改密碼
這篇文章主要介紹了Redis sentinel節(jié)點(diǎn)如何修改密碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Redis實(shí)戰(zhàn)之Jedis使用技巧詳解
Jedis?是老牌的?Redis?的?Java?客戶端,提供了比較全面的?Redis?命令的操作支持,也是目前使用最廣泛的客戶端。這篇文章主要為大家詳細(xì)介紹了Jedis的使用技巧,需要的可以參考一下2022-12-12redis cluster集群模式下實(shí)現(xiàn)批量可重入鎖
本文主要介紹了使用redis cluster集群版所遇到的問題解決方案及redis可重入鎖是否會(huì)有死鎖的問題等,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02使用SpringBoot?+?Redis?實(shí)現(xiàn)接口限流的方式
這篇文章主要介紹了SpringBoot?+?Redis?實(shí)現(xiàn)接口限流,Redis?除了做緩存,還能干很多很多事情:分布式鎖、限流、處理請(qǐng)求接口冪等,文中給大家提到了限流注解的創(chuàng)建方式,需要的朋友可以參考下2022-05-05