概述
? ? 在處理Web客戶端發(fā)送的命令請求時,某些操作的執(zhí)行時間可能會比我們預(yù)期的更長一些。通過將待執(zhí)行任務(wù)的相關(guān)信息放入隊列里面接校,并在之后對隊列進(jìn)行處理,用戶可以推遲執(zhí)行那些需要一段時間才能完成的操作狮崩,這種將工作交給任務(wù)處理器來執(zhí)行的做法稱為任務(wù)隊列蛛勉。
單任務(wù)隊列
? ? 先進(jìn)先出隊列需要用到redis的列表結(jié)構(gòu)。redis的列表結(jié)構(gòu)允許用戶通過RPUSH和LPUSH睦柴,以及RPOP和LOP诽凌,從列表的兩端推入和彈出元素。
如下是最簡單的單任務(wù)隊列:
多任務(wù)隊列
? ? BLPOP命令每次只會從隊列里面彈出一包數(shù)據(jù)坦敌,所以待處理的數(shù)據(jù)不會重復(fù)處理侣诵。該工作進(jìn)程要處理的任務(wù)是非常單一的招刹。在某些情況下,為每種任務(wù)單獨使用一個隊列的做法并不少見窝趣,但是在另外一些情況下疯暑,如果一個隊列能夠處理多種不同類型的任務(wù),那么事情會方便很多哑舒。
? ? 下面代碼中展示的工作進(jìn)程會監(jiān)事用戶提供的多個隊列妇拯,并從多個已知的已注冊回調(diào)函數(shù)里面,選出一個函數(shù)來處理json編碼的函數(shù)調(diào)用洗鸵。隊列中每個待執(zhí)行任務(wù)的格式都為['FUNCTION_NAME',[ARG1,ARG2,...]]越锈。
任務(wù)優(yōu)先級
? ? 在使用隊列的時候,程序可能會需要讓特定的操作優(yōu)先于其他操作執(zhí)行膘滨。假設(shè)現(xiàn)在我們需要為任務(wù)設(shè)置高甘凭、中、低3種優(yōu)先級別火邓,其中:高優(yōu)先級任務(wù)在出現(xiàn)之后會第一時間被執(zhí)行丹弱,而中等;優(yōu)先級任務(wù)則會在沒有任何高優(yōu)先級任務(wù)存在的情況下被執(zhí)行铲咨,而低優(yōu)先級任務(wù)則會在既沒有高優(yōu)先級任務(wù)躲胳,又沒有任何中等優(yōu)先級任務(wù)的情況下被執(zhí)行。實際上我們只需要修改worker_watch_queue()函數(shù)的兩行代碼纤勒,就可以給任務(wù)隊列加上優(yōu)先級特性坯苹。
? ? 同時使用多個隊列可以降低實現(xiàn)優(yōu)先級特性的難度。除此之外摇天,多隊列有時候也會被用于分隔不同的任務(wù)粹湃,在這種情況下,處理不同隊列時可能會出現(xiàn)不公平的現(xiàn)象泉坐。為此为鳄,我們可以偶爾重新排列各個隊列的順序呢,使得針對隊列的處理操作變得更公平一些——當(dāng)某個隊列的增長速度比其他隊列的增長速度快的時候坚冀,這種重排操作尤為重要济赎。