2019-06-05 00:59:48 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Gitlab
|
|
|
|
module MarkdownCache
|
|
|
|
module Redis
|
|
|
|
class Store
|
|
|
|
EXPIRES_IN = 1.day
|
|
|
|
|
2020-07-01 08:09:08 -04:00
|
|
|
def self.bulk_read(subjects)
|
|
|
|
results = {}
|
|
|
|
|
|
|
|
Gitlab::Redis::Cache.with do |r|
|
|
|
|
r.pipelined do
|
|
|
|
subjects.each do |subject|
|
|
|
|
results[subject.cache_key] = new(subject).read
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
results
|
|
|
|
end
|
|
|
|
|
2019-06-05 00:59:48 -04:00
|
|
|
def initialize(subject)
|
|
|
|
@subject = subject
|
|
|
|
@loaded = false
|
|
|
|
end
|
|
|
|
|
|
|
|
def save(updates)
|
|
|
|
@loaded = false
|
|
|
|
|
|
|
|
Gitlab::Redis::Cache.with do |r|
|
|
|
|
r.mapped_hmset(markdown_cache_key, updates)
|
|
|
|
r.expire(markdown_cache_key, EXPIRES_IN)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def read
|
|
|
|
@loaded = true
|
|
|
|
|
2020-07-01 08:09:08 -04:00
|
|
|
Gitlab::Redis::Cache.with do |r|
|
2019-06-05 00:59:48 -04:00
|
|
|
r.mapped_hmget(markdown_cache_key, *fields)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def loaded?
|
|
|
|
@loaded
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def fields
|
|
|
|
@fields ||= @subject.cached_markdown_fields.html_fields + [:cached_markdown_version]
|
|
|
|
end
|
|
|
|
|
|
|
|
def markdown_cache_key
|
2019-06-05 08:06:37 -04:00
|
|
|
unless @subject.respond_to?(:cache_key)
|
2019-06-05 00:59:48 -04:00
|
|
|
raise Gitlab::MarkdownCache::UnsupportedClassError,
|
2019-06-05 08:06:37 -04:00
|
|
|
"This class has no cache_key to use for caching"
|
2019-06-05 00:59:48 -04:00
|
|
|
end
|
|
|
|
|
2019-06-05 01:50:37 -04:00
|
|
|
"markdown_cache:#{@subject.cache_key}"
|
2019-06-05 00:59:48 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|