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

Ruby - Mutex basato su Redis con implementazione della scadenza

Se stai usando Redis 2.6+, puoi farlo in modo molto più semplice con il motore di scripting Lua. La documentazione Redis dice:

Uno script Redis è transazionale per definizione, quindi tutto ciò che puoi fare con una transazione Redis lo puoi fare anche con uno script, e di solito lo script sarà più semplice e veloce.

Implementarlo è banale:

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

Utilizzo:

lock("somejob") { do_exclusive_job }