Class: DistributedCache

Inherits:
MessageBus::DistributedCache
  • Object
show all
Defined in:
lib/distributed_cache.rb

Instance Method Summary collapse

Constructor Details

#initialize(key, manager: nil, namespace: true) ⇒ DistributedCache

Returns a new instance of DistributedCache.



6
7
8
# File 'lib/distributed_cache.rb', line 6

def initialize(key, manager: nil, namespace: true)
  super(key, manager: manager, namespace: namespace, app_version: Discourse.git_version)
end

Instance Method Details

#clear(after_commit: true) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/distributed_cache.rb', line 41

def clear(after_commit: true)
  if after_commit && !GlobalSetting.skip_db?
    DB.after_commit { super() }
  else
    super()
  end
end

#defer_get_set(k, &block) ⇒ Object



16
17
18
19
20
21
# File 'lib/distributed_cache.rb', line 16

def defer_get_set(k, &block)
  return self[k] if hash.key? k
  value = block.call
  self.defer_set(k, value)
  value
end

#defer_get_set_bulk(ks, key_blk, &blk) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/distributed_cache.rb', line 23

def defer_get_set_bulk(ks, key_blk, &blk)
  found_keys, missing_keys = ks.partition { |k| hash.key?(key_blk.call(k)) }
  found_hash = found_keys.map { |key| [key, self[key_blk.call(key)]] }.to_h

  if missing_keys.present?
    missing_values = blk.call(missing_keys.freeze)
    missing_hash = missing_keys.zip(missing_values).to_h

    Scheduler::Defer.later("#{@key}_bulk_set") do
      missing_hash.each { |key, value| self[key_blk.call(key)] = value }
    end

    ks.zip(missing_hash.merge(found_hash).values_at(*ks)).to_h
  else
    found_hash
  end
end

#defer_set(k, v) ⇒ Object

Defer setting of the key in the cache for performance critical path to avoid waiting on MessageBus to publish the message which involves writing to Redis.



12
13
14
# File 'lib/distributed_cache.rb', line 12

def defer_set(k, v)
  Scheduler::Defer.later("#{@key}_set") { self[k] = v }
end