全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解redis是如何实现队列消息的ack

前言

由于公司提供的队列实在太过而且还限制不能使用其他队列,但为了保证数据安全性需要一个可以有ack功能的队列。

原生的redis中通过L/R PUSH/POP方式来实现队列的功能,这个当然是没办法满足需求的(没有ack功能),所以需要自己对redis的list(队列)做个小小的调整。

大体思路为在POP时将pop出的数据放到备份的地方,当有ACK请求(确认消息被消耗)后将备份的信息删除掉;每次在pop前需要检查备份队列中有没有过期的数据没有ack的,如果有则PUSH到list中后再从list中POP出来。

以下脚本使用lua实现,只需要在执行前加载到redis中即可。

消息本身需要包含id属性

push没什么问题,原生即可(此处以LPUSH为例)

pop时脚本

local not_empty = function(x)
 return (type(x) == "table") and (not x.err) and (#x ~= 0)
end

local qName = ARGV[1] --队列名称
local currentTime = ARGV[2] --当前时间,这个需要从外部传入,不能使用redis自身时间,如果使用自身时间可能导致redis本身的backup在重放请求时出现不一致性
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]))
end
tmp = 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)
end
return 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这两个脚本,后面直接调用这两个脚本的sha值即可执行。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# redis 消息队列 ack  # 消息队列 ack  # redis 消息队列  # 只需  # 这两个  # 还没有  # 中有  # 要在  # 没办法  # 太过  # 做个  # 为例  # 要将  # 这篇文章  # 后将  # 谢谢大家  # 来实现  # 时将  # 重放  # 删除掉  # 加载  # 没什么  # 直接调用 


相关文章: 制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  存储型VPS适合搭建中小型网站吗?  如何配置支付宝与微信支付功能?  如何快速搭建二级域名独立网站?  如何在橙子建站中快速调整背景颜色?  建站主机服务器选型指南与性能优化方案解析  南平网站制作公司,2025年南平市事业单位报名时间?  广州营销型建站服务商推荐:技术优势与SEO优化解析  实现虚拟支付需哪些建站技术支撑?  建站之星安装后如何配置SEO及设计样式?  宝塔面板创建网站无法访问?如何快速排查修复?  在线制作视频网站免费,都有哪些好的动漫网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何在阿里云高效完成企业建站全流程?  高端网站建设与定制开发一站式解决方案 中企动力  如何自定义建站之星网站的导航菜单样式?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  建站之星会员如何解锁更多建站功能?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  c++ stringstream用法详解_c++字符串与数字转换利器  佛山企业网站制作公司有哪些,沟通100网上服务官网?  平台云上自助建站如何快速打造专业网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何在建站之星绑定自定义域名?  建站之星安装需要哪些步骤及注意事项?  建站主机选哪种环境更利于SEO优化?  如何配置FTP站点权限与安全设置?  网站制作价目表怎么做,珍爱网婚介费用多少?  北京的网站制作公司有哪些,哪个视频网站最好?  建站之星安装提示数据库无法连接如何解决?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  建站之星如何优化SEO以实现高效排名?  青岛网站建设如何选择本地服务器?  如何选择高效稳定的ISP建站解决方案?  建站为何优先选择香港服务器?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  如何快速启动建站代理加盟业务?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  郑州企业网站制作公司,郑州招聘网站有哪些?  开源网站制作软件,开源网站什么意思?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  建站之星伪静态规则如何设置?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  常州企业网站制作公司,全国继续教育网怎么登录?  建站主机是否属于云主机类型?  如何通过.red域名打造高辨识度品牌网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何快速生成可下载的建站源码工具?  建站之星安装路径如何正确选择及配置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。