battle_ship 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6c1a6e6b2bbce4d90f39d7a4d50b9064eb2c25a8
4
- data.tar.gz: 201bfa26abb91dbfcd900ba21483ef289ab86a70
3
+ metadata.gz: 122cf236b5148bbed85ef814efd2eb4552908255
4
+ data.tar.gz: 6bf5d9c28887a6e988f704d7eb24cefb79218759
5
5
  SHA512:
6
- metadata.gz: eb495f4cfce3a23eed57d2a06836a3c100a6548b00c066f1fcf7d578fa581dff4d882d90cef1dc02cec4d334f24bed05e5cd175b17403556f209e615f65b0290
7
- data.tar.gz: bf4cd384fbb12a719bd81fcbf44865424e5e458528dca3a04c54e61ec3d3cd34e99b370426a1e64b3c8df98840b39b9b71eda28ab9e0277b7710c0a1d1bbe8ed
6
+ metadata.gz: b701f36e44d2596fefc64eb6eb1708e97332acf88884d2a35f8f459c8ec32021b3b293da842446b2dc508e450acb31b6a90f5c54288a24f632ec4359ef9cdbc0
7
+ data.tar.gz: ffb5758795a6451dd628195284c720f87561dc31b92e90b0df08da1cb16f2b043b50d3282a0d11282f5440523599369677255e81f8542745afcbec062adc2244
data/README.md CHANGED
@@ -8,18 +8,15 @@ curious what your success is with your caching strategies. Perhaps you cache
8
8
  some user objects, sessions, etc. How do you know whether it's working? What if
9
9
  it's mostly misses?
10
10
 
