module RubyRedisLock

Constants

LOCK_KEY_BASE
LockAcquisitionTimeoutException
VERSION

Public Instance Methods

lock(lock_name, processing_timeout=60, acquiring_timout=10) { || ... } click to toggle source
# File lib/ruby_redis_lock/ruby_redis_lock.rb, line 6
def lock(lock_name, processing_timeout=60, acquiring_timout=10)
  lock_acquired = acquire_lock(lock_name, processing_timeout, acquiring_timout)
  yield
ensure
  release_lock(lock_name, processing_timeout) if lock_acquired
end

Private Instance Methods

acquire_lock(lock_name, processing_timeout=60, acquiring_timeout=10) click to toggle source
# File lib/ruby_redis_lock/ruby_redis_lock.rb, line 15
def acquire_lock(lock_name, processing_timeout=60, acquiring_timeout=10)
  start_time = Time.now.to_i
  while !try_acquire_lock(lock_name, processing_timeout)
    sleep 0.5
    if (Time.now.to_i - start_time) > acquiring_timeout
      raise LockAcquisitionTimeoutException, "Acquiring lock timeout > #{acquiring_timeout} seconds"
    end
  end
  true
end
release_lock(lock_name, processing_timeout=60) click to toggle source
# File lib/ruby_redis_lock/ruby_redis_lock.rb, line 39
def release_lock(lock_name, processing_timeout=60)
  expiration = self.get(ruby_redis_lock_key(lock_name)).to_i
  return false if Time.now.to_i > expiration

  previous_expiration = self.getset(ruby_redis_lock_key(lock_name), "#{Time.now.to_i + processing_timeout}").to_i

  if expiration == previous_expiration # it still owns the lock
    self.del(ruby_redis_lock_key(lock_name))
    return true
  end

  false
end
ruby_redis_lock_key(lock_name) click to toggle source
# File lib/ruby_redis_lock/ruby_redis_lock.rb, line 53
def ruby_redis_lock_key(lock_name)
  "#{LOCK_KEY_BASE}:#{lock_name}"
end
try_acquire_lock(lock_name, processing_timeout=60) click to toggle source
# File lib/ruby_redis_lock/ruby_redis_lock.rb, line 26
def try_acquire_lock(lock_name, processing_timeout=60)
  ret = self.setnx(ruby_redis_lock_key(lock_name), "#{Time.now.to_i + processing_timeout}")
  return true if ret

  expiration = self.get(ruby_redis_lock_key(lock_name)).to_i
  return false if Time.now.to_i < expiration

  previous_expiration = self.getset(ruby_redis_lock_key(lock_name), "#{Time.now.to_i + processing_timeout}").to_i
  return true if expiration == previous_expiration

  false
end