class IdempotentRequest::RedisStorage

Attributes

expire_time[R]
namespace[R]
redis[R]

Public Class Methods

new(redis, config = {}) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 5
def initialize(redis, config = {})
  @redis = redis
  @namespace = config.fetch(:namespace, 'idempotency_keys')
  @expire_time = config[:expire_time]
end

Public Instance Methods

lock(key) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 11
def lock(key)
  setnx_with_expiration(lock_key(key), Time.now.to_f)
end
read(key) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 19
def read(key)
  redis.get(namespaced_key(key))
end
unlock(key) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 15
def unlock(key)
  redis.del(lock_key(key))
end
write(key, payload) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 23
def write(key, payload)
  setnx_with_expiration(namespaced_key(key), payload)
end

Private Instance Methods

lock_key(key) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 36
def lock_key(key)
  namespaced_key("lock:#{key}")
end
namespaced_key(key) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 40
def namespaced_key(key)
  [namespace, key.strip]
    .compact
    .join(':')
    .downcase
end
setnx_with_expiration(key, data) click to toggle source
# File lib/idempotent-request/redis_storage.rb, line 29
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