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