readthis 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile +1 -1
- data/README.md +5 -4
- data/lib/readthis/cache.rb +35 -5
- data/lib/readthis/version.rb +1 -1
- data/spec/readthis/cache_spec.rb +26 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55fdafde7fa30d64c803d3952bf663d08c8c3f7a
|
4
|
+
data.tar.gz: 4f69451b0992644c1bf160bdd4d2a1b68bf3e495
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3602ac1b8a9296aef0c802b3cbd60b9689b496fe0efa9086024e4cbd69afa91dd59f57c1f0882ad4be933ddb678bd4039642dc679f55c65547366426d09f0cba
|
7
|
+
data.tar.gz: 121272db5ae46a67209ef7644bd2a352b197373222f608b5d53d981369f37fea410fd9d5e4a20e313432ac1dda12b95d7323cb606f6db44d169caed8405dc794
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## v0.6.0 2015-03-09
|
2
|
+
|
3
|
+
- Fixed: Safely handle calling `read_multi` without any keys. [Michael Rykov]
|
4
|
+
- Fixed: Pointed `redis-activesupport` at master. Only effected development and
|
5
|
+
testing.
|
6
|
+
- Added: A `write_multi` method is no available to bulk set keys and values. It
|
7
|
+
is used by `fetch_multi` internally to ensure that there are at most two Redis
|
8
|
+
calls.
|
9
|
+
|
1
10
|
## v0.5.2 2015-01-09
|
2
11
|
|
3
12
|
- Fixed: Remove the `pipeline` around `fetch_multi` writing. This will slow down
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -80,16 +80,17 @@ Readthis uses Ruby's `Marshal` module for dumping and loading all values by
|
|
80
80
|
default. This isn't always the fastest option, depending on your use case it may
|
81
81
|
be desirable to use a faster but less flexible marshaller.
|
82
82
|
|
83
|
-
Use Oj for JSON marshalling, extremely fast, limited types:
|
83
|
+
Use Oj for JSON marshalling, extremely fast, but supports limited types:
|
84
84
|
|
85
85
|
```ruby
|
86
|
-
Readthis::Cache.new(marshal: Oj)
|
86
|
+
Readthis::Cache.new(url, marshal: Oj)
|
87
87
|
```
|
88
88
|
|
89
|
-
If you don't mind everything
|
89
|
+
If you don't mind everything handles as a string then use the pass-through
|
90
|
+
marshaller:
|
90
91
|
|
91
92
|
```ruby
|
92
|
-
Readthis::Cache.new(marshal: Readthis::Passthrough)
|
93
|
+
Readthis::Cache.new(url, marshal: Readthis::Passthrough)
|
93
94
|
```
|
94
95
|
|
95
96
|
## Differences
|
data/lib/readthis/cache.rb
CHANGED
@@ -216,6 +216,8 @@ module Readthis
|
|
216
216
|
options = merged_options(extract_options!(keys))
|
217
217
|
mapping = keys.map { |key| namespaced_key(key, options) }
|
218
218
|
|
219
|
+
return {} if keys.empty?
|
220
|
+
|
219
221
|
invoke(:read_multi, keys) do |store|
|
220
222
|
values = store.mget(mapping).map { |value| entity.load(value) }
|
221
223
|
|
@@ -223,6 +225,31 @@ module Readthis
|
|
223
225
|
end
|
224
226
|
end
|
225
227
|
|
228
|
+
# Write multiple key value pairs simultaneously. This is an atomic
|
229
|
+
# operation that will always succeed and will overwrite existing
|
230
|
+
# values.
|
231
|
+
#
|
232
|
+
# This is a non-standard, but useful, cache method.
|
233
|
+
#
|
234
|
+
# @param [Hash] Key value hash to write
|
235
|
+
# @param [Hash] Optional overrides
|
236
|
+
#
|
237
|
+
# @example
|
238
|
+
#
|
239
|
+
# cache.write_multi('a', 1, 'b', 2) # => true
|
240
|
+
#
|
241
|
+
def write_multi(hash, options = {})
|
242
|
+
options = merged_options(options)
|
243
|
+
values = hash.each_with_object([]) do |(key, value), memo|
|
244
|
+
memo << namespaced_key(key, options)
|
245
|
+
memo << entity.dump(value)
|
246
|
+
end
|
247
|
+
|
248
|
+
invoke(:write_multi, values) do |store|
|
249
|
+
store.mset(values)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
226
253
|
# Fetches multiple keys from the cache using a single call to the server
|
227
254
|
# and filling in any cache misses. All read and write operations are
|
228
255
|
# executed atomically.
|
@@ -243,20 +270,23 @@ module Readthis
|
|
243
270
|
# end
|
244
271
|
#
|
245
272
|
def fetch_multi(*keys)
|
246
|
-
results
|
247
|
-
|
273
|
+
results = read_multi(*keys)
|
274
|
+
extracted = extract_options!(keys)
|
275
|
+
missing = {}
|
248
276
|
|
249
277
|
invoke(:fetch_multi, keys) do |store|
|
250
278
|
results.each do |key, value|
|
251
279
|
if value.nil?
|
252
280
|
value = yield(key)
|
253
|
-
|
281
|
+
missing[key] = value
|
254
282
|
results[key] = value
|
255
283
|
end
|
256
284
|
end
|
257
|
-
|
258
|
-
results
|
259
285
|
end
|
286
|
+
|
287
|
+
write_multi(missing, extracted) if missing.any?
|
288
|
+
|
289
|
+
results
|
260
290
|
end
|
261
291
|
|
262
292
|
# Returns `true` if the cache contains an entry for the given key.
|
data/lib/readthis/version.rb
CHANGED
data/spec/readthis/cache_spec.rb
CHANGED
@@ -144,6 +144,27 @@ RSpec.describe Readthis::Cache do
|
|
144
144
|
'e' => 2,
|
145
145
|
)
|
146
146
|
end
|
147
|
+
|
148
|
+
it 'returns {} with no keys' do
|
149
|
+
expect(cache.read_multi(namespace: 'cache')).to eq({})
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe '#write_multi' do
|
154
|
+
it 'writes multiple key value pairs simultaneously' do
|
155
|
+
response = cache.write_multi('a' => 1, 'b' => 2)
|
156
|
+
|
157
|
+
expect(response).to be_truthy
|
158
|
+
expect(cache.read('a')).to eq(1)
|
159
|
+
expect(cache.read('b')).to eq(2)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'respects passed options' do
|
163
|
+
cache.write_multi({ 'a' => 1, 'b' => 2 }, namespace: 'multi')
|
164
|
+
|
165
|
+
expect(cache.read('a')).to be_nil
|
166
|
+
expect(cache.read('a', namespace: 'multi')).to eq(1)
|
167
|
+
end
|
147
168
|
end
|
148
169
|
|
149
170
|
describe '#fetch_multi' do
|
@@ -175,6 +196,11 @@ RSpec.describe Readthis::Cache do
|
|
175
196
|
expect(cache.read('b')).to be_nil
|
176
197
|
expect(cache.read('b', namespace: 'alph')).not_to be_nil
|
177
198
|
end
|
199
|
+
|
200
|
+
it 'return empty results without keys' do
|
201
|
+
results = cache.fetch_multi(namespace: 'alph') { |key| key }
|
202
|
+
expect(results).to eq({})
|
203
|
+
end
|
178
204
|
end
|
179
205
|
|
180
206
|
describe '#exist?' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: readthis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Parker Selbert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -151,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
151
|
version: '0'
|
152
152
|
requirements: []
|
153
153
|
rubyforge_project:
|
154
|
-
rubygems_version: 2.
|
154
|
+
rubygems_version: 2.4.5
|
155
155
|
signing_key:
|
156
156
|
specification_version: 4
|
157
157
|
summary: Pooled active support compliant caching with redis
|