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