Redis隊列和阻塞隊列的實現(xiàn)
redis 隊列的優(yōu)點是輕量級,業(yè)務足夠簡單時不需要使用rabbitMq這樣專業(yè)的消息中間件;缺點是彈出隊列中的元素時,即使該消息處理失敗也無法再次進行消費
Redis隊列 List

簡單演示如下

普通的redis隊列,為了實現(xiàn)業(yè)務,通常會使用while進行循環(huán),這樣的話沒有消息時依舊會頻繁的執(zhí)行循環(huán),造成cpu的空轉(zhuǎn),所以一般會在代碼中增加sleep來解決該問題,但因此又會造成消息延遲問題。

阻塞隊列可以很好的解決這些問題。
Redis阻塞隊列
redis隊列提供了 “阻塞式” 拉取消息的命令:BRPOP / BLPOP,這里的 B 指的是阻塞(Block)。如果隊列為空,消費者在拉取消息時就「阻塞等待」,一旦有新消息過來,就通知消費者立即處理新消息。

阻塞隊列實現(xiàn):

使用 BRPOP 這種阻塞式方式拉取消息時,還支持傳入一個「超時時間」,如果設置為 0,則表示不設置超時,直到有新消息才返回,否則會在指定的超時時間后返回 NULL
下面是某業(yè)務完整的消費者代碼

注意:
- 阻塞時間結(jié)束后代碼會繼續(xù)向下執(zhí)行
- 如果設置的超時時間太長,這個連接太久沒有活躍過,可能會被 Redis Server 判定為無效連接,之后 Redis Server 會強制把這個客戶端踢下線。所以,客戶端要有處理機制。實際項目中redis連接超時時間遠大于20s,因此正常情況不會出現(xiàn)redis超時問題。以防萬一增加redis異常捕獲,出現(xiàn)異常時殺掉當前進程,同時supervisord會自動重新拉起該進程
到此這篇關(guān)于Redis隊列和阻塞隊列的實現(xiàn)的文章就介紹到這了,更多相關(guān)Redis隊列和阻塞隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis集群模式和常用數(shù)據(jù)結(jié)構(gòu)詳解
Redis集群模式下的運維指令主要用于集群的搭建、管理、監(jiān)控和維護,講解了一些常用的Redis集群運維指令,本文重點介紹了Redis集群模式和常用數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2024-03-03

