sql >> Database teknologi >  >> NoSQL >> Redis

Redis kø med krav udløber

For at realisere en simpel kø i redis, der kan bruges til at genindsende nedbrudte job, ville jeg prøve noget som dette:

  • 1 liste "up_for_grabs"
  • 1 liste "being_worked_on"
  • automatisk udløbende låse

en arbejder, der prøver at få et job, ville gøre noget som dette:

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)

Og nu og da kunne vi bare gribe vores liste og tjekke, at alle job, der er derinde, rent faktisk har en lås. Hvis vi finder job, der IKKE har en lås, betyder det, at den er udløbet, og at vores arbejder sandsynligvis er gået ned. denne sag ville vi genindsende.

Dette ville være pseudokoden for det:

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. Hvordan failover til ny Master node, når du bruger Redis med Sentinel og redis-py?

  2. MongoDB GUI-klient (cross-platform eller Linux)

  3. Sådan summerer du værdien af ​​en nøgle på tværs af alle dokumenter i en MongoDB-samling

  4. Hvordan bruger man Elasticsearch med MongoDB?