Class: Card::Cache::Persistent
- Inherits:
-
Object
- Object
- Card::Cache::Persistent
- Extended by:
- PersistentClass
- Defined in:
- lib/card/cache/persistent.rb
Overview
Persistent (or Hard) caches closely mirror the database and are intended to be altered only upon database alterations.
Unlike the database, the persistent cache stores records of records that have been requested but are missing or, in the case of some cards, “virtual”, meaning that they follow known patterns but do not exist in the database.
Most persistent cache implementations cannot store objects with singleton classes, therefore cards generally must have set_modules re-included after retrieval from the persistent cache.
Instance Attribute Summary collapse
-
#prefix ⇒ Object
prefix added to cache key to create a system-wide unique key.
Instance Method Summary collapse
-
#annihilate ⇒ Object
the nuclear option.
- #deep_read(key) ⇒ Object
- #delete(key) ⇒ Object
- #exist?(key) ⇒ Boolean
- #fetch(key, &block) ⇒ Object
-
#full_key(key) ⇒ String
returns prefix/key.
-
#initialize(opts) ⇒ Persistent
constructor
A new instance of Persistent.
- #read(key) ⇒ Object
- #read_attribute(key, attribute) ⇒ Object
-
#renew ⇒ Object
renew insures you’re using the most current cache version by reaffirming the stamp and prefix.
-
#reset ⇒ Object
reset effectively clears the cache by setting a new stamp.
-
#stamp ⇒ Object
the current time stamp.
-
#stamp_key ⇒ Object
key for looking up the current stamp.
- #write(key, value) ⇒ Object
-
#write_attribute(key, attribute, value) ⇒ Object
update an attribute of an object already in the cache.
Methods included from PersistentClass
Constructor Details
#initialize(opts) ⇒ Persistent
Returns a new instance of Persistent.
26 27 28 29 30 31 |
# File 'lib/card/cache/persistent.rb', line 26 def initialize opts @store = opts[:store] @klass = opts[:class] @class_key = @klass.to_s.to_name.key @database = opts[:database] || Cardio.database end |
Instance Attribute Details
#prefix ⇒ Object
prefix added to cache key to create a system-wide unique key
67 68 69 |
# File 'lib/card/cache/persistent.rb', line 67 def prefix @prefix end |
Instance Method Details
#annihilate ⇒ Object
the nuclear option. can affect other applications sharing the same cache engine. keep in mind mutually assured destruction.
50 51 52 |
# File 'lib/card/cache/persistent.rb', line 50 def annihilate @store.clear end |
#deep_read(key) ⇒ Object
95 96 97 98 99 |
# File 'lib/card/cache/persistent.rb', line 95 def deep_read key local_cache = @store.send :local_cache local_cache&.clear read key end |
#delete(key) ⇒ Object
114 115 116 |
# File 'lib/card/cache/persistent.rb', line 114 def delete key @store.delete full_key(key) end |
#exist?(key) ⇒ Boolean
118 119 120 |
# File 'lib/card/cache/persistent.rb', line 118 def exist? key @store.exist? full_key(key) end |
#fetch(key, &block) ⇒ Object
110 111 112 |
# File 'lib/card/cache/persistent.rb', line 110 def fetch key, &block @store.fetch full_key(key), &block end |
#full_key(key) ⇒ String
returns prefix/key
74 75 76 |
# File 'lib/card/cache/persistent.rb', line 74 def full_key key "#{prefix}/#{key}" end |
#read(key) ⇒ Object
78 79 80 |
# File 'lib/card/cache/persistent.rb', line 78 def read key @store.read full_key(key) end |
#read_attribute(key, attribute) ⇒ Object
101 102 103 104 |
# File 'lib/card/cache/persistent.rb', line 101 def read_attribute key, attribute object = deep_read key object.instance_variable_get "@#{attribute}" end |
#renew ⇒ Object
renew insures you’re using the most current cache version by reaffirming the stamp and prefix
35 36 37 38 |
# File 'lib/card/cache/persistent.rb', line 35 def renew @stamp = nil @prefix = nil end |
#reset ⇒ Object
reset effectively clears the cache by setting a new stamp. However unlike annihilate, it won’t bother other apps using the same cache engine.
42 43 44 45 46 |
# File 'lib/card/cache/persistent.rb', line 42 def reset @stamp = self.class.new_stamp @prefix = nil Cardio.cache.write stamp_key, @stamp end |
#stamp ⇒ Object
the current time stamp. changing this value effectively resets the cache. Note that Cardio.cache is a simple Rails::Cache, not a Card::Cache object.
57 58 59 |
# File 'lib/card/cache/persistent.rb', line 57 def stamp @stamp ||= Cardio.cache.fetch(stamp_key) { self.class.new_stamp } end |
#stamp_key ⇒ Object
key for looking up the current stamp
62 63 64 |
# File 'lib/card/cache/persistent.rb', line 62 def stamp_key "#{@database}-#{@class_key}-#{self.class.stamp}-stamp" end |
#write(key, value) ⇒ Object
106 107 108 |
# File 'lib/card/cache/persistent.rb', line 106 def write key, value @store.write full_key(key), value end |
#write_attribute(key, attribute, value) ⇒ Object
update an attribute of an object already in the cache
85 86 87 88 89 90 91 92 93 |
# File 'lib/card/cache/persistent.rb', line 85 def write_attribute key, attribute, value return value unless @store if (object = deep_read key) object.instance_variable_set "@#{attribute}", value write key, object end value end |