sql >> Base de Datos >  >> NoSQL >> Redis

Ruby:mutex basado en Redis con implementación de caducidad

Si está utilizando Redis 2.6+, puede hacerlo de manera mucho más sencilla con el motor de secuencias de comandos Lua. La documentación de Redis dice:

Una secuencia de comandos de Redis es transaccional por definición, por lo que todo lo que puede hacer con una transacción de Redis también puede hacerlo con una secuencia de comandos y, por lo general, la secuencia de comandos será más simple y más rápida.

Implementarlo es 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 }