Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Ruby - Mutex baseado em Redis com implementação de expiração


Se você estiver usando o Redis 2.6+, poderá fazer isso de maneira muito mais simples com o mecanismo de script Lua. A documentação do Redis diz:

Um script Redis é transacional por definição, portanto, tudo o que você pode fazer com uma transação Redis também pode ser feito com um script e, geralmente, o script será mais simples e rápido.

Implementá-lo é 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

Uso:
lock("somejob") { do_exclusive_job }