Redis
 sql >> Base de données >  >> NoSQL >> Redis

Ruby - Mutex basé sur Redis avec implémentation d'expiration

Si vous utilisez Redis 2.6+, vous pouvez le faire beaucoup plus simplement avec le moteur de script Lua. La documentation Redis indique :

Un script Redis est transactionnel par définition, donc tout ce que vous pouvez faire avec une transaction Redis, vous pouvez aussi le faire avec un script, et généralement le script sera à la fois plus simple et plus rapide.

Sa mise en œuvre est triviale :

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

Utilisation :

lock("somejob") { do_exclusive_job }