19440e6722
Previously, project cache used as part of the namespace the `full_path`, which included namespace and project slug. That meant that anytime a project was renamed or transfered to a different namespace, we would lose the existing cache. This is not necessary, nor desired. I've prefixed cache key with `project:` to make it easy to find in redis if necessary as well as make it possible to purge all project related cache. I've also switched the cache key type to go after the initial namespace and not before.
51 lines
1 KiB
Ruby
51 lines
1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Interface to the Redis-backed cache store
|
|
module Gitlab
|
|
class RepositoryCache
|
|
attr_reader :repository, :namespace, :backend
|
|
|
|
def initialize(repository, extra_namespace: nil, backend: Rails.cache)
|
|
@repository = repository
|
|
@namespace = "project:#{repository.project.id}"
|
|
@namespace = "#{@namespace}:#{extra_namespace}" if extra_namespace
|
|
@backend = backend
|
|
end
|
|
|
|
def cache_key(type)
|
|
"#{namespace}:#{type}"
|
|
end
|
|
|
|
def expire(key)
|
|
backend.delete(cache_key(key))
|
|
end
|
|
|
|
def fetch(key, &block)
|
|
backend.fetch(cache_key(key), &block)
|
|
end
|
|
|
|
def exist?(key)
|
|
backend.exist?(cache_key(key))
|
|
end
|
|
|
|
def read(key)
|
|
backend.read(cache_key(key))
|
|
end
|
|
|
|
def write(key, value)
|
|
backend.write(cache_key(key), value)
|
|
end
|
|
|
|
def fetch_without_caching_false(key, &block)
|
|
value = read(key)
|
|
return value if value
|
|
|
|
value = yield
|
|
|
|
# Don't cache false values
|
|
write(key, value) if value
|
|
|
|
value
|
|
end
|
|
end
|
|
end
|