57 lines
1.3 KiB
Ruby
57 lines
1.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module MarkdownCache
|
||
|
module Redis
|
||
|
class Store
|
||
|
EXPIRES_IN = 1.day
|
||
|
|
||
|
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
|
||
|
|
||
|
results = Gitlab::Redis::Cache.with do |r|
|
||
|
r.mapped_hmget(markdown_cache_key, *fields)
|
||
|
end
|
||
|
# The value read from redis is a string, so we're converting it back
|
||
|
# to an int.
|
||
|
results[:cached_markdown_version] = results[:cached_markdown_version].to_i
|
||
|
results
|
||
|
end
|
||
|
|
||
|
def loaded?
|
||
|
@loaded
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def fields
|
||
|
@fields ||= @subject.cached_markdown_fields.html_fields + [:cached_markdown_version]
|
||
|
end
|
||
|
|
||
|
def markdown_cache_key
|
||
|
unless @subject.respond_to?(:cache_key)
|
||
|
raise Gitlab::MarkdownCache::UnsupportedClassError,
|
||
|
"This class has no cache_key to use for caching"
|
||
|
end
|
||
|
|
||
|
"markdown_cache:#{@subject.cache_key}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|