11
- BattleShip provides an api that wraps Rails.cache methods. It takes a namespace
12
- by which it will aggregate data on your cache hits and misses.
11
+ BattleShip updates ActiveSupport::Cache::Store (and all its subclasses, so
12
+ you're covered if you use RedisStore or MemcachedStore) to increment a counter
13
+ for each cache hit and miss
13
14
 
14
15
  #### Warnings, Caveats, etc.
15
- Battleship is a gem that expects there to be a class called __Rails__ with a .cache
16
- method. This .cache method must implement the following:
17
- - fetch
18
- - read
19
- - write
20
- - increment
16
+ BattleShip works by updating ActiveSupport::Cache::Store, so requires this class
17
+ to exist.
21
18
 
22
- This cache must also be able to complete _atomic increment_ operations with the #increment method
19
+ This cache must also be able to complete _atomic increment_ operations with the #increment method.
23
20
 
24
21
  This is early development days for BattleShip. Please feel free to open an issue
25
22
  here with either questions or suggestions. And, of course, contributions are
@@ -41,24 +38,20 @@ Or install it yourself as:
41
38
 
42
39
  ## Usage
43
40
 
44
- Instead of calling Rails.cache, call BattleShip. Instead of passing a key, pass
45
- in both a namespace (e.g., sessions or users) and a unique id (e.g. auth_token
46
- or user.id).
47
-
48
- After adding to your Gemfile, use BattleShip where you would previously have
49
- used Rails.cache.
50
- * Caching User objects? Call ```BattleShip.write("user", user.id, user)``` for a
51
- given user object
52
- * This will store the user object just as if you had called ```Rails.cache.write("user_#{user.id}", user)```
53
- * The benefit comes when you call read: ```BattleShip.read("user", 1)```
54
- * If you have a value cached, BattleShip will increment the key at "user_hit" by
55
- 1 (hence the need for atomic increment operations)
56
- * If there is no value found, BattleShip will increment the key at "user_miss"
57
-
58
- At any time, you can access the current number of hits and misses by calling
59
- BattleShip.hits(:namespace) and BattleShip.misses(:namespace), where :namespace
60
- is any given namespace you have used (e.g. 'user', as above). This can be passed
61
- as a symbol or string.
41
+ Just keep on using Rails.cache methods like you do today. BattleShip makes
42
+ certain assumptions that you should be aware of:
43
+ * When there's a cache hit, it will increment the value of the returned object's
44
+ class name plus the string "\_hits" (e.g. a User object's hits will be stored
45
+ in the cache at key ```"User_hits"```)
46
+ * When there's a cache miss, BattleShip doesn't know exactly the class you were
47
+ expecting, so it assumes that you either: (1) Passed in a namespace key in
48
+ the options hash, or (2) Named your key such that the first underscore occurs
49
+ after the name of the class (e.g. "User_123").
50
+ * Access the hits by calling ```#hits``` on your particular cache implementation (e.g.
51
+ ```Rails.cache.hits```) and passing in the namespace, e.g. User (either the string
52
+ or the classname).
53
+ * Same deal with misses, but call ```#misses``` instead
54
+
62
55
 
63
56
  ## Contributing
64
57
 
@@ -70,5 +63,7 @@ as a symbol or string.
70
63
 
71
64
  ## To Do
72
65
 
73
- 1. Add config method with any necessary config
74
- 2. Create specs specifically using redis-store and memcache-store, document here
66
+ 1. Add performance measurements
67
+ 2. Add rails example app
68
+ 3. Add config option for turning on/off
69
+ 4. Add config option for setting time-frame of hits/misses
data/battle_ship.gemspec CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = BattleShip::VERSION
9
9
  spec.authors = ["DavidRagone"]
10
10
  spec.email = ["dmragone@gmail.com"]
11
- spec.description = %q{Wrapper class for Rails.cache related methods to track cache hits & misses}
11
+ spec.description = %q{Adds counters to cache when successful read operation completes in order to track Rails.cache hits & misses}
12
12
  spec.summary = %q{Wrapper for Rails.cache methods}
13
- spec.homepage = "http://www.dmragone.com"
13
+ spec.homepage = "https://github.com/DavidRagone/BattleShip"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -21,4 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "activesupport"
25
+
26
+ spec.add_runtime_dependency "activesupport"
24
27
  end
@@ -0,0 +1,9 @@
1
+ module ActiveSupport
2
+ module Cache
3
+ class Store
4
+ def self.inherited(subclass)
5
+ subclass.class_eval("prepend BattleShip")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module BattleShip
2
- VERSION = "0.0.1"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/battle_ship.rb CHANGED
@@ -1,6 +1,32 @@
1
1
  module BattleShip
2
+ def hits(key)
3
+ read(key.to_s.camelize << '_hits', skip_increment: true)
4
+ end
5
+
6
+ def misses(key)
7
+ read(key.to_s.camelize << '_misses', skip_increment: true)
8
+ end
9
+
10
+ def read_entry(key, options) # :nodoc:
11
+ entry = super(key, options)
12
+ return entry if options[:skip_increment]
13
+ if entry
14
+ increment("#{entry.value.class}_hits")
15
+ else
16
+ increment("#{namespace(key, options)}_misses")
17
+ end
18
+ entry
19
+ end
20
+
21
+ private
22
+ def namespace(key, options)
23
+ (options[:namespace] || key_up_to_first_underscore(key)).camelize
24
+ end
25
+
26
+ def key_up_to_first_underscore(key)
27
+ key[0..(key.index('_') -1)]
28
+ end
2
29
  end
3
30
 
4
31
  require "battle_ship/version"
5
- require "battle_ship/core"
6
- require "battle_ship/pass_through"
32
+ require "active_support/cache/store"
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ class User
4
+ def initialize(options)
5
+ @name = options[:name]
6
+ @age = options[:age]
7
+ end
8
+ end
9
+
10
+ class ActiveSupport::Cache::Something < ActiveSupport::Cache::Store
11
+ protected
12
+ def read_entry(key, options)
13
+ @value
14
+ end
15
+
16
+ def write_entry(key, entry, options)
17
+ @value = entry
18
+ end
19
+ end
20
+
21
+ describe ActiveSupport::Cache::Something do
22
+ let(:cache) { ActiveSupport::Cache::Something.new }
23
+ let(:user) { User.new(name: 'Bob', age: 'old') }
24
+
25
+ context ".read" do
26
+ it "increments the related counter on hits" do
27
+ cache.should_receive(:increment).with("User_hits")
28
+ cache.write("user_1", user)
29
+ cache.read("user_1").should eq user
30
+ end
31
+
32
+ it "increments the related counter on misses" do
33
+ cache.should_receive(:increment).with("User_misses")
34
+ cache.read("user_1").should eq nil
35
+ end
36
+ end
37
+ end
38
+
@@ -1,280 +1,47 @@
1
1
  require 'spec_helper'
2
2
 
3
- class Rails
4
- def self.cache
5
- Cache
6
- end
7
- end
8
- class Cache
9
- def self.read(k)
10
- end
11
- def self.increment(k,a=1,o=nil)
12
- end
13
- def self.fetch(k,o=nil)
14
- if block_given?
15
- yield
16
- end
17
- end
18
- end
19
-
3
+ # For tests of #read_entry, see spec/lib/active_support_cache_subclass_spec.rb
20
4
  describe BattleShip do
21
- describe ".read" do
22
- shared_examples_for :read do
23
- it "retrieves value from Rails.cache.read" do
24
- Cache.should_receive(:read).with("namespace_#{uniqueid}")
25
- BattleShip.read(:namespace, uniqueid)
26
- end
5
+ let(:dummy) { Class.new { prepend(BattleShip) }.new }
27
6
 
28
- it "returns value from Rails.cache.read" do
29
- Cache.stub(:read) { 'a value' }
30
- BattleShip.read(:foo, :bar).should eq 'a value'
31
- end
32
-
33
- it "increments namespace hit counter when value is non-nil" do
34
- Cache.stub(:read) { 'a value' }
35
- Cache.should_receive(:increment).with('foo_hit', 1, nil)
36
- BattleShip.read(:foo, :bar)
37
- end
38
-
39
- it "increments namespace miss counter when value is nil" do
40
- Cache.stub(:read) { nil }
41
- Cache.should_receive(:increment).with('foo_miss', 1, nil)
42
- BattleShip.read(:foo, :bar)
43
- end
44
- end
45
-
46
- context 'when uniqueid is a symbol' do
47
- let(:uniqueid) { :foo }
48
- it_behaves_like :read
49
- end
50
-
51
- context 'when uniqueid is a string' do
52
- let(:uniqueid) { 'foo' }
53
- it_behaves_like :read
54
- end
55
-
56
- context 'when uniqueid is a number' do
57
- let(:uniqueid) { 4 }
58
- it_behaves_like :read
7
+ describe "#hits" do
8
+ it "reads, skipping increment" do
9
+ dummy.should_receive(:read).with("Foo_hits", { skip_increment: true })
10
+ dummy.hits("Foo")
59
11
  end
60
12
  end
61
13
 
62
- describe ".write" do
63
- shared_examples_for :write do
64
- it "writes value to Rails.cache.write using given key" do
65
- Cache.should_receive(:write).with("namespace_#{uniqueid}", value, nil)
66
- BattleShip.write(:namespace, uniqueid, value)
67
- end
68
- end
69
-
70
- context 'when uniqueid is a symbol' do
71
- let(:uniqueid) { :foo }
72
- let(:value) { :bar }
73
- it_behaves_like :write
74
- end
75
-
76
- context 'when uniqueid is a string' do
77
- let(:uniqueid) { 'foo' }
78
- let(:value) { 'bar' }
79
- it_behaves_like :write
80
- end
81
-
82
- context 'when uniqueid is a number' do
83
- let(:uniqueid) { 4 }
84
- let(:value) { 5 }
85
- it_behaves_like :write
14
+ describe "#misses" do
15
+ it "reads, skipping increment" do
16
+ dummy.should_receive(:read).with("Foo_misses", { skip_increment: true })
17
+ dummy.misses("Foo")
86
18
  end
87
19
  end
88
20
 
89
- describe ".fetch" do
90
- shared_examples_for :fetch do
91
- it "retrieves value from Rails.cache.fetch" do
92
- Cache.should_receive(:fetch)
93
- subject
94
- end
95
-
96
- it "returns value from Rails.cache.fetch" do
97
- Cache.stub(:fetch) { 'a value' }
98
- subject.should eq 'a value'
99
- end
100
-
101
- it "increments namespace hit counter when value is non-nil" do
102
- Cache.stub(:fetch) { 'a value' }
103
- Cache.stub(:read) { 'a value' }
104
- Cache.should_receive(:increment).with('foo_hit', 1, nil)
105
- subject
106
- end
107
-
108
- it "increments namespace miss counter when value is nil" do
109
- Cache.stub(:fetch) { nil }
110
- Cache.should_receive(:increment).with('foo_miss', 1, nil)
111
- subject
21
+ describe "private methods" do
22
+ describe "#namespace" do
23
+ subject { dummy.send(:namespace, key, options) }
24
+ context "when options includes namespace" do
25
+ let(:key) { 'Key' }
26
+ let(:options) { { namespace: 'NameSpace' } }
27
+ it "returns the option's namespace" do
28
+ subject.should eq 'NameSpace'
29
+ end
112
30
  end
113
- end
114
- context "when block given" do
115
- subject { described_class.fetch(:foo, :bar) { 'a different value' } }
116
- it_behaves_like :fetch
117
31
 
118
- context "when value absent" do
119
- it "should set the value" do
120
- subject
121
- subject.should eq 'a different value'
32
+ context "when options does not include namespace" do
33
+ let(:key) { 'Key_Thing_123' }
34
+ let(:options) { { } }
35
+ it "returns the string preceding the first underscore" do
36
+ subject.should eq 'Key'
122
37
  end
123
38
  end
124
39
  end
125
40
 
126
- context "when block absent" do
127
- subject { described_class.fetch(:foo, :bar) }
128
- it_behaves_like :fetch
129
- end
130
- end
131
-
132
- describe ".cleanup" do
133
- let(:options) { { } }
134
- it "passes to underlying" do
135
- Cache.should_receive(:cleanup).with(options)
136
- BattleShip.cleanup(options)
137
- end
138
-
139
- it "does not require options" do
140
- Cache.should_receive(:cleanup).with(nil)
141
- BattleShip.cleanup
142
- end
143
- end
144
-
145
- describe ".clear" do
146
- let(:options) { { } }
147
- it "passes to underlying" do
148
- Cache.should_receive(:clear).with(options)
149
- BattleShip.clear(options)
150
- end
151
-
152
- it "does not require options" do
153
- Cache.should_receive(:clear).with(nil)
154
- BattleShip.clear
155
- end
156
- end
157
-
158
- describe ".decrement" do
159
- let(:options) { { } }
160
- let(:namespace) { 'name' }
161
- let(:uid) { '1' }
162
- let(:amount) { 2 }
163
- it "passes to underlying" do
164
- Cache.should_receive(:decrement).with('name_1', amount, options)
165
- BattleShip.decrement(namespace, uid, amount, options)
166
- end
167
-
168
- it "defaults amount to 1" do
169
- Cache.should_receive(:decrement).with('name_1', 3, options)
170
- BattleShip.decrement(namespace, uid, 3, options)
171
- end
172
-
173
- it "does not require options" do
174
- Cache.should_receive(:decrement).with('name_1', 1, nil)
175
- BattleShip.decrement(namespace, uid)
176
- end
177
- end
178
-
179
- describe ".delete" do
180
- let(:namespace) { 'name' }
181
- let(:uid) { 1 }
182
- let(:options) { { } }
183
- it "passes to underlying" do
184
- Cache.should_receive(:delete).with('name_1', options)
185
- BattleShip.delete(namespace, uid, options)
186
- end
187
-
188
- it "does not require options" do
189
- Cache.should_receive(:delete).with('name_1', nil)
190
- BattleShip.delete(namespace, uid)
191
- end
192
- end
193
-
194
- describe ".delete_matched" do
195
- let(:matcher) { 'something*' }
196
- let(:options) { { } }
197
- it "passes to underlying" do
198
- Cache.should_receive(:delete_matched).with(matcher, options)
199
- BattleShip.delete_matched(matcher, options)
200
- end
201
-
202
- it "does not require options" do
203
- Cache.should_receive(:delete_matched).with(matcher, nil)
204
- BattleShip.delete_matched(matcher)
205
- end
206
- end
207
-
208
- describe ".exist?" do
209
- let(:namespace) { 'name' }
210
- let(:uid) { 1 }
211
- let(:options) { { } }
212
- it "passes to underlying" do
213
- Cache.should_receive(:exist?).with('name_1', options)
214
- BattleShip.exist?(namespace, uid, options)
215
- end
216
-
217
- it "does not require options" do
218
- Cache.should_receive(:exist?).with('name_1', nil)
219
- BattleShip.exist?(namespace, uid)
220
- end
221
- end
222
-
223
- describe ".increment" do
224
- let(:options) { { } }
225
- let(:namespace) { 'name' }
226
- let(:uid) { '1' }
227
- let(:amount) { 2 }
228
- it "passes to underlying" do
229
- Cache.should_receive(:increment).with('name_1', amount, options)
230
- BattleShip.increment(namespace, uid, amount, options)
231
- end
232
-
233
- it "defaults amount to 1" do
234
- Cache.should_receive(:increment).with('name_1', 3, options)
235
- BattleShip.increment(namespace, uid, 3, options)
236
- end
237
-
238
- it "does not require options" do
239
- Cache.should_receive(:increment).with('name_1', 1, nil)
240
- BattleShip.increment(namespace, uid)
241
- end
242
- end
243
-
244
- describe ".hits" do
245
- it "returns the hits" do
246
- Cache.should_receive(:read).with("foo_hit") { 4 }
247
- BattleShip.hits(:foo).should eq 4
248
- end
249
- end
250
-
251
- describe ".misses" do
252
- it "returns the hits" do
253
- Cache.should_receive(:read).with("foo_miss") { 4 }
254
- BattleShip.misses(:foo).should eq 4
255
- end
256
- end
257
-
258
- describe ".mute" do
259
- it "passes to underlying" do
260
- Cache.should_receive(:mute)
261
- BattleShip.mute
262
- end
263
- end
264
-
265
- describe ".read_multi" do
266
- # *names - options is last
267
- let(:names) { ['1', '2', '3'] }
268
- it "passes to underlying" do
269
- Cache.should_receive(:read_multi).with(names)
270
- BattleShip.read_multi(names)
271
- end
272
- end
273
-
274
- describe ".silence!" do
275
- it "passes to underlying" do
276
- Cache.should_receive(:silence!)
277
- BattleShip.silence!
41
+ describe "#key_up_to_first_underscore" do
42
+ it "returns the string up to the first underscore" do
43
+ dummy.send(:key_up_to_first_underscore, 'someclass_thing').should eq 'someclass'
44
+ end
278
45
  end
279
46
  end
280
47
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'active_support'
1
2
  require 'battle_ship'
2
3
 
3
4
  RSpec.configure do |config|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: battle_ship
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DavidRagone
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-24 00:00:00.000000000 Z
11
+ date: 2013-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,7 +52,36 @@ dependencies:
52
52
  - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- description: Wrapper class for Rails.cache related methods to track cache hits & misses
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Adds counters to cache when successful read operation completes in order
84
+ to track Rails.cache hits & misses
56
85
  email:
57
86
  - dmragone@gmail.com
58
87
  executables: []
@@ -65,13 +94,13 @@ files:
65
94
  - README.md
66
95
  - Rakefile
67
96
  - battle_ship.gemspec
97
+ - lib/active_support/cache/store.rb
68
98
  - lib/battle_ship.rb
69
- - lib/battle_ship/core.rb
70
- - lib/battle_ship/pass_through.rb
71
99
  - lib/battle_ship/version.rb
100
+ - spec/lib/active_support_cache_subclass_spec.rb
72
101
  - spec/lib/battle_ship_spec.rb
73
102
  - spec/spec_helper.rb
74
- homepage: http://www.dmragone.com
103
+ homepage: https://github.com/DavidRagone/BattleShip
75
104
  licenses:
76
105
  - MIT
77
106
  metadata: {}
@@ -96,5 +125,6 @@ signing_key:
96
125
  specification_version: 4
97
126
  summary: Wrapper for Rails.cache methods
98
127
  test_files:
128
+ - spec/lib/active_support_cache_subclass_spec.rb
99
129
  - spec/lib/battle_ship_spec.rb
100
130
  - spec/spec_helper.rb
@@ -1,62 +0,0 @@
1
- module BattleShip
2
- class << self
3
- def read(namespace, uid)
4
- value = cache.read(namespaced(namespace, uid))
5
- increment_hit_or_miss(namespace, value)
6
- value
7
- end
8
-
9
- def write(namespace, uid, value, options = nil)
10
- cache.write(namespaced(namespace, uid), value, options)
11
- end
12
-
13
- def fetch(namespace, uid, options = nil)
14
- # http://mudge.name/2011/01/26/passing-blocks-in-ruby-without-block.html
15
- namespaced = namespaced(namespace, uid)
16
- increment_hit_or_miss(namespace, cache.read(namespaced))
17
- if block_given?
18
- cache.fetch(namespaced, options, &Proc.new)
19
- else
20
- cache.fetch(namespaced, options)
21
- end
22
- end
23
-
24
- def decrement(namespace, uid, amount = 1, options = nil)
25
- cache.decrement(namespaced(namespace, uid), amount, options)
26
- end
27
-
28
- def delete(namespace, uid, options = nil)
29
- cache.delete(namespaced(namespace, uid), options)
30
- end
31
-
32
- def exist?(namespace, uid, options = nil)
33
- cache.exist?(namespaced(namespace, uid), options)
34
- end
35
-
36
- def increment(namespace, uid, amount = 1, options = nil)
37
- cache.increment(namespaced(namespace, uid), amount, options)
38
- end
39
-
40
- def hits(namespace)
41
- cache.read("#{namespace}_hit")
42
- end
43
-
44
- def misses(namespace)
45
- cache.read("#{namespace}_miss")
46
- end
47
-
48
- private
49
- def increment_hit_or_miss(namespace, value, amount = 1, options = nil)
50
- hit_or_miss = value.nil? ? '_miss' : '_hit'
51
- cache.increment(namespace.to_s << hit_or_miss, amount, options)
52
- end
53
-
54
- def namespaced(namespace, uid)
55
- namespace.to_s << '_' << uid.to_s
56
- end
57
-
58
- def cache
59
- Rails.cache
60
- end
61
- end
62
- end
@@ -1,27 +0,0 @@
1
- module BattleShip
2
- class << self
3
- def cleanup(options = nil)
4
- cache.cleanup(options)
5
- end
6
-
7
- def clear(options = nil)
8
- cache.clear(options)
9
- end
10
-
11
- def delete_matched(matcher, options = nil)
12
- cache.delete_matched(matcher, options)
13
- end
14
-
15
- def mute
16
- cache.mute
17
- end
18
-
19
- def read_multi(*names)
20
- cache.read_multi(*names)
21
- end
22
-
23
- def silence!
24
- cache.silence!
25
- end
26
- end
27
- end