Class: Gitlab::DiscussionsDiff::HighlightCache
- Inherits:
-
Object
- Object
- Gitlab::DiscussionsDiff::HighlightCache
- Extended by:
- Utils::Gzip
- Defined in:
- lib/gitlab/discussions_diff/highlight_cache.rb
Constant Summary collapse
- VERSION =
1
- EXPIRATION =
1.week
Class Method Summary collapse
- .cache_key_for(raw_key) ⇒ Object
-
.clear_multiple(raw_keys) ⇒ Object
Clears multiple cache keys at once.
-
.read_multiple(raw_keys) ⇒ Object
Reads multiple cache keys at once.
-
.write_multiple(mapping) ⇒ Object
Sets multiple keys to a given value.
Methods included from Utils::Gzip
gzip_compress, gzip_decompress
Class Method Details
.cache_key_for(raw_key) ⇒ Object
84 85 86 |
# File 'lib/gitlab/discussions_diff/highlight_cache.rb', line 84 def cache_key_for(raw_key) "#{cache_key_prefix}:#{raw_key}" end |
.clear_multiple(raw_keys) ⇒ Object
Clears multiple cache keys at once.
raw_keys - An Array of unique cache keys, without namespaces.
It returns the number of cache keys cleared. Ex.: 42
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/gitlab/discussions_diff/highlight_cache.rb', line 68 def clear_multiple(raw_keys) return [] if raw_keys.empty? keys = raw_keys.map { |id| cache_key_for(id) } with_redis do |redis| Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do if Gitlab::Redis::ClusterUtil.cluster?(redis) Gitlab::Redis::ClusterUtil.batch_unlink(keys, redis) else redis.del(keys) end end end end |
.read_multiple(raw_keys) ⇒ Object
Reads multiple cache keys at once.
raw_keys - An Array of unique cache keys, without namespaces.
It returns a list of deserialized diff lines. Ex.:
- [Gitlab::Diff::Line, …], [Gitlab::Diff::Line]
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/gitlab/discussions_diff/highlight_cache.rb', line 36 def read_multiple(raw_keys) return [] if raw_keys.empty? keys = raw_keys.map { |id| cache_key_for(id) } content = with_redis do |redis| Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do if Gitlab::Redis::ClusterUtil.cluster?(redis) Gitlab::Redis::CrossSlot::Pipeline.new(redis).pipelined do |pipeline| keys.each { |key| pipeline.get(key) } end else redis.mget(keys) end end end content.map! do |lines| next unless lines Gitlab::Json.parse(gzip_decompress(lines)).map! do |line| Gitlab::Diff::Line.safe_init_from_hash(line) end end end |
.write_multiple(mapping) ⇒ Object
Sets multiple keys to a given value. The value is serialized as JSON.
mapping - Write multiple cache values at once
16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/gitlab/discussions_diff/highlight_cache.rb', line 16 def write_multiple(mapping) with_redis do |redis| Gitlab::Instrumentation::RedisClusterValidator.allow_cross_slot_commands do Gitlab::Redis::CrossSlot::Pipeline.new(redis).pipelined do |pipelined| mapping.each do |raw_key, value| key = cache_key_for(raw_key) pipelined.set(key, gzip_compress(value.to_json), ex: EXPIRATION) end end end end end |