class Redis::Stream::DataCache

Public Class Methods

new(logger = Logger.new(STDOUT)) click to toggle source
# File lib/redis/stream/data_cache.rb, line 8
def initialize(logger = Logger.new(STDOUT))
  @logger = logger
  @cache = Moneta.new(:HashFile, dir: Redis::Stream::Config[:data_cache] || "/tmp/cache", serializer: :json)
end

Public Instance Methods

[](key) click to toggle source
# File lib/redis/stream/data_cache.rb, line 18
def [](key)
  @cache.fetch(key)
end
[]=(key, value) click to toggle source
# File lib/redis/stream/data_cache.rb, line 13
def []=(key, value)
  @logger.info("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - caching with key #{key}")
  @cache.store(key, value)
end
build_key(data) click to toggle source
# File lib/redis/stream/data_cache.rb, line 42
def build_key(data)
  key = ""
  if data && data.include?('payload')
    payload_data = data['payload']
  else
    payload_data = data
  end

  if payload_data.include?("id")
    id = payload_data["id"].downcase
    key = "#{id}"
    key = "#{@key_prefix}_#{key}" unless @key_prefix.nil? || @key_prefix&.empty?
  end
  raise "Empty cache key" if key.nil? || key&.empty?
  key
end
delete(key) click to toggle source
# File lib/redis/stream/data_cache.rb, line 30
def delete(key)
  @cache.delete(key)
end
include?(key) click to toggle source
# File lib/redis/stream/data_cache.rb, line 22
def include?(key)
  key?(key)
end
key?(key) click to toggle source
# File lib/redis/stream/data_cache.rb, line 26
def key?(key)
  @cache.key?(key)
end
key_prefix() click to toggle source
# File lib/redis/stream/data_cache.rb, line 38
def key_prefix
  @key_prefix
end
key_prefix=(prefix) click to toggle source
# File lib/redis/stream/data_cache.rb, line 34
def key_prefix=(prefix)
  @key_prefix = prefix.downcase
end
resolve_by_message(pid, payload, &block) click to toggle source
# File lib/redis/stream/data_cache.rb, line 59
def resolve_by_message(pid, payload, &block)
  data = nil
  cache_key = build_key(payload)
  invalidate_cache(cache_key, payload)
  data = load_from_cache(cache_key)
  data = load_from_service(pid, cache_key, &block) if data.nil?

  data
end

Private Instance Methods

get_from_cache(cache_key) click to toggle source
# File lib/redis/stream/data_cache.rb, line 97
def get_from_cache(cache_key)
  key?(cache_key)

  data = self[cache_key]
  if data&.key?('parent')
    data = get_from_cache(self.build_key({'id' => data['parent']}))
  end

  data
end
invalidate_cache(cache_key, payload) click to toggle source
# File lib/redis/stream/data_cache.rb, line 70
def invalidate_cache(cache_key, payload)
  if payload&.include?('from_cache') && payload['from_cache'].eql?('0')
    delete(cache_key)
    @logger.warn("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - invalidating key #{cache_key}")
  end
end
load_from_cache(cache_key) click to toggle source
# File lib/redis/stream/data_cache.rb, line 77
def load_from_cache(cache_key)
  data = nil
  if key?(cache_key)
    @logger.info("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - fetching with key #{cache_key}")
    data = get_from_cache(cache_key)
  end
  data
end
load_from_service(pid, cache_key) { |pid, cache_key| ... } click to toggle source
# File lib/redis/stream/data_cache.rb, line 86
def load_from_service(pid, cache_key)
  data = nil
  data = yield pid, cache_key if block_given?

  if data.nil? || data&.empty?
    @logger.warn("CACHE - #{File.basename(__FILE__)}:#{__LINE__} - empty result for key #{cache_key} and id #{pid}")
  end

  data
end