如何清除Sidekiq中的所有作业?

168

我正在Rails应用中使用Sidekiq执行后台任务。现在作业数量变得更多了,所以我想清除所有的作业。我在控制台中尝试了以下命令:

Sidekiq::Queue.new.clear
但它会报以下错误。
NameError: uninitialized constant Sidekiq::Queue 

我该如何清除 Sidekiq 中的所有任务?


在之前尝试使用 include 'sidekiq' - Benj
@BenjaminSinclaire,它正在给出TypeError:错误的参数类型String(期望Module)。 - Can Can
3
请在执行之前尝试 require 'sidekiq' - Uri Agassi
1
我总是(真的总是)混淆include和require :) - Benj
12个回答

289

您可以按照issue 1077中的说明,或者按照此noobsippets博客中所述进行操作。

两种方法都建议我们执行以下操作,可以在Rails控制台上完成:

Sidekiq.redis(&:flushdb)

警告:这个命令会清除所有Redis记录。我建议不要在生产中使用它。

另一种方法是

redis-cli --scan --pattern users: * | xargs redis-cli del
根据这篇博客的说法。

2
你好,Brandeamon。你在使用redis来控制项目的会话吗?因为这些命令是用来“清除”redis中存储的所有数据,相当于关系型数据库中的drop database或drop table。 - jonathanccalixto
3
考虑到该回答获得的投票数,这应该是被认可的答案。 - M. Habib
4
这种方法的问题在于,如果您将同一个redis/elasticache用于不同的服务,则清除redis数据库中的所有其他数据。 - Charles Skariah
1
这是我们发现的唯一可行的方法,以确保所有重复的工作更改都会被捕获。我们每次构建时都运行此操作作为自动化流程的一部分。我们还有一个安全机制来访问此内容并通过我们应用程序的API重新守护Sidekiq(在需要热重载的情况下)。至于刷新其他redis实例,我们有一个专门为Sidekiq运行的docker中的单独redis实例,因此数据污染/丢失对我们的团队不是问题。感谢您发布此内容。 - meoww-
1
请添加免责声明,此操作将清空 Redis 并清除 Redis 盒子上存在的任何其他键。 - Ankit Deshpande
显示剩余3条评论

131

清除 Sidekiq 任务的命令:

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

8
您可以使用 Sidekiq::Queue.all.map(&:clear) 清除所有队列... 当您将本地数据库与生产环境同步时很有用。 - cercxtrova
最佳答案! - r4cc00n

66

47

最新版的Sidekiq已经可以直接使用了:

require 'sidekiq/api'

q = Sidekiq::Queue.new
q.

是的,清除所有内容的命令就是一个炸弹表情符号。也适用于Sidekiq::RetrySet

或者,如果你不想有趣的话,你可以使用q.clear


1
天啊,这是什么鬼?@Xavier,有一个叫“.”的方法吗?你能给我指导一下这个方法的文档吗?() - codemilan
在执行 q. 时,我遇到了 invalid byte sequence in US-ASCII (ArgumentError) 的错误 :/ - Shankar Thyagarajan
我喜欢那段代码! - Toucouleur
这个炸弹表情符号让我笑得很厉害。 - mendespedro

26
redis-cli flushdb

你也可以使用redis-cli flushall


6
这种方法的问题在于,如果您在不同服务间共享相同的Redis/ElastiCache,那么它将清除数据库中所有其他数据。 - Charles Skariah

19

在一行中使用Rails runner

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

16
您可以使用此选项清除所有作业。
require 'sidekiq/api'

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

14
require 'sidekiq/api'

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

13

所有的Sidekiq任务都保存在"Redis"中。

您可以使用此命令清除"Redis"。

redis-cli flushall

2

虽然这方面有很多方法已经在其他答案中得到了详细记录,但是当您遇到 Redis::CommandError (OOM command not allowed when used memory > 'maxmemory'.) 错误时,Sidekiq::Queue#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接