composite_cache_store 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bcf1949baebddee06f0ba0ec038fed2c56885f10558cc8fa7a362d96dbd7b112
4
- data.tar.gz: 435c6f4599e46a80235d8867d3d2812c61fbd012c425f74cce13cbd07df96dd8
3
+ metadata.gz: 689876c5fc7b2bd00343817eac73b522a0687482aaaeb1058a471c7fcac275e7
4
+ data.tar.gz: dba46b9f25d1302377dd0fb64c9765a8c6016545f78fdb57444282e6b4d94cd8
5
5
  SHA512:
6
- metadata.gz: b75956e16c3e2f1d6f2142f661e59b54e6b5ef3f9efa5c7630e7fd580d8f1e74354df78f0e4eab54c0573d1926ce47b6dae7ccd371cc2a54c1e052a76184b1e2
7
- data.tar.gz: 1b756102d631603fead6e33fa37e7e8c2f58a60dc7b428d3c7f5d0e81913a6350b244aedef0386930a1ee37609fdccc034efb816fe29fc33b9ac3f6c8d85af34
6
+ metadata.gz: a04ad705343eea18cdd44d399cbd2264b11fa7eb91a6be8c0d98960b8937510abd77a780a95c816217bf2752cf7fde885dbf423b04aaee11024280876e19f994
7
+ data.tar.gz: 72bcee27ef6647b444582c481dfa011fedbb587d540537d193a3f1042965bf16e7cb740ed059f6483b7926afdd99dd2b84fe80715665ea8908dcf2c3efc1ca0f
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CompositeCacheStore
2
2
 
3
- ### A composite cache store comprised of 2 ActiveSupport::Cache::Store instances
3
+ ### A composite cache store comprised of layered ActiveSupport::Cache::Store instances
4
4
 
5
5
  <!-- Tocer[start]: Auto-generated, don't remove. -->
6
6
 
@@ -27,10 +27,10 @@ While these services are robust and performant, they can also be a source of lat
27
27
  __A composite (or layered) cache can mitigate these risks__
28
28
  by reducing traffic and backpressure on the persistence service.
29
29
 
30
- Consider a composite cache that wraps a remote Redis-backed "outer cache" with a local in-memory "inner cache".
31
- When both caches are warm, a read hit on the local in-memory cache returns instantly and avoids the overhead of
30
+ Consider a composite cache that wraps a remote Redis-backed "layer 2 cache" with a local in-memory "layer 1 cache".
31
+ When both caches are warm, a read hit on the local in-memory "layer 1 cache" returns instantly and avoids the overhead of
32
32
  inter-process communication (IPC) and/or network traffic _(with its attendant data marshaling and socket/wire noise)_
33
- associated with accessing the remote Redis-backed cache.
33
+ associated with accessing the remote Redis-backed "layer 2 cache".
34
34
 
35
35
  To summarize: __Reads prioritize the inner cache and fall back to the outer cache.__
36
36
 
@@ -79,7 +79,7 @@ def Rails.composite_cache
79
79
  ),
80
80
 
81
81
  # Layer 2 cache (outer)
82
- Rails.cache, # use whatever makes sense for your app as the remote inner-cache
82
+ Rails.cache, # use whatever makes sense for your app
83
83
 
84
84
  # additional layers are optional
85
85
  )
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class CompositeCacheStore
4
- VERSION = "0.0.2"
4
+ VERSION = "0.0.3"
5
5
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/cache"
3
+ require "active_support/all"
4
4
  require_relative "composite_cache_store/version"
5
5
 
6
6
  class CompositeCacheStore
@@ -100,40 +100,50 @@ class CompositeCacheStore
100
100
  end
101
101
 
102
102
  def read_multi(...)
103
+ missed_layers = []
103
104
  layers.each do |store|
104
- result = store.read_multi(...)
105
- return result if result.present?
105
+ hash = store.read_multi(...)
106
+ if hash.present?
107
+ missed_layers.each { |s| s.write_multi(hash) }
108
+ return hash
109
+ end
110
+ missed_layers << store
106
111
  end
107
- nil
112
+ {}
108
113
  end
109
114
 
110
115
  def silence!
111
116
  layers.each { |store| store.silence! }
112
117
  end
113
118
 
114
- # Only applies expiration options to the outermost cache
115
- # Inner caches use their global expiration options
116
119
  def write(name, value, options = nil)
117
- options ||= {}
118
120
  layers.each do |store|
119
- if store == layers.last
120
- store.write(name, value, options)
121
- else
122
- store.write(name, value, options.except(:expires_in, :expires_at))
123
- end
121
+ store.write name, value, permitted_options(store, options)
124
122
  end
125
123
  end
126
124
 
127
- # Only applies expiration options to the outermost cache
128
- # Inner caches use their global expiration options
129
125
  def write_multi(hash, options = nil)
130
- options ||= {}
131
126
  layers.each do |store|
132
- if store == layers.last
133
- store.write_multi(hash, options)
134
- else
135
- store.write_multi(hash, options.except(:expires_in, :expires_at))
136
- end
127
+ store.write_multi hash, permitted_options(store, options)
137
128
  end
138
129
  end
130
+
131
+ private
132
+
133
+ def permitted_options(store, options = {})
134
+ return options if options.blank?
135
+ return options if keep_expiration?(store, options)
136
+ options.except(:expires_in, :expires_at)
137
+ end
138
+
139
+ def keep_expiration?(store, options = {})
140
+ return true if store == layers.last
141
+ return true unless store.options[:expires_in]
142
+
143
+ expires_in = options[:expires_in]
144
+ expires_in ||= Time.current - options[:expires_at] if options[:expires_at]
145
+ return false unless expires_in
146
+
147
+ expires_in < store.options[:expires_in]
148
+ end
139
149
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composite_cache_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nate Hopkins (hopsoft)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-13 00:00:00.000000000 Z
11
+ date: 2023-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -82,7 +82,7 @@ dependencies:
82
82
  version: '0'
83
83
  description: |
84
84
  Enhanced application performance with faster reads, data redundancy,
85
- and reduced backpressure on the inner cache store.
85
+ and reduced backpressure on the outer cache store.
86
86
  email:
87
87
  - natehop@gmail.com
88
88
  executables: []
@@ -118,5 +118,6 @@ requirements: []
118
118
  rubygems_version: 3.4.6
119
119
  signing_key:
120
120
  specification_version: 4
121
- summary: A composite cache store comprised of 2 ActiveSupport::Cache::Store instances
121
+ summary: A composite cache store comprised of layered ActiveSupport::Cache::Store
122
+ instances
122
123
  test_files: []