51 lines
1.1 KiB
Ruby
51 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
class ProcessMemoryCache
|
|
module Helper
|
|
def fetch_memory_cache(key, &payload)
|
|
cache = cache_backend.read(key)
|
|
|
|
if cache && !stale_cache?(key, cache)
|
|
cache[:data]
|
|
else
|
|
store_cache(key, &payload)
|
|
end
|
|
end
|
|
|
|
def invalidate_memory_cache(key)
|
|
touch_cache_timestamp(key)
|
|
end
|
|
|
|
private
|
|
|
|
def touch_cache_timestamp(key, time = Time.current.to_f)
|
|
shared_backend.write(key, time)
|
|
end
|
|
|
|
def stale_cache?(key, cache_info)
|
|
shared_timestamp = shared_backend.read(key)
|
|
return true unless shared_timestamp
|
|
|
|
shared_timestamp.to_f > cache_info[:cached_at].to_f
|
|
end
|
|
|
|
def store_cache(key)
|
|
data = yield
|
|
time = Time.current.to_f
|
|
|
|
cache_backend.write(key, data: data, cached_at: time)
|
|
touch_cache_timestamp(key, time) unless shared_backend.read(key)
|
|
data
|
|
end
|
|
|
|
def shared_backend
|
|
Rails.cache
|
|
end
|
|
|
|
def cache_backend
|
|
::Gitlab::ProcessMemoryCache.cache_backend
|
|
end
|
|
end
|
|
end
|
|
end
|