Sha256: 94e89e7a8128cedfc547e1d8139aa708345b7b1728603e87903729adceb1c3ad

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

require "easy_redis_lock/version"
require 'uri'
require 'redis'

module EasyRedisLock
  class GateKeeper
    attr_reader :delay, :redis, :seconds_delay, :lock_time

    def initialize options={}
      @delay = options.fetch(:delay, 1500)
      @lock_time = options.fetch(:lock_time, 30) # seconds
      @redis = options.fetch(:redis) { Redis.new }
    end

    def should_delay? delay_key
      in_progress? delay_key
    end

    def mark_in_progress delay_key
      set_progress delay_key
    end

    def with_lock delay_key=Time.now.to_i, delay=seconds_delay, &block
      retries = 0
      begin
        while should_delay?(delay_key) do
          sleep(delay)
          retries += 1
          break if retries >= 30
        end
        mark_in_progress(delay_key)
        yield if block_given?
      ensure
        expire_lock(delay_key)
      end
    end

    def cleanup
      close_connection!
    end

    private

    def seconds_delay
      delay.to_f / 1000.0
    end

    def close_connection!
      redis.quit
    end

    def expire_lock delay_key
      redis.del("easy_redis_lock:#{delay_key}")
    end

    def in_progress? delay_key
      redis.exists("easy_redis_lock:#{delay_key}")
    end

    def set_progress delay_key
      redis.setex("easy_redis_lock:#{delay_key}", lock_time, 1) # auto expires after lock_time seconds
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
easy_redis_lock-0.0.2 lib/easy_redis_lock.rb