libmemcached_store 0.7.2 → 0.8.0
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 +7 -0
- data/lib/active_support/cache/libmemcached_local_store.rb +105 -0
- data/lib/active_support/cache/libmemcached_store.rb +25 -25
- data/lib/memcached/version.rb +1 -1
- metadata +45 -50
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 81049d49ca34851708a4420138dcda2e5f066cc3
|
4
|
+
data.tar.gz: c2a1cab1fa37246d1c9488a826992f06d42582a6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0893cf06da549233d33041a00ada8de50380eb2d3bb0e95ed2534abe24c889622f9a0139272a28927edd88962000c5e6050fccb3f28f28e042043cd50ded332b
|
7
|
+
data.tar.gz: 5f935624798ce3060f7d0bcd3f0fb67f04d660c84aba61ee0451880da385cb75febc27d56895c7c5a7d2dce1077ae60605f31fcc17785fe1a9f0bc08a2f0adde
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'active_support/cache/libmemcached_store'
|
2
|
+
|
3
|
+
# cache nils
|
4
|
+
# https://github.com/rails/rails/pull/22194
|
5
|
+
if ActiveSupport::VERSION::MAJOR < 5
|
6
|
+
ActiveSupport::Cache::Strategy::LocalCache::LocalStore.class_eval do
|
7
|
+
def fetch_entry(key, options=nil)
|
8
|
+
@data.fetch(key) { @data[key] = yield }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
ActiveSupport::Cache::Strategy::LocalCache.class_eval do
|
13
|
+
def read_entry(key, options) # :nodoc:
|
14
|
+
if cache = local_cache
|
15
|
+
cache.fetch_entry(key) { super }
|
16
|
+
else
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module ActiveSupport
|
24
|
+
module Cache
|
25
|
+
class LibmemcachedLocalStore < LibmemcachedStore
|
26
|
+
include ActiveSupport::Cache::Strategy::LocalCache
|
27
|
+
|
28
|
+
# if we read from local_cache then the return value from read_entry will be an Entry,
|
29
|
+
# so convert it to it's value
|
30
|
+
def read(*args)
|
31
|
+
result = super
|
32
|
+
result = result.value if result.is_a?(ActiveSupport::Cache::Entry)
|
33
|
+
result
|
34
|
+
end
|
35
|
+
|
36
|
+
# make read multi hit local cache
|
37
|
+
def read_multi(*names)
|
38
|
+
return super unless cache = local_cache
|
39
|
+
|
40
|
+
options = names.extract_options!
|
41
|
+
|
42
|
+
missing_names = []
|
43
|
+
|
44
|
+
# We write raw values to the local cache, unlike rails MemcachedStore, so we cannot use local_cache.read_multi.
|
45
|
+
# Once read_multi_entry is available we can switch to that.
|
46
|
+
results = names.each_with_object({}) do |name, results|
|
47
|
+
value = local_cache.fetch_entry(name) do
|
48
|
+
missing_names << name
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
results[name] = value unless value.nil?
|
52
|
+
end
|
53
|
+
|
54
|
+
if missing_names.any?
|
55
|
+
missing_names << options
|
56
|
+
missing = super(*missing_names)
|
57
|
+
missing.each { |k,v| cache.write_entry(k, v, nil) }
|
58
|
+
results.merge!(missing)
|
59
|
+
end
|
60
|
+
|
61
|
+
results
|
62
|
+
end
|
63
|
+
|
64
|
+
# memcached returns a fixnum on increment, but the value that is stored is raw / a string
|
65
|
+
def increment(key, amount, options={})
|
66
|
+
result = super
|
67
|
+
if result && (cache = local_cache)
|
68
|
+
cache.write(key, result.to_s)
|
69
|
+
end
|
70
|
+
result
|
71
|
+
end
|
72
|
+
|
73
|
+
# memcached returns a fixnum on decrement, but the value that is stored is raw / a string
|
74
|
+
def decrement(key, amount, options={})
|
75
|
+
result = super
|
76
|
+
if result && (cache = local_cache)
|
77
|
+
cache.write(key, result.to_s)
|
78
|
+
end
|
79
|
+
result
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
# when trying to do a raw read we want the marshaled value to behave the same as memcached
|
85
|
+
def read_entry(key, options)
|
86
|
+
entry = super
|
87
|
+
|
88
|
+
if options && options[:raw] && local_cache && entry && !entry.is_a?(Entry)
|
89
|
+
entry = Marshal.dump(entry)
|
90
|
+
end
|
91
|
+
|
92
|
+
entry
|
93
|
+
end
|
94
|
+
|
95
|
+
# for memcached writing raw means writing a string and not the actual value
|
96
|
+
def write_entry(key, entry, options) # :nodoc:
|
97
|
+
written = super
|
98
|
+
if options && options[:raw] && local_cache && written
|
99
|
+
local_cache.write_entry(key, Entry.new(entry.to_s), options)
|
100
|
+
end
|
101
|
+
written
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -119,31 +119,6 @@ module ActiveSupport
|
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
def fetch_with_race_condition_ttl(key, options={}, &block)
|
123
|
-
options = options.dup
|
124
|
-
|
125
|
-
race_ttl = options.delete(:race_condition_ttl) || raise("Use :race_condition_ttl option or normal fetch")
|
126
|
-
expires_in = options.fetch(:expires_in)
|
127
|
-
options[:expires_in] = expires_in + race_ttl
|
128
|
-
options[:preserve_race_condition_entry] = true
|
129
|
-
|
130
|
-
value = fetch(key, options) { FetchWithRaceConditionTTLEntry.new(yield, expires_in) }
|
131
|
-
|
132
|
-
return value unless value.is_a?(FetchWithRaceConditionTTLEntry)
|
133
|
-
|
134
|
-
if value.expired? && !value.extended
|
135
|
-
# we take care of refreshing the cache, all others should keep reading
|
136
|
-
value.extended = true
|
137
|
-
write(key, value, options.merge(:expires_in => value.expires_in + race_ttl))
|
138
|
-
|
139
|
-
# calculate new value and store it
|
140
|
-
value = FetchWithRaceConditionTTLEntry.new(yield, expires_in)
|
141
|
-
write(key, value, options)
|
142
|
-
end
|
143
|
-
|
144
|
-
value.value
|
145
|
-
end
|
146
|
-
|
147
122
|
def read(key, options = nil)
|
148
123
|
key = expanded_key(key)
|
149
124
|
instrument(:read, key, options) do |payload|
|
@@ -281,6 +256,31 @@ module ActiveSupport
|
|
281
256
|
|
282
257
|
private
|
283
258
|
|
259
|
+
def fetch_with_race_condition_ttl(key, options={}, &block)
|
260
|
+
options = options.dup
|
261
|
+
|
262
|
+
race_ttl = options.delete(:race_condition_ttl) || raise("Use :race_condition_ttl option or normal fetch")
|
263
|
+
expires_in = options.fetch(:expires_in)
|
264
|
+
options[:expires_in] = expires_in + race_ttl
|
265
|
+
options[:preserve_race_condition_entry] = true
|
266
|
+
|
267
|
+
value = fetch(key, options) { FetchWithRaceConditionTTLEntry.new(yield, expires_in) }
|
268
|
+
|
269
|
+
return value unless value.is_a?(FetchWithRaceConditionTTLEntry)
|
270
|
+
|
271
|
+
if value.expired? && !value.extended
|
272
|
+
# we take care of refreshing the cache, all others should keep reading
|
273
|
+
value.extended = true
|
274
|
+
write(key, value, options.merge(:expires_in => value.expires_in + race_ttl))
|
275
|
+
|
276
|
+
# calculate new value and store it
|
277
|
+
value = FetchWithRaceConditionTTLEntry.new(yield, expires_in)
|
278
|
+
write(key, value, options)
|
279
|
+
end
|
280
|
+
|
281
|
+
value.value
|
282
|
+
end
|
283
|
+
|
284
284
|
def convert_race_condition_entry(value, options={})
|
285
285
|
if !options[:preserve_race_condition_entry] && value.is_a?(FetchWithRaceConditionTTLEntry)
|
286
286
|
value.value
|
data/lib/memcached/version.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libmemcached_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.8.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Christopher Cocchi-Perrier
|
@@ -11,189 +10,185 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date: 2015-
|
13
|
+
date: 2015-11-20 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: memcached
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - ">="
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: '0'
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- -
|
26
|
+
- - ">="
|
30
27
|
- !ruby/object:Gem::Version
|
31
28
|
version: '0'
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: rack
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
|
-
- -
|
33
|
+
- - ">="
|
38
34
|
- !ruby/object:Gem::Version
|
39
35
|
version: '0'
|
40
36
|
type: :development
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
|
-
- -
|
40
|
+
- - ">="
|
46
41
|
- !ruby/object:Gem::Version
|
47
42
|
version: '0'
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: rake
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
|
-
- -
|
47
|
+
- - ">="
|
54
48
|
- !ruby/object:Gem::Version
|
55
49
|
version: '0'
|
56
50
|
type: :development
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
53
|
requirements:
|
61
|
-
- -
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: bump
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
62
69
|
- !ruby/object:Gem::Version
|
63
70
|
version: '0'
|
64
71
|
- !ruby/object:Gem::Dependency
|
65
72
|
name: mocha
|
66
73
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
74
|
requirements:
|
69
|
-
- -
|
75
|
+
- - ">="
|
70
76
|
- !ruby/object:Gem::Version
|
71
77
|
version: '0'
|
72
78
|
type: :development
|
73
79
|
prerelease: false
|
74
80
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
81
|
requirements:
|
77
|
-
- -
|
82
|
+
- - ">="
|
78
83
|
- !ruby/object:Gem::Version
|
79
84
|
version: '0'
|
80
85
|
- !ruby/object:Gem::Dependency
|
81
86
|
name: dalli
|
82
87
|
requirement: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
88
|
requirements:
|
85
|
-
- -
|
89
|
+
- - ">="
|
86
90
|
- !ruby/object:Gem::Version
|
87
91
|
version: '0'
|
88
92
|
type: :development
|
89
93
|
prerelease: false
|
90
94
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
95
|
requirements:
|
93
|
-
- -
|
96
|
+
- - ">="
|
94
97
|
- !ruby/object:Gem::Version
|
95
98
|
version: '0'
|
96
99
|
- !ruby/object:Gem::Dependency
|
97
100
|
name: minitest
|
98
101
|
requirement: !ruby/object:Gem::Requirement
|
99
|
-
none: false
|
100
102
|
requirements:
|
101
|
-
- -
|
103
|
+
- - ">="
|
102
104
|
- !ruby/object:Gem::Version
|
103
105
|
version: '0'
|
104
106
|
type: :development
|
105
107
|
prerelease: false
|
106
108
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
none: false
|
108
109
|
requirements:
|
109
|
-
- -
|
110
|
+
- - ">="
|
110
111
|
- !ruby/object:Gem::Version
|
111
112
|
version: '0'
|
112
113
|
- !ruby/object:Gem::Dependency
|
113
114
|
name: minitest-rg
|
114
115
|
requirement: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
116
|
requirements:
|
117
|
-
- -
|
117
|
+
- - ">="
|
118
118
|
- !ruby/object:Gem::Version
|
119
119
|
version: '0'
|
120
120
|
type: :development
|
121
121
|
prerelease: false
|
122
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
-
none: false
|
124
123
|
requirements:
|
125
|
-
- -
|
124
|
+
- - ">="
|
126
125
|
- !ruby/object:Gem::Version
|
127
126
|
version: '0'
|
128
127
|
- !ruby/object:Gem::Dependency
|
129
128
|
name: activesupport
|
130
129
|
requirement: !ruby/object:Gem::Requirement
|
131
|
-
none: false
|
132
130
|
requirements:
|
133
|
-
- -
|
131
|
+
- - ">="
|
134
132
|
- !ruby/object:Gem::Version
|
135
133
|
version: '3'
|
136
134
|
type: :development
|
137
135
|
prerelease: false
|
138
136
|
version_requirements: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
137
|
requirements:
|
141
|
-
- -
|
138
|
+
- - ">="
|
142
139
|
- !ruby/object:Gem::Version
|
143
140
|
version: '3'
|
144
141
|
- !ruby/object:Gem::Dependency
|
145
142
|
name: actionpack
|
146
143
|
requirement: !ruby/object:Gem::Requirement
|
147
|
-
none: false
|
148
144
|
requirements:
|
149
|
-
- -
|
145
|
+
- - ">="
|
150
146
|
- !ruby/object:Gem::Version
|
151
147
|
version: '3'
|
152
148
|
type: :development
|
153
149
|
prerelease: false
|
154
150
|
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
none: false
|
156
151
|
requirements:
|
157
|
-
- -
|
152
|
+
- - ">="
|
158
153
|
- !ruby/object:Gem::Version
|
159
154
|
version: '3'
|
160
|
-
description:
|
161
|
-
|
162
|
-
|
163
|
-
|
155
|
+
description: |-
|
156
|
+
An ActiveSupport cache store that uses the C-based libmemcached client through
|
157
|
+
Evan Weaver's Ruby/SWIG wrapper, memcached. libmemcached is fast, lightweight,
|
158
|
+
and supports consistent hashing, non-blocking IO, and graceful server failover.
|
164
159
|
email: cocchi.c@gmail.com
|
165
160
|
executables: []
|
166
161
|
extensions: []
|
167
162
|
extra_rdoc_files: []
|
168
163
|
files:
|
169
164
|
- lib/action_dispatch/session/libmemcached_store.rb
|
165
|
+
- lib/active_support/cache/libmemcached_local_store.rb
|
170
166
|
- lib/active_support/cache/libmemcached_store.rb
|
171
167
|
- lib/libmemcached_store.rb
|
172
168
|
- lib/memcached/get_with_flags.rb
|
173
169
|
- lib/memcached/version.rb
|
174
|
-
homepage:
|
170
|
+
homepage: https://github.com/ccocchi/libmemcached_store
|
175
171
|
licenses:
|
176
172
|
- MIT
|
173
|
+
metadata: {}
|
177
174
|
post_install_message:
|
178
175
|
rdoc_options: []
|
179
176
|
require_paths:
|
180
177
|
- lib
|
181
178
|
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
-
none: false
|
183
179
|
requirements:
|
184
|
-
- -
|
180
|
+
- - ">="
|
185
181
|
- !ruby/object:Gem::Version
|
186
182
|
version: '0'
|
187
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
|
-
none: false
|
189
184
|
requirements:
|
190
|
-
- -
|
185
|
+
- - ">="
|
191
186
|
- !ruby/object:Gem::Version
|
192
187
|
version: '0'
|
193
188
|
requirements: []
|
194
189
|
rubyforge_project:
|
195
|
-
rubygems_version:
|
190
|
+
rubygems_version: 2.4.5.1
|
196
191
|
signing_key:
|
197
|
-
specification_version:
|
192
|
+
specification_version: 4
|
198
193
|
summary: ActiveSupport 3+ cache store for the C-based libmemcached client
|
199
194
|
test_files: []
|