这是我的场景,我正在使用 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/