52 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			52 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
 |