Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Ruby – Redis-basierter Mutex mit Expiration-Implementierung

Wenn Sie Redis 2.6+ verwenden, können Sie dies viel einfacher mit der Lua-Skript-Engine tun. Die Redis-Dokumentation sagt:

Ein Redis-Skript ist per Definition transaktional, also können Sie alles, was Sie mit einer Redis-Transaktion tun können, auch mit einem Skript tun, und normalerweise ist das Skript sowohl einfacher als auch schneller.

Die Implementierung ist trivial:

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

Verwendung:

lock("somejob") { do_exclusive_job }