Bagaimana cara menghapus semua pekerjaan dari Sidekiq?

119

Saya menggunakan sidekiq untuk tugas latar belakang di aplikasi Rails. Sekarang jumlah pekerjaan menjadi lebih banyak, jadi saya ingin menghapus semua pekerjaan. Saya mencoba perintah berikut di konsol

Sidekiq::Queue.new.clear

tapi itu memberikan kesalahan berikut.

NameError: uninitialized constant Sidekiq::Queue 

Bagaimana cara menghapus semua pekerjaan dari sidekiq?

Bisa bisa
sumber
coba include 'sidekiq'sebelumnya
Benj
@BenjaminSinclaire yang memberikan TypeError: jenis argumen yang salah String (Modul yang diharapkan)
Dapat
3
coba require 'sidekiq'sebelumnya
Uri Agassi
1
Saya selalu (benar-benar selalu) bingung memasukkan dan membutuhkan :)
Benj

Jawaban:

207

Anda dapat melakukan apa yang dikatakan pada masalah 1077 atau seperti yang dilaporkan di blog ini di noobsippets

Keduanya menyarankan kami melakukan hal berikut, dan dapat dilakukan di konsol rel:

Sidekiq.redis { |conn| conn.flushdb }

jonathanccalixto
sumber
Ini tampaknya mengatur ulang otentikasi saya pada aplikasi Rails yang saya gunakan (yang berarti saya harus menyalin cookie kembali ke klien HTTP saya). Apakah ada cara untuk mencegahnya?
intcreator
1
Halo, Brandeamon. Apakah Anda menggunakan redis untuk mengontrol sesi proyek Anda? Karena perintah ini adalah untuk "membersihkan" semua data yang disimpan di redis, ini setara dengan drop database atau drop table di database relasional.
jonathanccalixto
1
Ini harus menjadi jawaban yang diterima mengingat suaranya.
M. Habib
Ini bekerja lebih dapat diprediksi daripada redis-cli flushdbjika Anda menjalankan redis di server terpisah dari server rel Anda. Saya bertanya-tanya mengapa redis-cli flushdbtidak berhasil sampai saya ingat saya perlu memasukkan argumen host dan port.
Maurice
4
Masalah dengan pendekatan ini adalah jika Anda berbagi redis / elasticache yang sama di layanan yang berbeda, semua data lain di db redis juga akan dihapus.
Charles Skariah
80

Hapus perintah 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 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
rusllonrails
sumber
3
Anda juga dapat menghapus semua antrian dengan Sidekiq::Queue.all.map(&:clear)... Berguna bila Anda menyinkronkan db lokal Anda dengan prod 😅
escanxr
36

Untuk Sidekiq terbaru, ledakkan saja:

require 'sidekiq/api'

q = Sidekiq::Queue.new
q.💣

Ya, perintah untuk menghapus semua secara harfiah adalah emoji bom. Juga bekerja untuk Sidekiq::RetrySet.

Atau jika Anda tidak menyenangkan, Anda dapat menggunakannya q.clear

Xavier
sumber
1
OMG, apa ini? @Xavier, apakah ada metode bernama .💣, dapatkah Anda memandu saya dokumen tentang metode ini (💣).
codemilan
2
@codemilan Lihat posting blog ini: blog.honeybadger.io/…
Modus Tollens
Saya mulai invalid byte sequence in US-ASCII (ArgumentError)mengeksekusi q.💣: /
Shankar Thyagarajan
21
redis-cli flushdb

Anda juga bisa menggunakan redis-cli flushall

Sai Ram Reddy
sumber
5
Masalah dengan pendekatan ini adalah jika Anda berbagi redis / elasticache yang sama di layanan yang berbeda, semua data lain di db juga akan dihapus.
Charles Skariah
13

Gunakan pelari Rails dalam satu baris

rails runner 'Sidekiq.redis { |conn| conn.flushdb }'
fangxing
sumber
10

Semua tugas Sidekiq disimpan di "Redis".

Anda dapat membersihkan "Redis" dengan perintah ini

redis-cli flushall
Andriy Kondzolko
sumber
8

Anda dapat menggunakan ini untuk membersihkan semua pekerjaan

require 'sidekiq/api'

Sidekiq::Queue.all.each(&:clear)
Ravi Prakash Singh
sumber
1
require 'sidekiq/api'

Sidekiq::Queue.all.each(&:clear)
Nicolás Schmidt Gubbins
sumber
Jawaban ini adalah duplikat dari stackoverflow.com/a/56488682/3676469
Hirurg103
0

Saya menyadari bahwa Sidekiq.redis { |conn| conn.flushdb }menghapus semua kunci dari database redis. Ada cara yang lebih aman untuk menghapus semua antrian sidekiq menggunakan redis-cli:

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

Hal yang sama dapat dicapai dengan API Sidekiq (lihat jawaban Ravi Prakash Singh )

Hirurg103
sumber