Sha256: b83be88b1ed0b8ace45bf9b4f7fbacd9751d528df72c4bed3ca84adb10fd28fa
Contents?: true
Size: 1.83 KB
Versions: 1
Compression:
Stored size: 1.83 KB
Contents
module RubyRedisLock def lock(lock_name, processing_timeout=60, acquiring_timout=10) acquire_lock(lock_name, processing_timeout, acquiring_timout) yield ensure release_lock(lock_name, processing_timeout) end private 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(rand(100).to_f/100.0) if (Time.now.to_i - start_time) > acquiring_timeout raise Exception, "Acquiring lock timeout > #{acquiring_timeout} seconds" end end return true end 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 == true 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 return false end 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 return false end def ruby_redis_lock_key(lock_name) "RubyRedisLock:#{lock_name}" end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
ruby_redis_lock-0.1.0 | lib/ruby_redis_lock/ruby_redis_lock.rb |