lib/redis_lock.rb in redis_lock-0.2.0 vs lib/redis_lock.rb in redis_lock-0.3.0

- old
+ new

@@ -11,14 +11,26 @@ def self.setup yield config end + def self.semaphore(key, args = {}, &block) + setup_instance(key, args).semaphore(args, &block) + end + + def self.if_open(key, args = {}, &block) + setup_instance(key, args).if_open(args, &block) + end + + def self.if_locked(key, args = {}, &block) + setup_instance(key, args).if_locked(args, &block) + end + def config; self.class.config; end def initialize(key, opts = {}) - @key = key + @key = "REDISLOCK::#{key}" @redis = opts[:redis] end def redis @redis ||= config.redis @@ -37,10 +49,22 @@ { ex: expiration_time } end redis.set(key, value, args.merge(opts)) == "OK" ? true : false end + def semaphore(args = {}, &block) + ttl = args[:ttl] || config.default_ttl + set_opts = args[:set_opts] || {} + while locked? + sleep (args[:wait] || 3) + end + set(ttl, set_opts) + out = _perform(&block) + unlock! + out + end + def if_open(args = {}, &block) return if locked? _perform(&block) end alias_method :perform, :if_open @@ -52,10 +76,11 @@ def locked? ttl == -2 ? false : true end alias_method :exists?, :locked? + alias_method :in_use?, :locked? def ttl redis.ttl(key) end @@ -74,9 +99,14 @@ def value redis.get(key) end private + + def self.setup_instance(key, args) + inst_opts = { redis: args.delete(:redis) }.reject{ |_, v| v.nil? } + new(key, inst_opts) + end def _perform(&block) yield self rescue => e config.logger.error "[#{self.class}] key: `#{key}` error:"