object-cache 0.0.1 → 0.0.2
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 +4 -4
- data/.rubocop.yml +3 -0
- data/README.md +25 -1
- data/lib/object/cache.rb +4 -3
- data/lib/object/cache/core_extension.rb +3 -0
- data/lib/object/cache/version.rb +1 -1
- data/test/cache_test.rb +22 -2
- metadata +1 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3be3bd853f9ffd24ff89cff95d2762241021a1f
|
4
|
+
data.tar.gz: 48fc790b6f2a15b13d945a9fe6f0483355bc9995
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e1cd521b1b326ab8a381b71a0c39677fc37885dd0f714c8e8db010d7cc22dd5e88067827be3c4a863bda017f847ff63f77ab5814be6de0e20d527f986b4cf2e
|
7
|
+
data.tar.gz: 12f817db636a6d87ed92dbc80885d999f0b19b11b507aab5283fcf1ee7d9941495e430b0ff47571ab2601c559a5017703dde3de97f7d8666f04b6bf97dd4f4ae
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -83,7 +83,14 @@ that every request after the first request uses the value from the cached
|
|
83
83
|
object. After one week, the cached value becomes stale, and the first request
|
84
84
|
after that will again store the (possibly changed) object in the cache store.
|
85
85
|
|
86
|
-
You can
|
86
|
+
You can globaly set the default ttl to a different value:
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
Cache.default_ttl = 120
|
90
|
+
```
|
91
|
+
|
92
|
+
You can easily modify the `ttl` per cached object, using the keyword argument by
|
93
|
+
that same name:
|
87
94
|
|
88
95
|
```ruby
|
89
96
|
Cache.new(ttl: 60) { 'remember me for 60 seconds!' }
|
@@ -96,6 +103,11 @@ Cache.new(ttl: nil) { 'I am forever in your cache!' }
|
|
96
103
|
Cache.new(ttl: 0) { 'me too!' }
|
97
104
|
```
|
98
105
|
|
106
|
+
Note that it is best to never leave a value in the backend forever. Since this
|
107
|
+
library uses file names and line numbers to store the value, a change in your
|
108
|
+
code might mean a new cache object is created after a deployment, and your old
|
109
|
+
cache object becomes orphaned, and will polute your storage forever.
|
110
|
+
|
99
111
|
#### namespaced keys
|
100
112
|
|
101
113
|
When storing the key/value object into Redis, the key name is based on the file
|
@@ -136,6 +148,9 @@ backend config, with a `primary` and `replicas` key:
|
|
136
148
|
Cache.backend = { primary: Redis.new, replicas: [Redis.new, Redis.new] }
|
137
149
|
```
|
138
150
|
|
151
|
+
When writing the initial object to the backend, the `primary` Redis is used. On
|
152
|
+
subsequent requests, a random replica is used to retrieve the stored value.
|
153
|
+
|
139
154
|
The above example obiously only works if the replicas receive the written data
|
140
155
|
from the primary instance.
|
141
156
|
|
@@ -152,6 +167,15 @@ cache('hello', ttl: 60) { 'hello world' }
|
|
152
167
|
Cache.new('hello', ttl: 60) { 'hello world' }
|
153
168
|
```
|
154
169
|
|
170
|
+
Since the core extension adds the `cache` method to the `Object` class, you can
|
171
|
+
also call this method directly on any instances inheriting from `Object`:
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
require 'object/cache/core_extension'
|
175
|
+
|
176
|
+
'hello world'.cache(ttl: 60)
|
177
|
+
```
|
178
|
+
|
155
179
|
That's it!
|
156
180
|
|
157
181
|
## License
|
data/lib/object/cache.rb
CHANGED
@@ -5,10 +5,11 @@ require 'object/cache/version'
|
|
5
5
|
|
6
6
|
# Caching of objects in a Redis store
|
7
7
|
class Cache
|
8
|
-
|
8
|
+
@default_ttl = (7 * 24 * 60 * 60) # 1 week
|
9
9
|
|
10
10
|
class << self
|
11
11
|
attr_accessor :backend
|
12
|
+
attr_accessor :default_ttl
|
12
13
|
|
13
14
|
# new
|
14
15
|
#
|
@@ -42,7 +43,7 @@ class Cache
|
|
42
43
|
# Cache.new { item } # item is only stored once, and then always
|
43
44
|
# # retrieved, even if it is a different item
|
44
45
|
#
|
45
|
-
def new(key = nil, ttl:
|
46
|
+
def new(key = nil, ttl: default_ttl)
|
46
47
|
return yield unless replica
|
47
48
|
|
48
49
|
key = Digest::SHA1.hexdigest([key, Proc.new.source_location].flatten.join)[0..5]
|
@@ -76,7 +77,7 @@ class Cache
|
|
76
77
|
true
|
77
78
|
end
|
78
79
|
|
79
|
-
def update_cache(key, value, ttl:
|
80
|
+
def update_cache(key, value, ttl: default_ttl)
|
80
81
|
return unless primary && (value = Marshal.dump(value))
|
81
82
|
|
82
83
|
ttl.to_i.zero? ? primary.set(key, value) : primary.setex(key, ttl.to_i, value)
|
data/lib/object/cache/version.rb
CHANGED
data/test/cache_test.rb
CHANGED
@@ -6,9 +6,10 @@ require 'object/cache'
|
|
6
6
|
require 'minitest/autorun'
|
7
7
|
|
8
8
|
# :no-doc:
|
9
|
-
class CacheTest < Minitest::Test
|
9
|
+
class CacheTest < Minitest::Test # rubocop:disable Metrics/ClassLength
|
10
10
|
def setup
|
11
11
|
Cache.backend = MockRedis.new
|
12
|
+
Cache.default_ttl = 604_800
|
12
13
|
end
|
13
14
|
|
14
15
|
def redis
|
@@ -77,7 +78,13 @@ class CacheTest < Minitest::Test
|
|
77
78
|
|
78
79
|
def test_cache_default_ttl
|
79
80
|
Cache.new { 'hello world' }
|
80
|
-
assert_equal Cache
|
81
|
+
assert_equal Cache.default_ttl, redis.ttl(redis.keys.first)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_cache_custom_default_ttl
|
85
|
+
Cache.default_ttl = 60
|
86
|
+
Cache.new { 'hello world' }
|
87
|
+
assert_equal 60, redis.ttl(redis.keys.first)
|
81
88
|
end
|
82
89
|
|
83
90
|
def test_cache_with_ttl
|
@@ -98,6 +105,19 @@ class CacheTest < Minitest::Test
|
|
98
105
|
assert Object.send(:remove_method, :cache)
|
99
106
|
end
|
100
107
|
|
108
|
+
def test_core_extension_on_objects
|
109
|
+
load 'object/cache/core_extension.rb'
|
110
|
+
assert_equal 'hello world', 'hello world'.cache
|
111
|
+
assert Object.send(:remove_method, :cache)
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_core_extension_on_objects_with_arguments
|
115
|
+
load 'object/cache/core_extension.rb'
|
116
|
+
'hello world'.cache(ttl: 30)
|
117
|
+
assert_equal 30, redis.ttl(redis.keys.first)
|
118
|
+
assert Object.send(:remove_method, :cache)
|
119
|
+
end
|
120
|
+
|
101
121
|
def test_backend_with_replicas
|
102
122
|
Cache.backend = { primary: redis, replicas: [redis, redis] }
|
103
123
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: object-cache
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean
|
@@ -154,4 +154,3 @@ signing_key:
|
|
154
154
|
specification_version: 4
|
155
155
|
summary: Caching of objects, using a Redis store.
|
156
156
|
test_files: []
|
157
|
-
has_rdoc:
|