是一個消息的鏈表,是一個異步處理的數(shù)據(jù)處理引擎。
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、成都網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、集團成都企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。核心團隊均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗,服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都白烏魚等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗,同時也獲得了客戶的一致贊賞!PS:可以理解為在redis的list列表中存放消息數(shù)據(jù),然后按照排隊方式先進先出(左進右出;右進左出)
主要應(yīng)用一些延遲或異步操作的場景
比如:發(fā)送郵件、發(fā)送短信、視頻轉(zhuǎn)碼、圖片轉(zhuǎn)碼、日志存儲、導(dǎo)入數(shù)據(jù)等
在發(fā)送郵件或者短信,我們不希望程序一直停留,等待發(fā)送成功才相應(yīng),而是異步進行處理,即:將待發(fā)送的郵件數(shù)據(jù)添加到消息隊列中,然后按照排隊先后進行異步發(fā)送郵件。
不僅能夠提高系統(tǒng)的負荷,還能夠改善因網(wǎng)絡(luò)阻塞導(dǎo)致的數(shù)據(jù)缺失
這個可以理解為:異步處理數(shù)據(jù),不會一次性給服務(wù)器太多壓力,并且不直接操作數(shù)據(jù)庫,減少了數(shù)據(jù)庫的壓力;并且若在網(wǎng)絡(luò)阻塞時,若已經(jīng)添加到消息隊列中,那么這些數(shù)據(jù)會正常執(zhí)行,不會造成丟失
整體思路:
前面提到消息隊列,就相當(dāng)于到銀行窗口排隊,先到的叫號入隊(加入到redis消息隊列),然后排到了則根據(jù)相應(yīng)的叫號出隊。
redis的一些特點:
redis設(shè)計用來做緩存的,但是由于它自身的某種特性使得它可以用來做消息隊列,它有幾個阻塞式的API可以使用,正是這些阻塞式的API讓其有能力做消息隊列;另外,做消息隊列的其他特性例如FIFO(先入先出)也很容易實現(xiàn),只需要一個list對象從頭取數(shù)據(jù),從尾部塞數(shù)據(jù)即可;redis能做消息隊列還得益于其list對象blpop brpop接口以及Pub/Sub(發(fā)布/訂閱)的某些接口,它們都是阻塞版的,所以可以用來做消息隊列。
使用redis的lpush/rpop (rpush/lpop) 命令 簡單實現(xiàn)左進右出 或 右進左出 的list列表。
然后需要開啟一個線程任務(wù)或者定時任務(wù)或者輪詢方式,不停的調(diào)用rpop方法查看List中是否有待處理消息。
缺點:每調(diào)用一次都會發(fā)起一次連接,這會造成不必要的浪費。
1)、如果生產(chǎn)者速度大于消費者消費速度,消息隊列長度會一直增大,時間久了會占用大量內(nèi)存空間。
2)、如果睡眠時間過長,這樣不能處理一些時效性的消息,睡眠時間過短,也會在連接上造成比較大的開銷。
將方案一中的lpop、rpop命令改為使用blpop(左出)、brpop(右出)
這個指令只有在有元素時才返回,沒有則會阻塞直到超時返回null
阻塞實現(xiàn):不用輪詢,當(dāng)隊列key有數(shù)據(jù)時候,就會響應(yīng),這里讀取消息不會一直循環(huán)去讀取,而是一直阻塞,等到有消息過來才讀取。
該指令還提供了優(yōu)先級以及超時參數(shù)
實現(xiàn)隊列優(yōu)先級命令:brpop queue1 queue2 ...
這樣子即可以實現(xiàn)當(dāng)隊列1有數(shù)據(jù)時,優(yōu)先處理,比如銀行vip窗口等
實現(xiàn)超時退出:redis的brpop默認不帶超時參數(shù)(或者說是默認為0(s)),會一直在進程中
實現(xiàn)命令:brpop queue1 timeout
以下使用方案二實現(xiàn)思路
例子:發(fā)送平臺用戶郵箱消息通知(可以多場景、如發(fā)送驗證碼、重置密碼等等)
# 第一步 請求發(fā)送的平臺用戶信息進隊
//...... 獲取用戶信息代碼省略
$userInfo = ['id'=>1, 'name'=>'張三', 'email'=>'393364227@qq.com'];
$redis->lpush('sendEmailQueue', serialize($userInfo)); //serialize 序列化數(shù)組信息,轉(zhuǎn)為字符串
//..... 同步處理,相應(yīng)頁面 發(fā)送成功等信息
# 第二步 在另一個接口類出隊,并且處理消息
$userInfo = unserialize(brpop('sendEmailQueue'));
//sendEmail 開始發(fā)送郵件操作
# 第三步 將第二步的實現(xiàn)接口添加到進程任務(wù),并且開啟進程保護
//可以使用linux下的Supervisor來做進程保護
//啟動隊列進程,即可實現(xiàn)消息隊列去發(fā)送郵件了
The End.
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。