ruby-on-rails - 即使在 Resque 作业成功完成后,Redis 键也没有被删除

标签 ruby-on-rails cron redis resque jobs

这是我的场景,我正在使用 resque在 Redis 中排队作业,这是在 ROR 中完成的通常方式。我的 key 格式看起来像这样(根据我的命名空间约定)

"resque:lock:Jobs::XYZ::SomeCreator-{:my_ids=>[101]}"

作业成功运行到完成。但是key还在redis中。对于某个流程,我需要为相同的参数( key 基本上相同)再次排队并执行作业。但似乎这项工作没有排队。

我的猜测是,由于该键已经存在于 Redis 中,因此它不会再次对作业进行排队。

问题:

resque 的这种行为是否正常(成功完成后不删除 key )?

如果是,我应该如何处理这种情况(根据最佳实践)?

如果不是,你能帮我理解哪里出了问题吗?

最佳答案

经过几个小时的调试,最终观察到的行为是这样的:

  • 我正在创建作业并使用 symbolized keys 传递选项(参数),这在为同一作业创建 Redis key 时在 key 中使用符号化参数。

示例:

Jobs::Abc::SomeJobCreator.create({:some_ids => [101]}) 将创建 "redis key" 作为 "resque :lock:Jobs::Abc::SomeJobCreator.create({:some_ids => [101]})"(注意键是键中的一个符号)

  • 现在,当 after_perform_hook 执行时,它会尝试删除 Redis 键,但它会使用字符串化键搜索键:"resque:lock:Jobs::Abc::SomeJobCreator -({\"some_ids\"=>[101]}" 这显然是找不到的,因为 Redis 中的键已经在键中符号化了参数。

  • 为了解决这个问题,我不得不在代码中更改对创建工作的调用,并使用像这样的字符串化参数:Jobs::Abc::SomeJobCreator.create({'some_ids' => [101 ]})。这很好用。

不确定这是否与 Resque 的版本有关。由于它是一个旧代码库,我还没有更新版本。目前为 Resque v1.25.2

关于ruby-on-rails - 即使在 Resque 作业成功完成后,Redis 键也没有被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057790/

相关文章:

.net - Python MVC 框架、.NET、Rails(中间件)

bash - Bash 脚本上的 Cron Pipe zcat 不起作用

linux - echo 在 linux 系统的 cron 作业中打印

python - 将元组的python列表存储在redis排序集中,其中元组的第二个元素用作分数

mysql - #<Mysql2::错误:用户 'root' @'localhost' 的访问被拒绝(使用密码:NO)>

ruby-on-rails - 在引发错误的方法中调用 RSpec 测试 Rollbar

ruby-on-rails - Ruby/Rails - 获取前一个星期五? (上周周五)

linux - 为 nodejs 运行 cron 并删除临时文件

laravel - redis - 显示小于 $foo 的值

redis - Jedis Client的RedisTemplate如何在一次调用中获取多个列表值