我在一个rails-3项目中使用Resque来处理每5分钟运行的任务。最近我做了一些导致这些任务数量不断增加的事情,导致堆栈中积累了超过1000个任务。我解决了导致这么多任务排队的问题,但现在我面临的问题是由错误创建的任务仍然存在,因此测试变得困难,因为一个队列中有1000多个任务。 我似乎无法停止这些任务。我尝试使用flushall命令从redis-cli中删除队列,但它没有起作用。我错过了什么吗?因为我似乎找不到摆脱这些任务的方法。
我在一个rails-3项目中使用Resque来处理每5分钟运行的任务。最近我做了一些导致这些任务数量不断增加的事情,导致堆栈中积累了超过1000个任务。我解决了导致这么多任务排队的问题,但现在我面临的问题是由错误创建的任务仍然存在,因此测试变得困难,因为一个队列中有1000多个任务。 我似乎无法停止这些任务。我尝试使用flushall命令从redis-cli中删除队列,但它没有起作用。我错过了什么吗?因为我似乎找不到摆脱这些任务的方法。
参考以上回答,如果您需要清除所有队列,可以使用以下命令:
Resque.queues.each{|q| Resque.redis.del "queue:#{q}" }
如果你打开Rails控制台,可以运行以下代码来清空你的队列:
queue_name = "my_queue"
Resque.redis.del "queue:#{queue_name}"
Resque已经有一个进行此操作的方法 - 尝试使用Resque.remove_queue(queue_name)
(在这里查看文档here)。内部它执行Resque.redis.del()
,但它还要进行其他清理,并且通过使用api方法(而不是假设resque的工作方式),您将更具未来性。
这是目前有效的方法:
Resque.remove_queue("...")
Resque.queues.each {|queue| Resque.remove_queue(queue)}
进入Redis控制台:
redis-cli
127.0.0.1:6379> KEYS *
1) "resque:schedules_changed"
2) "resque:workers"
3) "resque:queue:your_overloaded_queue"
"resque:queue:your_overloaded_queue"
是需要的数据库。
然后运行:
"DEL resque:queue:your_overloaded_queue
如果您想要从队列中删除指定的作业,则使用LRANGE
命令从数据库中列出几个值:
127.0.0.1:6379> LRANGE resque:queue:your_overloaded_queue 0 2
1) "{\"class\":\"AppClass\",\"args\":[]}"
2) "{\"class\":\"AppClass\",\"args\":[]}"
3) "{\"class\":\"AppClass\",\"args\":[]}"
然后将一个值复制/粘贴到LREM
命令中:
127.0.0.1:6379> LREM resque:queue:your_overloaded_queue 5 "{\"class\":\"AppClass\",\"args\":[]}"
(integer) 5
这里的“5”是需要移除的元素数量。
KEYS *
命令(https://redis.io/commands/keys),因为它会扫描整个键集并锁定所有记录。这可能会对非常繁忙的系统上的后台工作人员产生不利影响。 - jwadsack