sql >> Database >  >> NoSQL >> Redis

Redis-wachtrij met claim verlopen

Om een ​​eenvoudige wachtrij in redis te realiseren die kan worden gebruikt om gecrashte taken opnieuw in te dienen, zou ik zoiets als dit proberen:

  • 1 lijst "up_for_grabs"
  • 1 lijst "bezig zijn"
  • automatisch verlopende vergrendelingen

een werknemer die een baan probeert te grijpen, zou zoiets als dit doen:

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)

En zo nu en dan kunnen we gewoon onze lijst pakken en controleren of alle banen die erin staan, echt een slot hebben. Als we banen vinden die GEEN slot hebben, betekent dit dat deze is verlopen en dat onze werknemer waarschijnlijk is gecrasht. deze zaak zouden we opnieuw indienen.

Dit zou de pseudo-code daarvoor zijn:

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. Hoe Redis massa-insertie gebruiken?

  2. Hoe kan ik een index maken met pymongo

  3. Meteor mongo werkt geneste array bij

  4. Moet ik een mangoestverbinding handmatig sluiten?