如何清除所有来自 Sidekiq 的工作岗位?

我在 Rails 应用程序中使用 sidekiq 做后台任务。现在工作岗位的数量变得更多了,所以我想把所有的工作岗位都清理掉。我在控制台中尝试了以下命令

Sidekiq::Queue.new.clear

但它出现了跟踪错误。

NameError: uninitialized constant Sidekiq::Queue

我怎样才能清除 Sidekiq 的所有工作?

109634 次浏览

根据 Github 上的这个问题: https://github.com/mperham/sidekiq/issues/1732,你现在需要

require 'sidekiq/api'

你可以按照它在 第1077期上说的做,或者按照这个 写博客报告的做

两者都建议我们执行以下操作,并且可以在 Rails 控制台上执行:

Sidekiq.redis(&:flushdb)

警告: 此命令将清除所有重排记录。我建议不要在生产中使用它

另一种方法是

redis-cli --scan --pattern users: * | xargs redis-cli del

根据 这个博客

Clear Sidekiq Jobs 命令:

require 'sidekiq/api'


# Clear retry set


Sidekiq::RetrySet.new.clear


# Clear scheduled jobs


Sidekiq::ScheduledSet.new.clear


# Clear 'Dead' jobs statistics


Sidekiq::DeadSet.new.clear


# Clear 'Processed' and 'Failed' jobs statistics


Sidekiq::Stats.new.reset


# Clear all queues


Sidekiq::Queue.all.map(&:clear)


# Clear specific queue


stats = Sidekiq::Stats.new
stats.queues
# => {"main_queue"=>25, "my_custom_queue"=>1}


queue = Sidekiq::Queue.new('my_custom_queue')
queue.count
queue.clear
redis-cli flushdb

也可以使用 redis-cli flushall

就像最近的 Sidekiq 一样,把它炸掉吧:

require 'sidekiq/api'


q = Sidekiq::Queue.new
q.💣

是的,清除所有的命令是一个字面上的炸弹表情符号。也为 Sidekiq::RetrySet工作。

或者,如果你不好玩,你可以使用 q.clear

在一行中使用 Rails 运行程序

rails runner 'Sidekiq.redis { |conn| conn.flushdb }'

所有 Sidekiq 任务都保存在“ Redis”中。

您可以通过这个命令清理“ Redis”

redis-cli flushall

您可以使用它来清除所有作业

require 'sidekiq/api'


Sidekiq::Queue.all.each(&:clear)
require 'sidekiq/api'


Sidekiq::Queue.all.each {|x| x.clear}

如果要从特定队列中删除作业,请尝试:

queue = Sidekiq::Queue.new("default")
queue.each do |job|
job.klass # => 'TestWorker'
job.args # => ['easy']
job.delete if job.jid == 'abcdef1234567890' || job.klass == 'TestWorker'
end

阅读有关 sidekiq 和重要控制台命令的所有内容 -https://medium.com/@shashwat12june/all-you-need-to-know-about-sidekiq-a4b770a71f8f

我意识到 Sidekiq.redis { |conn| conn.flushdb }删除了 Redis 数据库中的所有键。使用 redis-cli清除所有 sidkiq 队列还有一种更安全的方法:

redis-cli keys "*queue:*" | xargs redis-cli del

使用 SidekiqAPI 也可以实现同样的功能(参见 拉维 · 普拉卡什 · 辛格回答)

虽然这里的其他答案已经很好地记录了很多方法,但是当您运行到 Redis::CommandError (OOM command not allowed when used memory > 'maxmemory'.)时,Sidekiq::Queue#clear无法执行。当这种情况发生时,您仍然可以从问题队列中单独删除记录,直到有足够的内存让 clear 方法工作为止。例如,我在 Rails 控制台中就是这样工作的:

problem_queue_name = 'my_big_queue'
queue = Sidekiq::Queue.new(problem_queue_name)
# Alternate between deleting jobs in a batch and attempting clear until it succeeds
queue.first(10000).each do |q| print('.') if q.delete end; nil
queue.clear