sql >> Databasteknik >  >> NoSQL >> Redis

Ruby - Redis-baserad mutex med utgångsimplementering

Om du använder Redis 2.6+ kan du göra detta mycket enklare med Lua-skriptmotorn. Redis-dokumentationen säger:

Ett Redis-skript är transaktionellt per definition, så allt du kan göra med en Redis-transaktion kan du också göra med ett skript, och vanligtvis blir skriptet både enklare och snabbare.

Att implementera det är trivialt:

LUA_ACQUIRE = "return redis.call('setnx', KEYS[1], 1) == 1 and redis.call('expire', KEYS[1], KEYS[2]) and 1 or 0"
def lock(key, timeout = 3600)
  if redis.eval(LUA_ACQUIRE, key, timeout) == 1
    begin
      yield
    ensure
      r.del key
    end
  end
end

Användning:

lock("somejob") { do_exclusive_job }


  1. Hur man installerar Apache CouchDB i Ubuntu 20.04

  2. Fråga Mongodb om månad, dag, år... för ett datum och tid

  3. Pivotera rader till kolumner i MongoDB

  4. redis-py :Vad är skillnaden mellan StrictRedis() och Redis()?