国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Redis > 正文

Redis實現(xiàn)隊列消息的ack機制

2020-02-17 14:53:52
字體:
供稿:網(wǎng)友

在這篇文章中,武林技術頻道的編輯主要介紹下關于Redis實現(xiàn)隊列消息的ack機制,文中介紹的那是相當?shù)脑敿氞?,心動了吧,那就跟上武林小編一起行動起來吧,一起來了解下其中的詳情?/p>

由于公司提供的隊列實在太過于蛋疼而且還限制不能使用其他隊列,但為了保證數(shù)據(jù)安全性需要一個可以有ack功能的隊列。

原生的redis中通過L/R PUSH/POP方式來實現(xiàn)隊列的功能,這個當然是沒辦法滿足需求的(沒有ack功能),所以需要自己對redis的list(隊列)做個小小的調(diào)整。

大體思路為在POP時將pop出的數(shù)據(jù)放到備份的地方,當有ACK請求(確認消息被消耗)后將備份的信息刪除掉;每次在pop前需要檢查備份隊列中有沒有過期的數(shù)據(jù)沒有ack的,如果有則PUSH到list中后再從list中POP出來。

以下腳本使用lua實現(xiàn),只需要在執(zhí)行前加載到redis中即可。

消息本身需要包含id屬性

push沒什么問題,原生即可(此處以LPUSH為例)

pop時腳本

local not_empty = function(x) return (type(x) == "table") and (not x.err) and (#x ~= 0)endlocal qName = ARGV[1] --隊列名稱local currentTime = ARGV[2] --當前時間,這個需要從外部傳入,不能使用redis自身時間,如果使用自身時間可能導致redis本身的backup在重放請求時出現(xiàn)不一致性local considerAsFailMaxTimeSpan = ARGV[3] --超時時間設定,當消息超過一定時間還沒有ack則認為此消息需要再次入隊local zsetName= qName ..'BACKUP'local hashName= qName ..'CONTEXT'local tmp = redis.call('ZRANGEBYSCORE',zsetName , '-INF', tonumber(currentTime) - tonumber(considerAsFailMaxTimeSpan), 'LIMIT', 0, 1)if (not_empty(tmp)) then redis.call('ZREM', zsetName, tmp[1]) --此處拿出的為消息的唯一id redis.call('LPUSH', qName, redis.call('HGET', hashName, tmp[1]))endtmp = redis.call('RPOP', qName)if (tmp) then local msg = cjson.decode(tmp) local id = msg['id'] redis.call('ZADD', zsetName, tonumber(currentTime), id) redis.call('HSET',hashName , id, tmp)endreturn tmp

ack時候比較簡單,只需要將指定id從set和hash中刪除即可

 local key = ARGV[1] local qName=ARGV[2] redis.call('ZREM', qName..'BACKUP', key) redis.call('HDEL', qName..'CONTEXT', key)

在程序中使用前需要顯示load這兩個腳本,后面直接調(diào)用這兩個腳本的sha值即可執(zhí)行。

總結(jié)

以上就是Redis實現(xiàn)隊列消息的ack機制的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林技術頻道的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 登封市| 富阳市| 巩义市| 离岛区| 宣威市| 宕昌县| 阿克| 抚州市| 宁晋县| 明溪县| 益阳市| 永善县| 彰化县| 休宁县| 商洛市| 综艺| 张家港市| 色达县| 呼玛县| 三河市| 荃湾区| 张家港市| 常州市| 西盟| 邹平县| 达孜县| 云和县| 潢川县| 那坡县| 滨海县| 军事| 苗栗市| 瑞昌市| 灵寿县| 土默特右旗| 南川市| 山东省| 沽源县| 酉阳| 江津市| 武清区|