Class: Card::Cache

Inherits:
Object
  • Object
show all
Extended by:
Prepopulate
Defined in:
lib/card/cache.rb,
lib/card/cache/temporary.rb,
lib/card/cache/persistent.rb,
lib/card/cache/prepopulate.rb

Overview

The Cache class manages and integrates Temporary and Persistent caching. The Temporary cache is typically process- and request- specific and is often "ahead" of the database; the Persistent cache is typically shared across processes and tends to stay true to the database.

Any ruby Class can declare and/or retrieve its own cache as follows:

Card::Cache[MyClass]

Typically speaking, mod developers do not need to use the Cache classes directly, because caching is automatically handled by Card#fetch

Defined Under Namespace

Modules: Prepopulate Classes: Persistent, Temporary

Constant Summary collapse

@@cache_by_class =
{}

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Prepopulate

restore

Constructor Details

#initialize(opts = {}) ⇒ Cache

Cache#new initializes a Temporary/soft cache, and -- if a :store opt is provided -- a Persistent/hard cache

Parameters:

  • opts (Hash) (defaults to: {})

Options Hash (opts):

  • :store (Rails::Cache)
  • :class (Constant)


134
135
136
137
138
139
# File 'lib/card/cache.rb', line 134

def initialize opts={}
  @klass = opts[:class]
  cache_by_class[@klass] = self
  @hard = Persistent.new opts if opts[:store]
  @soft = Temporary.new
end

Class Attribute Details

.no_renewalObject

Returns the value of attribute no_renewal.



29
30
31
# File 'lib/card/cache.rb', line 29

def no_renewal
  @no_renewal
end

Instance Attribute Details

#hardObject (readonly)

Returns the value of attribute hard.



127
128
129
# File 'lib/card/cache.rb', line 127

def hard
  @hard
end

#softObject (readonly)

Returns the value of attribute soft.



127
128
129
# File 'lib/card/cache.rb', line 127

def soft
  @soft
end

Class Method Details

.[](klass) ⇒ {Card::Cache}

create a new cache for the ruby class provided

Parameters:

  • klass (Class)

Returns:



34
35
36
37
38
39
# File 'lib/card/cache.rb', line 34

def [] klass
  raise "nil klass" if klass.nil?

  cache_type = persistent_cache || nil
  cache_by_class[klass] ||= new class: klass, store: cache_type
end

.obj_to_key(obj) ⇒ String

generate a cache key from an object

Parameters:

  • obj (Object)

Returns:

  • (String)


115
116
117
118
119
120
121
122
123
124
# File 'lib/card/cache.rb', line 115

def obj_to_key obj
  case obj
  when Hash
    obj.sort.map { |key, value| "#{key}=>(#{obj_to_key(value)})" } * ","
  when Array
    obj.map { |value| obj_to_key(value) }
  else
    obj.to_s
  end
end

.persistent_cacheObject



41
42
43
44
45
46
47
48
49
50
# File 'lib/card/cache.rb', line 41

def persistent_cache
  return @persistent_cache unless @persistent_cache.nil?

  @persistent_cache =
    case
    when ENV["NO_RAILS_CACHE"]          then false
    when Cardio.config.persistent_cache then Cardio.cache
    else                                     false
    end
end

.renewObject

clear the temporary caches and ensure we're using the latest stamp on the persistent caches.



54
55
56
57
58
59
60
61
# File 'lib/card/cache.rb', line 54

def renew
  return if no_renewal
  renew_persistent
  cache_by_class.each_value do |cache|
    cache.soft.reset
    cache.hard&.renew
  end
end

.renew_persistentObject



63
64
65
# File 'lib/card/cache.rb', line 63

def renew_persistent
  Card::Cache::Persistent.renew if persistent_cache
end

.resetObject

reset standard cached for all classes



68
69
70
71
# File 'lib/card/cache.rb', line 68

def reset
  reset_hard
  reset_soft
end

.reset_allObject

reset all caches for all classes



74
75
76
77
78
# File 'lib/card/cache.rb', line 74

def reset_all
  reset_hard
  reset_soft
  reset_other
end

.reset_globalObject

completely wipe out all caches, often including the Persistent cache of other decks using the same mechanism. Generally prefer reset_all

See Also:



84
85
86
87
88
89
90
# File 'lib/card/cache.rb', line 84

def reset_global
  cache_by_class.each_value do |cache|
    cache.soft.reset
    cache.hard&.annihilate
  end
  reset_other
end

.reset_hardObject

reset the Persistent cache for all classes



93
94
95
96
97
98
# File 'lib/card/cache.rb', line 93

def reset_hard
  Card::Cache::Persistent.reset if persistent_cache
  cache_by_class.each_value do |cache|
    cache.hard&.reset
  end
end

.reset_otherObject

reset Codename cache and delete tmp files (the non-standard caches)



107
108
109
110
# File 'lib/card/cache.rb', line 107

def reset_other
  Card::Codename.reset_cache
  Cardio.delete_tmp_files!
end

.reset_softObject

reset the Temporary cache for all classes



101
102
103
# File 'lib/card/cache.rb', line 101

def reset_soft
  cache_by_class.each_value { |cache| cache.soft.reset }
end

Instance Method Details

#delete(key) ⇒ Object

delete specific cache entries by key

Parameters:

  • key (String)


164
165
166
167
# File 'lib/card/cache.rb', line 164

def delete key
  @hard&.delete key
  @soft.delete key
end

#exist?(key) ⇒ true/false

test for the existence of the key in either cache

Returns:

  • (true/false)


177
178
179
# File 'lib/card/cache.rb', line 177

def exist? key
  @soft.exist?(key) || (@hard&.exist?(key))
end

#fetch(key, &block) ⇒ Object

read and (if not there yet) write

Parameters:

  • key (String)


158
159
160
# File 'lib/card/cache.rb', line 158

def fetch key, &block
  @soft.fetch(key) { @hard ? @hard.fetch(key, &block) : yield }
end

#read(key) ⇒ Object

read cache value (and write to soft cache if missing)

Parameters:

  • key (String)


143
144
145
146
# File 'lib/card/cache.rb', line 143

def read key
  @soft.read(key) ||
    (@hard && (ret = @hard.read(key)) && @soft.write(key, ret))
end

#resetObject

reset both caches (for a given Card::Cache instance)



170
171
172
173
# File 'lib/card/cache.rb', line 170

def reset
  @hard&.reset
  @soft.reset
end

#write(key, value) ⇒ Object

write to hard (where applicable) and soft cache

Parameters:

  • key (String)
  • value


151
152
153
154
# File 'lib/card/cache.rb', line 151

def write key, value
  @hard&.write key, value
  @soft.write key, value
end