Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Antrean redis dengan klaim kedaluwarsa

Untuk mewujudkan antrian sederhana dalam redis yang dapat digunakan untuk mengirim ulang pekerjaan yang macet, saya akan mencoba sesuatu seperti ini:

  • 1 daftar "up_for_grabs"
  • 1 daftar "sedang_bekerja"
  • kunci kedaluwarsa otomatis

seorang pekerja yang mencoba mendapatkan pekerjaan akan melakukan sesuatu seperti ini:

timeout = 3600
#wrap this in a transaction so our cleanup wont kill the task
#Move the job away from the queue so nobody else tries to claim it
job = RPOPLPUSH(up_for_grabs, being_worked_on)
#Set a lock and expire it, the value tells us when that job will time out. This can be arbitrary though
SETEX('lock:' + job, Time.now + timeout, timeout)
#our application logic
do_work(job)

#Remove the finished item from the queue.
LREM being_worked_on -1 job
#Delete the item's lock. If it crashes here, the expire will take care of it
DEL('lock:' + job)

Dan sesekali, kami hanya bisa mengambil daftar kami dan memeriksa bahwa semua pekerjaan yang ada di sana benar-benar memiliki kunci. Jika kami menemukan pekerjaan yang TIDAK memiliki kunci, ini berarti pekerjaan itu kedaluwarsa dan pekerja kami mungkin mogok. kasus ini akan kami kirim ulang.

Ini akan menjadi kode semu untuk itu:

loop do
    items = LRANGE(being_worked_on, 0, -1)
    items.each do |job| 
        if !(EXISTS("lock:" + job))
            puts "We found a job that didn't have a lock, resubmitting"
            LREM being_worked_on -1 job
            LPUSH(up_for_grabs, job)
        end
    end
    sleep 60
end


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara mengimplementasikan Redis Cache dengan Django Rest Framework?

  2. Apakah ada cara untuk menulis kerangka data pyspark ke cache Azure untuk redis?

  3. Redis / Dapatkan semua kunci &nilai dari redis dengan awalan

  4. Hubungkan ke redis dari wadah lain di buruh pelabuhan

  5. Bagaimana cara menjalankan Redis di Windows 32 bit?