原文作者: xingguang
原文鏈接:https://www.tiance.club/post/4033908611.html
隊(duì)列本身其實(shí)是個(gè)有序的列表苹祟,而Redis是支持list的予跌,可以利用redis的列表(List)來(lái)實(shí)現(xiàn)簡(jiǎn)單隊(duì)列螟深。
一般有兩種方式:
1变屁、LPUSH(頭部插入)和RPOP(尾部彈出)
2谊迄、RPUSH(尾部插入)和LPOP(頭部彈出)
兩種均可令宿,下面示例使用的是:第一種:LPUSH和RPOP寇荧。
一般開(kāi)發(fā)的時(shí)候我們會(huì)分為生產(chǎn)者和消費(fèi)者刽脖,生產(chǎn)者生產(chǎn)消息羞海,消費(fèi)者獲取消息進(jìn)行處理。
原文作者: xingguang
原文鏈接:https://www.tiance.club/post/4033908611.html
Producer:
redis->lpush(‘joblist’, ‘this is Job-1’);
redis->lpush(‘joblist’, ‘this is Job-2’);
….
Cosumer:
job = redis->rpop(‘joblist’);// return Job-1
done the job….
job = redis->rpop(‘joblist’);// return Job-2
done the job…
需要注意的是redis實(shí)現(xiàn)的消息隊(duì)列功能本身存在一些缺陷曲管,這也是redis本身的限制却邓,一個(gè)重要的缺陷在于沒(méi)有類似RabbitMQ那樣成熟的ACK消息確認(rèn)機(jī)制(雖然redis也可以通過(guò)代碼層自己封裝寫(xiě)個(gè)ack消息確認(rèn)機(jī)制,但相對(duì)比較繁雜院水。一般常見(jiàn)的思路是POP時(shí)將pop出的數(shù)據(jù)放到備份的地方腊徙,當(dāng)有ACK請(qǐng)求(確認(rèn)消息被消耗)后將備份的信息刪除掉;每次在pop前需要檢查備份隊(duì)列中有沒(méi)有過(guò)期的數(shù)據(jù)沒(méi)有ack的檬某,如果有則PUSH到list中后再?gòu)膌ist中POP出來(lái)撬腾。)
一般來(lái)說(shuō)如果對(duì)數(shù)據(jù)沒(méi)有極高要求的又不想搭建其他QM組件的話可以直接用redis的list功能實(shí)現(xiàn),如果對(duì)數(shù)據(jù)冪等性恢恼、一致性有要求的話建議使用RabbitMQ(目前功能最完善的企業(yè)級(jí)MQ產(chǎn)品民傻,雖然吞吐量不是最強(qiáng)的,但足以應(yīng)付絕大多數(shù)公司的流量)或者不想自己搭建的話也可以直接使用第三方的消息隊(duì)列產(chǎn)品场斑,比如阿里云的消息隊(duì)列漓踢,安全性能均有保障。
原文作者: xingguang
原文鏈接:https://www.tiance.club/post/4033908611.html