Class: Readthis::Cache
- Inherits:
-
Object
- Object
- Readthis::Cache
- Defined in:
- lib/readthis/cache.rb
Instance Attribute Summary collapse
-
#entity ⇒ Object
readonly
Returns the value of attribute entity.
-
#notifications ⇒ Object
readonly
Returns the value of attribute notifications.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#pool ⇒ Object
readonly
Returns the value of attribute pool.
Class Method Summary collapse
-
.notifications ⇒ Object
Provide a class level lookup of the proper notifications module.
Instance Method Summary collapse
-
#clear(_options = nil) ⇒ Object
Clear the entire cache.
-
#decrement(key, amount = 1, options = {}) ⇒ Object
Decrement a key in the store.
-
#delete(key, options = {}) ⇒ Object
Delete the value stored at the specified key.
-
#exist?(key, options = {}) ⇒ Boolean
Returns ‘true` if the cache contains an entry for the given key.
-
#fetch(key, options = {}) ⇒ Object
Fetches data from the cache, using the given key.
-
#fetch_multi(keys) ⇒ Object
Fetches multiple keys from the cache using a single call to the server and filling in any cache misses.
-
#increment(key, amount = 1, options = {}) ⇒ Object
Increment a key in the store.
-
#initialize(options = {}) ⇒ Cache
constructor
Creates a new Readthis::Cache object with the given options.
-
#read(key, options = {}) ⇒ Object
Fetches data from the cache, using the given key.
-
#read_multi(keys) ⇒ Hash
Read multiple values at once from the cache.
-
#write(key, value, options = {}) ⇒ Object
Writes data to the cache using the given key.
-
#write_multi(hash, options = {}) ⇒ Object
Write multiple key value pairs simultaneously.
Constructor Details
#initialize(options = {}) ⇒ Cache
Creates a new Readthis::Cache object with the given options.
36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/readthis/cache.rb', line 36 def initialize( = {}) @options = @entity = Readthis::Entity.new( marshal: .fetch(:marshal, Marshal), compress: .fetch(:compress, false), threshold: .fetch(:compression_threshold, 1024) ) @pool = ConnectionPool.new(()) do Redis.new(.fetch(:redis, {})) end end |
Instance Attribute Details
#entity ⇒ Object (readonly)
Returns the value of attribute entity.
9 10 11 |
# File 'lib/readthis/cache.rb', line 9 def entity @entity end |
#notifications ⇒ Object (readonly)
Returns the value of attribute notifications.
9 10 11 |
# File 'lib/readthis/cache.rb', line 9 def notifications @notifications end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
9 10 11 |
# File 'lib/readthis/cache.rb', line 9 def @options end |
#pool ⇒ Object (readonly)
Returns the value of attribute pool.
9 10 11 |
# File 'lib/readthis/cache.rb', line 9 def pool @pool end |
Class Method Details
.notifications ⇒ Object
Provide a class level lookup of the proper notifications module. Instrumention is expected to occur within applications that have ActiveSupport::Notifications available, but needs to work even when it isn’t.
15 16 17 |
# File 'lib/readthis/cache.rb', line 15 def self.notifications ActiveSupport::Notifications if defined?(ActiveSupport::Notifications) end |
Instance Method Details
#clear(_options = nil) ⇒ Object
Clear the entire cache. This flushes the current database, no globbing is applied.
307 308 309 |
# File 'lib/readthis/cache.rb', line 307 def clear( = nil) invoke(:clear, '*', &:flushdb) end |
#decrement(key, amount = 1, options = {}) ⇒ Object
Decrement a key in the store.
If the key doesn’t exist it will be initialized at 0. If the key exists but it isn’t a Fixnum it will be initialized at 0.
188 189 190 191 192 |
# File 'lib/readthis/cache.rb', line 188 def decrement(key, amount = 1, = {}) invoke(:decrement, key) do |_store| alter(key, amount * -1, ) end end |
#delete(key, options = {}) ⇒ Object
Delete the value stored at the specified key. Returns ‘true` if anything was deleted, `false` otherwise.
100 101 102 103 104 105 106 |
# File 'lib/readthis/cache.rb', line 100 def delete(key, = {}) namespaced = namespaced_key(key, ()) invoke(:delete, key) do |store| store.del(namespaced) > 0 end end |
#exist?(key, options = {}) ⇒ Boolean
Returns ‘true` if the cache contains an entry for the given key.
293 294 295 296 297 |
# File 'lib/readthis/cache.rb', line 293 def exist?(key, = {}) invoke(:exist?, key) do |store| store.exists(namespaced_key(key, ())) end end |
#fetch(key, options = {}) ⇒ Object
Fetches data from the cache, using the given key. If there is data in the cache with the given key, then that data is returned.
If there is no such data in the cache (a cache miss), then ‘nil` will be returned. However, if a block has been passed, that block will be passed the key and executed in the event of a cache miss. The return value of the block will be written to the cache under the given cache key, and that return value will be returned.
140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/readthis/cache.rb', line 140 def fetch(key, = {}) ||= {} value = read(key, ) unless [:force] if value.nil? && block_given? value = yield(key) write(key, value, ) end value end |
#fetch_multi(keys) ⇒ Object
Fetches multiple keys from the cache using a single call to the server and filling in any cache misses. All read and write operations are executed atomically.
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
# File 'lib/readthis/cache.rb', line 263 def fetch_multi(*keys) results = read_multi(*keys) extracted = (keys) missing = {} invoke(:fetch_multi, keys) do |_store| results.each do |key, value| next unless value.nil? value = yield(key) missing[key] = value results[key] = value end end write_multi(missing, extracted) if missing.any? results end |
#increment(key, amount = 1, options = {}) ⇒ Object
Increment a key in the store.
If the key doesn’t exist it will be initialized at 0. If the key exists but it isn’t a Fixnum it will be initialized at 0.
167 168 169 170 171 |
# File 'lib/readthis/cache.rb', line 167 def increment(key, amount = 1, = {}) invoke(:increment, key) do |_store| alter(key, amount, ) end end |
#read(key, options = {}) ⇒ Object
Fetches data from the cache, using the given key. If there is data in the cache with the given key, then that data is returned. Otherwise, nil is returned.
62 63 64 65 66 67 68 |
# File 'lib/readthis/cache.rb', line 62 def read(key, = {}) invoke(:read, key) do |store| value = store.get(namespaced_key(key, ())) entity.load(value) end end |
#read_multi(keys) ⇒ Hash
Read multiple values at once from the cache. Options can be passed in the last argument.
208 209 210 211 212 213 214 215 216 217 218 219 |
# File 'lib/readthis/cache.rb', line 208 def read_multi(*keys) = ((keys)) mapping = keys.map { |key| namespaced_key(key, ) } return {} if keys.empty? invoke(:read_multi, keys) do |store| values = store.mget(*mapping).map { |value| entity.load(value) } keys.zip(values).to_h end end |
#write(key, value, options = {}) ⇒ Object
Writes data to the cache using the given key. Will overwrite whatever value is already stored at that key.
82 83 84 85 86 87 88 |
# File 'lib/readthis/cache.rb', line 82 def write(key, value, = {}) = () invoke(:write, key) do |store| write_entity(key, value, store, ) end end |
#write_multi(hash, options = {}) ⇒ Object
Write multiple key value pairs simultaneously. This is an atomic operation that will always succeed and will overwrite existing values.
This is a non-standard, but useful, cache method.
234 235 236 237 238 239 240 241 242 |
# File 'lib/readthis/cache.rb', line 234 def write_multi(hash, = {}) = () invoke(:write_multi, hash.keys) do |store| store.multi do hash.each { |key, value| write_entity(key, value, store, ) } end end end |