Class: FastCache::Cache
- Inherits:
-
Object
- Object
- FastCache::Cache
- Defined in:
- lib/fast_cache/cache.rb
Overview
In-process cache with least-recently used (LRU) and time-to-live (TTL) expiration semantics.
This implementation is not thread-safe. It does not use a thread to clean up expired values. Instead, an expiration check is performed:
-
Every time you retrieve a value, against that value. If the value has expired, it will be removed and ‘nil` will be returned.
-
Every ‘expire_interval` operations as the cache is used to remove all expired values up to that point.
For manual expiration call #expire!.
Defined Under Namespace
Classes: Entry
Instance Method Summary collapse
-
#[](key) ⇒ Object?
Retrieves a value from the cache.
-
#[]=(key, val) ⇒ Object
Stores a value in the cache.
-
#clear ⇒ self
Clears the cache.
-
#count ⇒ Integer
(also: #size, #length)
Returns the number of elements in the cache.
-
#delete(key) ⇒ Object?
Removes a value from the cache.
-
#each {|Array<key, value>| ... } ⇒ Enumerator, Array<key, value>
Allows iteration over the items in the cache.
-
#empty? ⇒ Boolean
Checks whether the cache is empty.
-
#expire! ⇒ self
Removes expired values from the cache.
-
#fetch(key) { ... } ⇒ Object
Retrieves a value from the cache, if available and not expired, or yields to a block that calculates the value to be stored in the cache.
-
#initialize(max_size, ttl, expire_interval = 100) ⇒ Cache
constructor
Initializes the cache.
-
#inspect ⇒ String
Returns information about the number of objects in the cache, its maximum size and TTL.
Constructor Details
#initialize(max_size, ttl, expire_interval = 100) ⇒ Cache
Initializes the cache.
35 36 37 38 39 40 41 42 |
# File 'lib/fast_cache/cache.rb', line 35 def initialize(max_size, ttl, expire_interval = 100) @max_size = max_size @ttl = ttl.to_f @expire_interval = expire_interval @op_count = 0 @data = {} @expires_at = {} end |
Instance Method Details
#[](key) ⇒ Object?
Retrieves a value from the cache.
64 65 66 67 |
# File 'lib/fast_cache/cache.rb', line 64 def [](key) _, value = get(key) value end |
#[]=(key, val) ⇒ Object
Stores a value in the cache.
74 75 76 77 |
# File 'lib/fast_cache/cache.rb', line 74 def []=(key, val) expire! store(key, val) end |
#clear ⇒ self
Clears the cache.
105 106 107 108 109 |
# File 'lib/fast_cache/cache.rb', line 105 def clear @data.clear @expires_at.clear self end |
#count ⇒ Integer Also known as: size, length
calls to #empty? do not count against ‘expire_interval`. Therefore, the number of elements is that prior to any expiration.
Returns the number of elements in the cache.
117 118 119 |
# File 'lib/fast_cache/cache.rb', line 117 def count @data.count end |
#delete(key) ⇒ Object?
Removes a value from the cache.
83 84 85 86 87 88 89 90 91 |
# File 'lib/fast_cache/cache.rb', line 83 def delete(key) entry = @data.delete(key) if entry @expires_at.delete(entry) entry.value else nil end end |
#each {|Array<key, value>| ... } ⇒ Enumerator, Array<key, value>
The returned values could have expired by the time the client code gets to accessing them.
Because of its stability, this operation is very expensive. Use with caution.
Allows iteration over the items in the cache.
Enumeration is stable: it is not affected by changes to the cache, including value expiration. Expired values are removed first.
137 138 139 140 |
# File 'lib/fast_cache/cache.rb', line 137 def each(&block) expire! @data.map { |key, entry| [key, entry.value] }.each(&block) end |
#empty? ⇒ Boolean
calls to #empty? do not count against ‘expire_interval`.
Checks whether the cache is empty.
98 99 100 |
# File 'lib/fast_cache/cache.rb', line 98 def empty? count == 0 end |
#expire! ⇒ self
Removes expired values from the cache.
145 146 147 148 |
# File 'lib/fast_cache/cache.rb', line 145 def expire! check_expired(Time.now.to_f) self end |
#fetch(key) { ... } ⇒ Object
Retrieves a value from the cache, if available and not expired, or yields to a block that calculates the value to be stored in the cache.
51 52 53 54 55 56 57 58 |
# File 'lib/fast_cache/cache.rb', line 51 def fetch(key) found, value = get(key) if found value else store(key, yield) end end |
#inspect ⇒ String
Returns information about the number of objects in the cache, its maximum size and TTL.
154 155 156 |
# File 'lib/fast_cache/cache.rb', line 154 def inspect "<#{self.class.name} count=#{count} max_size=#{@max_size} ttl=#{@ttl}>" end |