moneta 0.7.9 → 0.7.10
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -2
- data/CHANGES +6 -0
- data/Gemfile +2 -0
- data/README.md +7 -4
- data/Rakefile +2 -2
- data/lib/moneta.rb +1 -0
- data/lib/moneta/adapters/activerecord.rb +1 -2
- data/lib/moneta/adapters/cassandra.rb +31 -26
- data/lib/moneta/adapters/cookie.rb +2 -2
- data/lib/moneta/adapters/couch.rb +5 -3
- data/lib/moneta/adapters/daybreak.rb +13 -9
- data/lib/moneta/adapters/dbm.rb +7 -3
- data/lib/moneta/adapters/file.rb +4 -3
- data/lib/moneta/adapters/fog.rb +5 -2
- data/lib/moneta/adapters/gdbm.rb +7 -3
- data/lib/moneta/adapters/hbase.rb +11 -9
- data/lib/moneta/adapters/kyotocabinet.rb +13 -8
- data/lib/moneta/adapters/leveldb.rb +9 -5
- data/lib/moneta/adapters/localmemcache.rb +7 -3
- data/lib/moneta/adapters/memcached/dalli.rb +16 -11
- data/lib/moneta/adapters/memcached/native.rb +20 -15
- data/lib/moneta/adapters/memory.rb +2 -1
- data/lib/moneta/adapters/mongo.rb +13 -8
- data/lib/moneta/adapters/pstore.rb +24 -21
- data/lib/moneta/adapters/redis.rb +14 -12
- data/lib/moneta/adapters/restclient.rb +10 -7
- data/lib/moneta/adapters/riak.rb +5 -1
- data/lib/moneta/adapters/sdbm.rb +7 -3
- data/lib/moneta/adapters/sequel.rb +13 -8
- data/lib/moneta/adapters/sqlite.rb +15 -10
- data/lib/moneta/adapters/tdb.rb +8 -4
- data/lib/moneta/adapters/tokyocabinet.rb +15 -10
- data/lib/moneta/adapters/tokyotyrant.rb +107 -0
- data/lib/moneta/cache.rb +17 -17
- data/lib/moneta/mixins.rb +7 -5
- data/lib/moneta/version.rb +1 -1
- data/lib/rack/moneta_store.rb +1 -1
- data/lib/rack/session/moneta.rb +6 -3
- data/script/benchmarks +28 -28
- data/script/generate-specs +96 -41
- data/script/memusage +40 -0
- data/script/start-services +1 -0
- data/spec/helper.rb +4 -1
- data/spec/moneta/adapter_tokyotyrant_spec.rb +30 -0
- data/spec/moneta/cache_file_memory_spec.rb +3 -3
- data/spec/moneta/cache_memory_null_spec.rb +1 -1
- data/spec/moneta/simple_tokyotyrant_spec.rb +155 -0
- data/spec/moneta/simple_tokyotyrant_with_expires_spec.rb +157 -0
- data/spec/monetaspecs.rb +79 -37
- data/spec/rack/moneta_store_spec.rb +1 -1
- data/spec/rack/session_moneta_spec.rb +27 -0
- metadata +10 -3
data/lib/moneta/mixins.rb
CHANGED
@@ -257,29 +257,31 @@ module Moneta
|
|
257
257
|
|
258
258
|
# @api private
|
259
259
|
module HashAdapter
|
260
|
+
attr_reader :backend
|
261
|
+
|
260
262
|
# (see Proxy#key?)
|
261
263
|
def key?(key, options = {})
|
262
|
-
@
|
264
|
+
@backend.has_key?(key)
|
263
265
|
end
|
264
266
|
|
265
267
|
# (see Proxy#load)
|
266
268
|
def load(key, options = {})
|
267
|
-
@
|
269
|
+
@backend[key]
|
268
270
|
end
|
269
271
|
|
270
272
|
# (see Proxy#store)
|
271
273
|
def store(key, value, options = {})
|
272
|
-
@
|
274
|
+
@backend[key] = value
|
273
275
|
end
|
274
276
|
|
275
277
|
# (see Proxy#delete)
|
276
278
|
def delete(key, options = {})
|
277
|
-
@
|
279
|
+
@backend.delete(key)
|
278
280
|
end
|
279
281
|
|
280
282
|
# (see Proxy#clear)
|
281
283
|
def clear(options = {})
|
282
|
-
@
|
284
|
+
@backend.clear
|
283
285
|
self
|
284
286
|
end
|
285
287
|
end
|
data/lib/moneta/version.rb
CHANGED
data/lib/rack/moneta_store.rb
CHANGED
@@ -38,7 +38,7 @@ module Rack
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def call(env)
|
41
|
-
env['rack.moneta_store'] = @cache ? ::Moneta::Cache.new(:cache => ::Moneta::Adapters::Memory.new, :
|
41
|
+
env['rack.moneta_store'] = @cache ? ::Moneta::Cache.new(:cache => ::Moneta::Adapters::Memory.new, :adapter => @store) : @store
|
42
42
|
@app.call(env)
|
43
43
|
end
|
44
44
|
end
|
data/lib/rack/session/moneta.rb
CHANGED
@@ -17,6 +17,7 @@ module Rack
|
|
17
17
|
raise ArgumentError, 'Block or option :store is required' unless @pool = options[:store]
|
18
18
|
@pool = ::Moneta.new(@pool, :expires => true) if Symbol === @pool
|
19
19
|
end
|
20
|
+
@pool = ::Moneta::WeakCreate.new(@pool) unless @pool.supports?(:create)
|
20
21
|
@mutex = Mutex.new
|
21
22
|
end
|
22
23
|
|
@@ -30,8 +31,10 @@ module Rack
|
|
30
31
|
def get_session(env, sid)
|
31
32
|
with_lock(env) do
|
32
33
|
unless sid && session = @pool[sid]
|
33
|
-
|
34
|
-
|
34
|
+
session = {}
|
35
|
+
begin
|
36
|
+
sid = generate_sid
|
37
|
+
end until @pool.create(sid, session)
|
35
38
|
end
|
36
39
|
[sid, session]
|
37
40
|
end
|
@@ -40,7 +43,7 @@ module Rack
|
|
40
43
|
def set_session(env, session_id, new_session, options)
|
41
44
|
with_lock(env) do
|
42
45
|
@pool.store(session_id, new_session,
|
43
|
-
|
46
|
+
options[:expire_after] ? { :expires => options[:expire_after] } : {})
|
44
47
|
session_id
|
45
48
|
end
|
46
49
|
end
|
data/script/benchmarks
CHANGED
@@ -31,10 +31,10 @@ class MonetaBenchmarks
|
|
31
31
|
FileUtils.mkpath(DIR)
|
32
32
|
|
33
33
|
STORES = {
|
34
|
-
# SDBM is unstable
|
34
|
+
# SDBM is unstable, the rest is too slow
|
35
35
|
# :SDBM => { :file => "#{DIR}/sdbm" },
|
36
|
-
# YAML is so fucking slow
|
37
36
|
# :YAML => { :file => "#{DIR}/yaml" },
|
37
|
+
# :RestClient => { :url => 'http://localhost:8808/' },
|
38
38
|
:ActiveRecord => { :connection => { :adapter => 'sqlite3', :database => ':memory:' } },
|
39
39
|
:Cassandra => {},
|
40
40
|
:Client => {},
|
@@ -56,12 +56,12 @@ class MonetaBenchmarks
|
|
56
56
|
:Mongo => {},
|
57
57
|
:PStore => { :file => "#{DIR}/pstore" },
|
58
58
|
:Redis => {},
|
59
|
-
:RestClient => { :url => 'http://localhost:8808/' },
|
60
59
|
:Riak => {},
|
61
60
|
:Sequel => { :db => 'sqlite:/' },
|
62
61
|
:Sqlite => { :file => ':memory:' },
|
63
62
|
:TDB => { :file => "#{DIR}/tdb" },
|
64
63
|
:TokyoCabinet => { :file => 'tokyocabinet' },
|
64
|
+
:TokyoTyrant => {},
|
65
65
|
}
|
66
66
|
|
67
67
|
CONFIGS = {
|
@@ -188,31 +188,31 @@ class MonetaBenchmarks
|
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
|
-
parallel do
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
end
|
191
|
+
# parallel do
|
192
|
+
# begin
|
193
|
+
# require 'rack'
|
194
|
+
# require 'webrick'
|
195
|
+
# require 'rack/moneta_rest'
|
196
|
+
|
197
|
+
# # Keep webrick quiet
|
198
|
+
# ::WEBrick::HTTPServer.class_eval do
|
199
|
+
# def access_log(config, req, res); end
|
200
|
+
# end
|
201
|
+
# ::WEBrick::BasicLog.class_eval do
|
202
|
+
# def log(level, data); end
|
203
|
+
# end
|
204
|
+
|
205
|
+
# Rack::Server.start(:app => Rack::Builder.app do
|
206
|
+
# use Rack::Lint
|
207
|
+
# run Rack::MonetaRest.new(:store => :Memory)
|
208
|
+
# end,
|
209
|
+
# :environment => :none,
|
210
|
+
# :server => :webrick,
|
211
|
+
# :Port => 8808)
|
212
|
+
# rescue Exception => ex
|
213
|
+
# puts "\e[31mFailed to start Rack server - #{ex.message}\e[0m"
|
214
|
+
# end
|
215
|
+
# end
|
216
216
|
|
217
217
|
sleep 1 # Wait for servers
|
218
218
|
end
|
data/script/generate-specs
CHANGED
@@ -330,6 +330,15 @@ end
|
|
330
330
|
:options => ':file => File.join(make_tempdir, "simple_tokyocabinet_with_expires"), :expires => true',
|
331
331
|
:specs => STANDARD_SPECS.without_multiprocess.with_expires
|
332
332
|
},
|
333
|
+
'simple_tokyotyrant' => {
|
334
|
+
:store => :TokyoTyrant,
|
335
|
+
:specs => STANDARD_SPECS
|
336
|
+
},
|
337
|
+
'simple_tokyotyrant_with_expires' => {
|
338
|
+
:store => :TokyoTyrant,
|
339
|
+
:options => ':expires => true',
|
340
|
+
:specs => STANDARD_SPECS.with_expires
|
341
|
+
},
|
333
342
|
'simple_kyotocabinet' => {
|
334
343
|
:store => :KyotoCabinet,
|
335
344
|
:options => ':file => File.join(make_tempdir, "simple_kyotocabinet.kch")',
|
@@ -545,18 +554,18 @@ end},
|
|
545
554
|
'cache_file_memory' => {
|
546
555
|
:build => %{Moneta.build do
|
547
556
|
use(:Cache) do
|
548
|
-
|
557
|
+
adapter { adapter :File, :dir => File.join(make_tempdir, "cache_file_memory") }
|
549
558
|
cache { adapter :Memory }
|
550
559
|
end
|
551
560
|
end},
|
552
561
|
:specs => ADAPTER_SPECS.returnsame,
|
553
562
|
:tests => %{
|
554
563
|
it 'stores loaded values in cache' do
|
555
|
-
store.
|
564
|
+
store.adapter['foo'] = 'bar'
|
556
565
|
store.cache['foo'].should be_nil
|
557
566
|
store['foo'].should == 'bar'
|
558
567
|
store.cache['foo'].should == 'bar'
|
559
|
-
store.
|
568
|
+
store.adapter.delete('foo')
|
560
569
|
store['foo'].should == 'bar'
|
561
570
|
store.delete('foo')
|
562
571
|
store['foo'].should be_nil
|
@@ -566,7 +575,7 @@ end
|
|
566
575
|
'cache_memory_null' => {
|
567
576
|
:build => %{Moneta.build do
|
568
577
|
use(:Cache) do
|
569
|
-
|
578
|
+
adapter(Moneta::Adapters::Memory.new)
|
570
579
|
cache(Moneta::Adapters::Null.new)
|
571
580
|
end
|
572
581
|
end},
|
@@ -1301,6 +1310,10 @@ end}
|
|
1301
1310
|
:build => 'Moneta::Adapters::TokyoCabinet.new(:file => File.join(make_tempdir, "adapter_tokyocabinet_hdb"), :type => :hdb)',
|
1302
1311
|
:specs => ADAPTER_SPECS.without_multiprocess
|
1303
1312
|
},
|
1313
|
+
'adapter_tokyotyrant' => {
|
1314
|
+
:build => 'Moneta::Adapters::TokyoTyrant.new',
|
1315
|
+
:specs => ADAPTER_SPECS
|
1316
|
+
},
|
1304
1317
|
'adapter_yaml' => {
|
1305
1318
|
:build => 'Moneta::Adapters::YAML.new(:file => File.join(make_tempdir, "adapter_yaml"))',
|
1306
1319
|
:specs => STANDARD_SPECS.simplevalues_only.simplekeys_only.without_transform
|
@@ -1705,146 +1718,188 @@ SPECS['multiprocess'] = %{it 'supports access by multiple instances/processes' d
|
|
1705
1718
|
store2.close
|
1706
1719
|
end}
|
1707
1720
|
|
1708
|
-
SPECS['expires'] = %{it 'supports expires on store and
|
1709
|
-
store.store('key1', 'val1', :expires =>
|
1721
|
+
SPECS['expires'] = %{it 'supports expires on store and []', :retry => 3 do
|
1722
|
+
store.store('key1', 'val1', :expires => 3)
|
1710
1723
|
store['key1'].should == 'val1'
|
1711
1724
|
sleep 1
|
1712
1725
|
store['key1'].should == 'val1'
|
1713
|
-
sleep
|
1726
|
+
sleep 3
|
1714
1727
|
store['key1'].should be_nil
|
1715
1728
|
end
|
1716
1729
|
|
1717
|
-
it 'supports
|
1730
|
+
it 'supports strict expires on store and []' do
|
1731
|
+
store.store('key1', 'val1', :expires => 2)
|
1732
|
+
store['key1'].should == 'val1'
|
1733
|
+
sleep 3 # Sleep 3 seconds because after 2 seconds the value can still exist!
|
1734
|
+
store['key1'].should be_nil
|
1735
|
+
end
|
1736
|
+
|
1737
|
+
it 'supports expires on store and fetch', :retry => 3 do
|
1738
|
+
store.store('key1', 'val1', :expires => 3)
|
1739
|
+
store.fetch('key1').should == 'val1'
|
1740
|
+
sleep 1
|
1741
|
+
store.fetch('key1').should == 'val1'
|
1742
|
+
sleep 3
|
1743
|
+
store.fetch('key1').should be_nil
|
1744
|
+
end
|
1745
|
+
|
1746
|
+
it 'supports strict expires on store and fetch' do
|
1747
|
+
store.store('key1', 'val1', :expires => 2)
|
1748
|
+
store.fetch('key1').should == 'val1'
|
1749
|
+
sleep 3 # Sleep 3 seconds because after 2 seconds the value can still exist!
|
1750
|
+
store.fetch('key1').should be_nil
|
1751
|
+
end
|
1752
|
+
|
1753
|
+
it 'supports 0 as no-expires on store and []' do
|
1718
1754
|
store.store('key1', 'val1', :expires => 0)
|
1719
1755
|
store['key1'].should == 'val1'
|
1720
1756
|
sleep 2
|
1721
1757
|
store['key1'].should == 'val1'
|
1722
1758
|
end
|
1723
1759
|
|
1724
|
-
it 'supports false as no-expires on store and
|
1760
|
+
it 'supports false as no-expires on store and []' do
|
1725
1761
|
store.store('key1', 'val1', :expires => false)
|
1726
1762
|
store['key1'].should == 'val1'
|
1727
1763
|
sleep 2
|
1728
1764
|
store['key1'].should == 'val1'
|
1729
1765
|
end
|
1730
1766
|
|
1731
|
-
it 'supports expires on store and load' do
|
1732
|
-
store.store('key1', 'val1', :expires =>
|
1767
|
+
it 'supports expires on store and load', :retry => 3 do
|
1768
|
+
store.store('key1', 'val1', :expires => 3)
|
1733
1769
|
store.load('key1').should == 'val1'
|
1734
1770
|
sleep 1
|
1735
1771
|
store.load('key1').should == 'val1'
|
1736
|
-
sleep
|
1772
|
+
sleep 3
|
1737
1773
|
store.load('key1').should be_nil
|
1738
1774
|
end
|
1739
1775
|
|
1740
|
-
it 'supports expires on store and
|
1776
|
+
it 'supports strict expires on store and load' do
|
1741
1777
|
store.store('key1', 'val1', :expires => 2)
|
1778
|
+
store.load('key1').should == 'val1'
|
1779
|
+
sleep 3 # Sleep 3 seconds because after 2 seconds the value can still exist!
|
1780
|
+
store.load('key1').should be_nil
|
1781
|
+
end
|
1782
|
+
|
1783
|
+
it 'supports expires on store and key?', :retry => 3 do
|
1784
|
+
store.store('key1', 'val1', :expires => 3)
|
1742
1785
|
store.key?('key1').should be_true
|
1743
1786
|
sleep 1
|
1744
1787
|
store.key?('key1').should be_true
|
1745
|
-
sleep
|
1788
|
+
sleep 3
|
1746
1789
|
store.key?('key1').should be_false
|
1747
1790
|
end
|
1748
1791
|
|
1749
|
-
it 'supports
|
1750
|
-
store.store('
|
1792
|
+
it 'supports strict expires on store and key?' do
|
1793
|
+
store.store('key1', 'val1', :expires => 2)
|
1794
|
+
store.key?('key1').should be_true
|
1795
|
+
sleep 3 # Sleep 3 seconds because after 2 seconds the value can still exist!
|
1796
|
+
store.key?('key1').should be_false
|
1797
|
+
end
|
1798
|
+
|
1799
|
+
it 'supports updating the expiration time in load', :retry => 3 do
|
1800
|
+
store.store('key2', 'val2', :expires => 3)
|
1751
1801
|
store['key2'].should == 'val2'
|
1752
1802
|
sleep 1
|
1753
|
-
store.load('key2', :expires =>
|
1803
|
+
store.load('key2', :expires => 5).should == 'val2'
|
1754
1804
|
store['key2'].should == 'val2'
|
1755
|
-
sleep
|
1805
|
+
sleep 3
|
1756
1806
|
store['key2'].should == 'val2'
|
1757
|
-
sleep
|
1807
|
+
sleep 3
|
1758
1808
|
store['key2'].should be_nil
|
1759
1809
|
end
|
1760
1810
|
|
1761
1811
|
it 'supports 0 as no-expires in load' do
|
1762
1812
|
store.store('key1', 'val1', :expires => 2)
|
1763
1813
|
store.load('key1', :expires => 0).should == 'val1'
|
1764
|
-
sleep
|
1814
|
+
sleep 3
|
1765
1815
|
store.load('key1').should == 'val1'
|
1766
1816
|
end
|
1767
1817
|
|
1768
1818
|
it 'supports false as no-expires in load' do
|
1769
1819
|
store.store('key1', 'val1', :expires => 2)
|
1770
1820
|
store.load('key1', :expires => false).should == 'val1'
|
1771
|
-
sleep
|
1821
|
+
sleep 3
|
1772
1822
|
store.load('key1').should == 'val1'
|
1773
1823
|
end
|
1774
1824
|
|
1775
|
-
it 'supports updating the expiration time in key?' do
|
1776
|
-
store.store('key2', 'val2', :expires =>
|
1825
|
+
it 'supports updating the expiration time in key?', :retry => 3 do
|
1826
|
+
store.store('key2', 'val2', :expires => 3)
|
1777
1827
|
store['key2'].should == 'val2'
|
1778
1828
|
sleep 1
|
1779
|
-
store.key?('key2', :expires =>
|
1829
|
+
store.key?('key2', :expires => 5).should be_true
|
1780
1830
|
store['key2'].should == 'val2'
|
1781
|
-
sleep
|
1831
|
+
sleep 3
|
1782
1832
|
store['key2'].should == 'val2'
|
1783
|
-
sleep
|
1833
|
+
sleep 3
|
1784
1834
|
store['key2'].should be_nil
|
1785
1835
|
end
|
1786
1836
|
|
1787
1837
|
it 'supports 0 as no-expires in key?' do
|
1788
1838
|
store.store('key1', 'val1', :expires => 2)
|
1789
1839
|
store.key?('key1', :expires => 0).should be_true
|
1790
|
-
sleep
|
1840
|
+
sleep 3
|
1791
1841
|
store['key1'].should == 'val1'
|
1792
1842
|
end
|
1793
1843
|
|
1794
1844
|
it 'supports false as no-expires in key?' do
|
1795
1845
|
store.store('key1', 'val1', :expires => 2)
|
1796
1846
|
store.key?('key1', :expires => false ).should be_true
|
1797
|
-
sleep
|
1847
|
+
sleep 3
|
1798
1848
|
store['key1'].should == 'val1'
|
1799
1849
|
end
|
1800
1850
|
|
1801
|
-
it 'supports updating the expiration time in fetch' do
|
1802
|
-
store.store('key1', 'val1', :expires =>
|
1851
|
+
it 'supports updating the expiration time in fetch', :retry => 3 do
|
1852
|
+
store.store('key1', 'val1', :expires => 3)
|
1803
1853
|
store['key1'].should == 'val1'
|
1804
1854
|
sleep 1
|
1805
|
-
store.fetch('key1', nil, :expires =>
|
1855
|
+
store.fetch('key1', nil, :expires => 5).should == 'val1'
|
1806
1856
|
store['key1'].should == 'val1'
|
1807
|
-
sleep
|
1857
|
+
sleep 3
|
1808
1858
|
store['key1'].should == 'val1'
|
1809
|
-
sleep
|
1859
|
+
sleep 3
|
1810
1860
|
store['key1'].should be_nil
|
1811
1861
|
end
|
1812
1862
|
|
1813
1863
|
it 'supports 0 as no-expires in fetch' do
|
1814
1864
|
store.store('key1', 'val1', :expires => 2)
|
1815
1865
|
store.fetch('key1', nil, :expires => 0).should == 'val1'
|
1816
|
-
sleep
|
1866
|
+
sleep 3
|
1817
1867
|
store.load('key1').should == 'val1'
|
1818
1868
|
end
|
1819
1869
|
|
1820
1870
|
it 'supports false as no-expires in fetch' do
|
1821
1871
|
store.store('key1', 'val1', :expires => 2)
|
1822
1872
|
store.fetch('key1', nil, :expires => false).should == 'val1'
|
1823
|
-
sleep
|
1873
|
+
sleep 3
|
1824
1874
|
store.load('key1').should == 'val1'
|
1825
1875
|
end
|
1826
1876
|
|
1827
|
-
it 'respects expires in delete' do
|
1877
|
+
it 'strictly respects expires in delete' do
|
1828
1878
|
store.store('key2', 'val2', :expires => 2)
|
1829
1879
|
store['key2'].should == 'val2'
|
1880
|
+
sleep 3 # Sleep 3 seconds because after 2 seconds the value can still exist!
|
1881
|
+
store.delete('key2').should be_nil
|
1882
|
+
end
|
1883
|
+
|
1884
|
+
it 'respects expires in delete', :retry => 3 do
|
1885
|
+
store.store('key2', 'val2', :expires => 3)
|
1886
|
+
store['key2'].should == 'val2'
|
1830
1887
|
sleep 1
|
1831
1888
|
store['key2'].should == 'val2'
|
1832
|
-
sleep
|
1889
|
+
sleep 3
|
1833
1890
|
store.delete('key2').should be_nil
|
1834
1891
|
end
|
1835
1892
|
|
1836
1893
|
it 'supports the #expires syntactic sugar' do
|
1837
1894
|
store.store('persistent_key', 'persistent_value', :expires => 0)
|
1838
|
-
store.expires(
|
1839
|
-
store['key2'].should == 'val2'
|
1840
|
-
sleep 1
|
1895
|
+
store.expires(1).store('key2', 'val2')
|
1841
1896
|
store['key2'].should == 'val2'
|
1842
1897
|
sleep 2
|
1843
1898
|
store.delete('key2').should be_nil
|
1844
1899
|
store['persistent_key'].should == 'persistent_value'
|
1845
1900
|
end
|
1846
1901
|
|
1847
|
-
it 'supports false as no-expires on store and
|
1902
|
+
it 'supports false as no-expires on store and []' do
|
1848
1903
|
store.store('key1', 'val1', :expires => false)
|
1849
1904
|
store['key1'].should == 'val1'
|
1850
1905
|
sleep 2
|
data/script/memusage
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$: << File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
|
5
|
+
def memusage
|
6
|
+
`pmap #{$$} | tail -1`[10..-1].strip.to_i
|
7
|
+
end
|
8
|
+
|
9
|
+
def shrink
|
10
|
+
last = memusage
|
11
|
+
loop do
|
12
|
+
GC.start
|
13
|
+
sleep 1
|
14
|
+
m = memusage
|
15
|
+
break if m == last
|
16
|
+
last = m
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
$last_memusage = 0
|
21
|
+
|
22
|
+
def stats
|
23
|
+
shrink
|
24
|
+
m = memusage
|
25
|
+
delta = m - $last_memusage
|
26
|
+
$last_memusage = m
|
27
|
+
puts "# #{m}K #{delta >= 0 ? '+' : ''}#{delta}K"
|
28
|
+
end
|
29
|
+
|
30
|
+
stats
|
31
|
+
|
32
|
+
%q{require 'moneta'
|
33
|
+
Moneta.new(:Memory)
|
34
|
+
Moneta.new(:File, :dir => 'filestore')
|
35
|
+
Moneta.new(:MemcachedNative)
|
36
|
+
Moneta.new(:MemcachedDalli)}.each_line do |line|
|
37
|
+
puts line
|
38
|
+
eval(line)
|
39
|
+
stats
|
40
|
+
end
|