class RedisMutex

Constants

MutexNotLockedError
SCRIPTS
VERSION

Attributes

token[RW]

Public Class Methods

def_redis_script(name, source) click to toggle source
# File lib/redis_mutex.rb, line 8
def self.def_redis_script(name, source)
  SCRIPTS[name] = {
    source: source,
    sha: Digest::SHA1.hexdigest(source),
  }
end
new(redis, name, token=nil) click to toggle source
# File lib/redis_mutex.rb, line 15
def initialize(redis, name, token=nil)
  @redis = redis
  @name = name
  @token = token || SecureRandom.base64(16)
end

Public Instance Methods

acquire_lock(expire) click to toggle source

returns true if you got the lock, false otherwise

# File lib/redis_mutex.rb, line 28
def acquire_lock(expire)
  @redis.set(key, token, nx: true, ex: expire)
end
key() click to toggle source
# File lib/redis_mutex.rb, line 21
def key
  ['mutex', @name].join(':')
end
locked?() click to toggle source
# File lib/redis_mutex.rb, line 66
def locked?
  @redis.get(key) == token
end
release() click to toggle source
# File lib/redis_mutex.rb, line 39
def release
  run_script(:compare_and_delete, [key], [token]) or raise MutexNotLockedError
end
renew(expire) click to toggle source
# File lib/redis_mutex.rb, line 50
def renew(expire)
  run_script(:compare_and_expire, [key], [token, expire]) or raise MutexNotLockedError
end
set_token(new_token) click to toggle source
# File lib/redis_mutex.rb, line 61
def set_token(new_token)
  run_script(:compare_and_swap, [key], [token, new_token]) or raise MutexNotLockedError
  @token = new_token
end
verify!() click to toggle source
# File lib/redis_mutex.rb, line 70
def verify!
  locked? or raise MutexNotLockedError
end

Private Instance Methods

run_script(name, keys, args) click to toggle source
# File lib/redis_mutex.rb, line 76
def run_script(name, keys, args)
  script = SCRIPTS.fetch(name)
  @redis.evalsha(script.fetch(:sha), keys, args)
rescue Redis::CommandError
  @redis.eval(script.fetch(:source), keys, args)
end