Class: RedisMemo::Memoizable

Inherits:
Object
  • Object
show all
Defined in:
lib/redis_memo/memoizable.rb

Defined Under Namespace

Modules: Invalidation Classes: Dependency

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**props, &depends_on) ⇒ Memoizable

Returns a new instance of Memoizable.



10
11
12
13
14
# File 'lib/redis_memo/memoizable.rb', line 10

def initialize(**props, &depends_on)
  @props = props
  @depends_on = depends_on
  @cache_key = nil
end

Instance Attribute Details

#depends_onObject (readonly)

Returns the value of attribute depends_on.



8
9
10
# File 'lib/redis_memo/memoizable.rb', line 8

def depends_on
  @depends_on
end

#propsObject

Returns the value of attribute props.



7
8
9
# File 'lib/redis_memo/memoizable.rb', line 7

def props
  @props
end

Class Method Details

.checksums(instances_groups) ⇒ Object

Calculate the checksums for all memoizable groups in one Redis round trip



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/redis_memo/memoizable.rb', line 32

def self.checksums(instances_groups)
  dependents_cache_keys = []
  cache_key_groups = instances_groups.map do |instances|
    cache_keys = instances.map(&:cache_key)
    dependents_cache_keys += cache_keys
    cache_keys
  end

  dependents_cache_keys.uniq!
  dependents_versions = find_or_create_versions(dependents_cache_keys)
  version_hash = dependents_cache_keys.zip(dependents_versions).to_h

  cache_key_groups.map do |cache_keys|
    RedisMemo.checksum(version_hash.slice(*cache_keys).to_json)
  end
end

.invalidate(instances) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# File 'lib/redis_memo/memoizable.rb', line 49

def self.invalidate(instances)
  instances.each do |instance|
    cache_key = instance.cache_key
    RedisMemo::Memoizable::Invalidation.bump_version_later(
      cache_key,
      RedisMemo.uuid,
    )
  end

  RedisMemo::Memoizable::Invalidation.drain_invalidation_queue
end

Instance Method Details

#cache_keyObject



22
23
24
25
26
27
28
29
# File 'lib/redis_memo/memoizable.rb', line 22

def cache_key
  @cache_key ||= [
    self.class.name,
    RedisMemo.checksum(
      RedisMemo.deep_sort_hash(@props).to_json,
    ),
  ].join(':')
end

#extra_props(**args) ⇒ Object



16
17
18
19
20
# File 'lib/redis_memo/memoizable.rb', line 16

def extra_props(**args)
  instance = dup
  instance.props = props.dup.merge(**args)
  instance
end