程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Redis 队列 - 如何恢复大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决redis 队列 - 如何恢复?

开发过程中遇到redis 队列 - 如何恢复的问题如何解决?下面主要结合日常开发的经验,给出你关于redis 队列 - 如何恢复的解决方法建议,希望对你解决redis 队列 - 如何恢复有所启发或帮助;

假设我们有一个要执行的任务列表和一些从该列表中弹出项目的工作程序。 如果工作人员在完成任务执行之前意外崩溃,则该任务将丢失。 什么样的机制可以防止这种情况发生,以便我们重新处理废弃的任务?

解决方法

你需要使用ZSET来解决这个问题

弹出操作

  • 添加到有到期时间的 ZSET
  • 从列表中删除

确认操作

  • 从 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,请注明来意。