大佬教程收集整理的这篇文章主要介绍了Redis 队列 - 如何恢复,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我们有一个要执行的任务列表和一些从该列表中弹出项目的工作程序。 如果工作人员在完成任务执行之前意外崩溃,则该任务将丢失。 什么样的机制可以防止这种情况发生,以便我们重新处理废弃的任务?
你需要使用ZSET来解决这个问题
弹出操作
确认操作
工人
您需要运行一个计划的工作程序,如果它们过期,它将把项目从 ZSET 移到列表
详细阅读,我在 Rqueue https://medium.com/@sonus21/introducing-rqueue-redis-queue-d344f5c36e1b 中是怎么做的
Github 代码:https://github.com/sonus21/rqueue
, set 或 zset 成员没有 EXPIRE
并且没有从 zset 弹出和推送到列表的原子操作。所以我写完了这个原子运行的lua脚本。
首先,我向 execuTing-tasks
zset 添加一个带有时间戳分数的任务(javascript 中的 (new Date()).valueOf()
):
ZADD 1619028226766 execuTing-tasks
然后我运行脚本:
EVAL [THE SCRIPT] 2 execuTing-tasks tasks 1619028196766
如果任务超过 30 秒,它将被发送到 tasks
列表。如果没有,它将被发送回 execuTing-tasks
zset。
这是脚本
local source = KEYS[1]
local desTination = KEYS[2]
local min_score = ARGV[1]
local popped = redis.call('zpopmin',sourcE)
local id = popped[1]
local score = popped[2]
if table.getn(popped) > 0 then
if score < min_score then
redis.call('rpush',desTination,id)
return { "RESTORED",id }
else
redis.call('zadd',source,score,id)
return { "SENT_BACK",id }
end
end
return { "NOTHING_DONE" }
以上是大佬教程为你收集整理的Redis 队列 - 如何恢复全部内容,希望文章能够帮你解决Redis 队列 - 如何恢复所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。