Class: Redlock::Client::RedisInstance

Inherits:
Object
  • Object
show all
Defined in:
lib/redlock/client.rb,
lib/redlock/testing.rb

Constant Summary collapse

UNLOCK_SCRIPT =
<<-eos
  if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
  else
    return 0
  end
eos
LOCK_SCRIPT =
<<-eos
  if (redis.call("exists", KEYS[1]) == 0 and ARGV[3] == "yes") or redis.call("get", KEYS[1]) == ARGV[1] then
    return redis.call("set", KEYS[1], ARGV[1], "PX", ARGV[2])
  end
eos

Instance Method Summary collapse

Constructor Details

#initialize(connection) ⇒ RedisInstance

Returns a new instance of RedisInstance.



99
100
101
102
103
104
105
106
107
# File 'lib/redlock/client.rb', line 99

def initialize(connection)
  if connection.respond_to?(:client)
    @redis = connection
  else
    @redis = Redis.new(connection)
  end

  load_scripts
end

Instance Method Details

#load_scriptsObject



125
126
127
128
# File 'lib/redlock/client.rb', line 125

def load_scripts
  @unlock_script_sha = @redis.script(:load, UNLOCK_SCRIPT)
  @lock_script_sha = @redis.script(:load, LOCK_SCRIPT)
end

#load_scripts_without_testingObject



28
29
30
31
# File 'lib/redlock/testing.rb', line 28

def load_scripts
  @unlock_script_sha = @redis.script(:load, UNLOCK_SCRIPT)
  @lock_script_sha = @redis.script(:load, LOCK_SCRIPT)
end

#lock(resource, val, ttl, allow_new_lock) ⇒ Object



109
110
111
112
113
# File 'lib/redlock/client.rb', line 109

def lock(resource, val, ttl, allow_new_lock)
  recover_from_script_flush do
    @redis.evalsha @lock_script_sha, keys: [resource], argv: [val, ttl, allow_new_lock]
  end
end

#unlock(resource, val) ⇒ Object



115
116
117
118
119
120
121
# File 'lib/redlock/client.rb', line 115

def unlock(resource, val)
  recover_from_script_flush do
    @redis.evalsha @unlock_script_sha, keys: [resource], argv: [val]
  end
rescue
  # Nothing to do, unlocking is just a best-effort attempt.
end