通过字符串匹配批量删除Sidekiq作业

时间:2013-06-14 06:31:18

标签: redis sidekiq

我有一个邮件队列。我想删除该队列中的所有Newsletter个作业,只留下sign_up个邮件。我基本上需要找到包含子字符串'Newsletter'的作业。我怎么能在Rails控制台或redis-cli中做到这一点?

2 个答案:

答案 0 :(得分:2)

根据我的理解,您基本上只是想以原子方式删除其中包含字符串“Newsletter”的密钥作为单个事务。这样做的方法是:

redis-cli -n [some_db] -h [some_host_name] EVAL "return redis.call('DEL', unpack(redis.call('KEYS', '*' .. ARGV[1] .. '*')))" 0 Newsletter

您在上面的代码中所做的是运行一个lua脚本,该脚本查询数据库[some_db]中包含子字符串“Newsletter”的所有键。然后删除所有。这一切都是作为一个单一事务完成的,因此从KEYS运行到删除所有相关密钥的时间,Redis上不会运行其他命令。

相关讨论here

答案 1 :(得分:0)

这里有一个如何删除工作的例子:

name = 'Newsletter'
queue = Sidekiq::Queue.new

queue.each do |job|
   job.delete if job.klass.include? name
end

而不是klass.include?你可以用任何其他类型的东西来匹配你所寻找的东西。