Sha256: 2bd2c0ed890a1765dec1ae45f1f7b50e89c65f6dda041383053f2f767a85b809

Contents?: true

Size: 962 Bytes

Versions: 3

Compression:

Stored size: 962 Bytes

Contents

module IdempotentRequest
  class RedisStorage
    attr_reader :redis, :namespace, :expire_time

    def initialize(redis, config = {})
      @redis = redis
      @namespace = config.fetch(:namespace, 'idempotency_keys')
      @expire_time = config[:expire_time]
    end

    def lock(key)
      setnx_with_expiration(lock_key(key), Time.now.to_f)
    end

    def unlock(key)
      redis.del(lock_key(key))
    end

    def read(key)
      redis.get(namespaced_key(key))
    end

    def write(key, payload)
      setnx_with_expiration(namespaced_key(key), payload)
    end

    private

    def setnx_with_expiration(key, data)
      options = {nx: true}
      options[:ex] = expire_time.to_i if expire_time.to_i > 0

      redis.set(key, data, **options)
    end

    def lock_key(key)
      namespaced_key("lock:#{key}")
    end

    def namespaced_key(key)
      [namespace, key.strip]
        .compact
        .join(':')
        .downcase
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
idempotent-request-0.2.1 lib/idempotent-request/redis_storage.rb
idempotent-request-0.2.0 lib/idempotent-request/redis_storage.rb
idempotent-request-0.1.7 lib/idempotent-request/redis_storage.rb