class TimedCache

Public Class Methods

new(name, ttl: 60, jitter: 1..5, &block) click to toggle source
# File lib/tins/timed_cache.rb, line 12
def initialize(name, ttl: 60, jitter: 1..5, &block)
  @name   = name
  @ttl    = ttl
  @jitter = jitter
  block or raise ArgumentError, 'block is required'
  @block = block
  @redis = Redis.new
end

Public Instance Methods

namespaced(key) click to toggle source
# File lib/tins/timed_cache.rb, line 21
def namespaced(key)
  "timed_cache:#{key}"
end
new_value(now) click to toggle source
# File lib/tins/timed_cache.rb, line 44
def new_value(now)
  Value.new(@block.(), now.to_i)
end
stored_value() click to toggle source
# File lib/tins/timed_cache.rb, line 48
def stored_value
  @redis.get(namespaced(@name)).full? { |s| ::JSON.parse(s, create_additions: true) rescue nil }
end
value() click to toggle source
# File lib/tins/timed_cache.rb, line 25
def value
  now = Time.now
  if stored = stored_value
    if (now - @ttl).to_i >= stored.timestamp
      Thread.new {
        sleep @jitter
        if stored_value.timestamp <= stored.timestamp
          @redis.set namespaced(@name), new_value(now).to_json
        end
      }
    end
    stored.value
  else
    nv = new_value(now)
    @redis.set namespaced(@name), nv.to_json
    nv.value
  end
end