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:"