前言

由于公司提供的队列实在太过而且还限制不能使用其他队列,但为了保证数据安全性需要一个可以有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小时内与您取得联系。