dsander-memcache-client 1.7.7.pre
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.
- data/FAQ.rdoc +31 -0
- data/History.rdoc +241 -0
- data/LICENSE.txt +28 -0
- data/README.rdoc +51 -0
- data/Rakefile +39 -0
- data/VERSION.yml +5 -0
- data/lib/continuum_native.rb +41 -0
- data/lib/memcache.rb +1209 -0
- data/lib/memcache_util.rb +105 -0
- data/performance.txt +143 -0
- data/test/test_benchmark.rb +134 -0
- data/test/test_mem_cache.rb +1238 -0
- metadata +70 -0
@@ -0,0 +1,105 @@
|
|
1
|
+
##
|
2
|
+
# A utility wrapper around the MemCache client to simplify cache access. All
|
3
|
+
# methods silently ignore MemCache errors.
|
4
|
+
#
|
5
|
+
# This API is deprecated, please use the Rails.cache API or your own wrapper API
|
6
|
+
# around MemCache.
|
7
|
+
|
8
|
+
module Cache
|
9
|
+
|
10
|
+
##
|
11
|
+
# Try to return a logger object that does not rely
|
12
|
+
# on ActiveRecord for logging.
|
13
|
+
def self.logger
|
14
|
+
@logger ||= if defined? Rails.logger # Rails 2.1 +
|
15
|
+
Rails.logger
|
16
|
+
elsif defined? RAILS_DEFAULT_LOGGER # Rails 1.2.2 +
|
17
|
+
RAILS_DEFAULT_LOGGER
|
18
|
+
else
|
19
|
+
ActiveRecord::Base.logger # ... very old Rails.
|
20
|
+
end
|
21
|
+
end
|
22
|
+
##
|
23
|
+
# Returns the object at +key+ from the cache if successful, or nil if either
|
24
|
+
# the object is not in the cache or if there was an error attermpting to
|
25
|
+
# access the cache.
|
26
|
+
#
|
27
|
+
# If there is a cache miss and a block is given the result of the block will
|
28
|
+
# be stored in the cache with optional +expiry+, using the +add+ method rather
|
29
|
+
# than +set+.
|
30
|
+
|
31
|
+
def self.get(key, expiry = 0)
|
32
|
+
start_time = Time.now
|
33
|
+
value = CACHE.get key
|
34
|
+
elapsed = Time.now - start_time
|
35
|
+
logger.debug('MemCache Get (%0.6f) %s' % [elapsed, key])
|
36
|
+
if value.nil? and block_given? then
|
37
|
+
value = yield
|
38
|
+
add key, value, expiry
|
39
|
+
end
|
40
|
+
value
|
41
|
+
rescue MemCache::MemCacheError => err
|
42
|
+
logger.debug "MemCache Error: #{err.message}"
|
43
|
+
if block_given? then
|
44
|
+
value = yield
|
45
|
+
put key, value, expiry
|
46
|
+
end
|
47
|
+
value
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Sets +value+ in the cache at +key+, with an optional +expiry+ time in
|
52
|
+
# seconds.
|
53
|
+
|
54
|
+
def self.put(key, value, expiry = 0)
|
55
|
+
start_time = Time.now
|
56
|
+
CACHE.set key, value, expiry
|
57
|
+
elapsed = Time.now - start_time
|
58
|
+
logger.debug('MemCache Set (%0.6f) %s' % [elapsed, key])
|
59
|
+
value
|
60
|
+
rescue MemCache::MemCacheError => err
|
61
|
+
ActiveRecord::Base.logger.debug "MemCache Error: #{err.message}"
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# Sets +value+ in the cache at +key+, with an optional +expiry+ time in
|
67
|
+
# seconds. If +key+ already exists in cache, returns nil.
|
68
|
+
|
69
|
+
def self.add(key, value, expiry = 0)
|
70
|
+
start_time = Time.now
|
71
|
+
response = CACHE.add key, value, expiry
|
72
|
+
elapsed = Time.now - start_time
|
73
|
+
logger.debug('MemCache Add (%0.6f) %s' % [elapsed, key])
|
74
|
+
(response == "STORED\r\n") ? value : nil
|
75
|
+
rescue MemCache::MemCacheError => err
|
76
|
+
ActiveRecord::Base.logger.debug "MemCache Error: #{err.message}"
|
77
|
+
nil
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Deletes +key+ from the cache in +delay+ seconds.
|
82
|
+
|
83
|
+
def self.delete(key, delay = nil)
|
84
|
+
start_time = Time.now
|
85
|
+
CACHE.delete key, delay
|
86
|
+
elapsed = Time.now - start_time
|
87
|
+
logger.debug('MemCache Delete (%0.6f) %s' %
|
88
|
+
[elapsed, key])
|
89
|
+
nil
|
90
|
+
rescue MemCache::MemCacheError => err
|
91
|
+
logger.debug "MemCache Error: #{err.message}"
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Resets all connections to MemCache servers.
|
97
|
+
|
98
|
+
def self.reset
|
99
|
+
CACHE.reset
|
100
|
+
logger.debug 'MemCache Connections Reset'
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
data/performance.txt
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
== 1.5.0, 1.8.6 (default in Rails 2.2 and lower)
|
2
|
+
|
3
|
+
user system total real
|
4
|
+
set:plain:memcache-client 41.550000 0.590000 42.140000 ( 43.740685)
|
5
|
+
set:ruby:memcache-client 41.540000 0.590000 42.130000 ( 43.733796)
|
6
|
+
get:plain:memcache-client 41.920000 0.610000 42.530000 ( 44.031005)
|
7
|
+
get:ruby:memcache-client 41.940000 0.600000 42.540000 ( 44.082447)
|
8
|
+
multiget:ruby:memcache-client 46.120000 0.440000 46.560000 ( 47.354041)
|
9
|
+
missing:ruby:memcache-client 41.490000 0.580000 42.070000 ( 43.610837)
|
10
|
+
mixed:ruby:memcache-client 83.820000 1.190000 85.010000 ( 88.117077)
|
11
|
+
|
12
|
+
|
13
|
+
== 1.7.0, timeout, 1.8.6 (closest to default in Rails 2.3)
|
14
|
+
user system total real
|
15
|
+
set:plain:memcache-client 4.320000 2.280000 6.600000 ( 7.102900)
|
16
|
+
set:ruby:memcache-client 4.400000 2.300000 6.700000 ( 6.856992)
|
17
|
+
get:plain:memcache-client 9.890000 6.830000 16.720000 ( 16.984208)
|
18
|
+
get:ruby:memcache-client 10.040000 6.890000 16.930000 ( 17.141128)
|
19
|
+
multiget:ruby:memcache-client 5.350000 4.110000 9.460000 ( 9.542898)
|
20
|
+
missing:ruby:memcache-client 4.710000 3.180000 7.890000 ( 8.030969)
|
21
|
+
mixed:ruby:memcache-client 14.540000 9.200000 23.740000 ( 24.121824)
|
22
|
+
|
23
|
+
== 1.7.0, timeout, system_timer, 1.8.6
|
24
|
+
user system total real
|
25
|
+
set:plain:memcache-client 3.840000 0.640000 4.480000 ( 4.643790)
|
26
|
+
set:ruby:memcache-client 3.930000 0.650000 4.580000 ( 4.731868)
|
27
|
+
get:plain:memcache-client 8.320000 1.290000 9.610000 ( 9.903877)
|
28
|
+
get:ruby:memcache-client 8.460000 1.310000 9.770000 ( 9.986694)
|
29
|
+
multiget:ruby:memcache-client 4.250000 0.560000 4.810000 ( 4.935326)
|
30
|
+
missing:ruby:memcache-client 3.840000 0.640000 4.480000 ( 4.569696)
|
31
|
+
mixed:ruby:memcache-client 12.400000 1.960000 14.360000 ( 14.857924)
|
32
|
+
|
33
|
+
== 1.7.0, timeout, 1.9.1
|
34
|
+
user system total real
|
35
|
+
set:plain:memcache-client 2.130000 2.150000 4.280000 ( 3.774238)
|
36
|
+
set:ruby:memcache-client 2.230000 2.230000 4.460000 ( 3.883686)
|
37
|
+
get:plain:memcache-client 4.030000 4.250000 8.280000 ( 6.702740)
|
38
|
+
get:ruby:memcache-client 4.090000 4.220000 8.310000 ( 6.749134)
|
39
|
+
multiget:ruby:memcache-client 1.960000 1.840000 3.800000 ( 3.089448)
|
40
|
+
missing:ruby:memcache-client 2.110000 2.210000 4.320000 ( 3.659019)
|
41
|
+
mixed:ruby:memcache-client 6.400000 6.560000 12.960000 ( 11.116317)
|
42
|
+
|
43
|
+
== 1.7.0, no timeout, 1.9.1
|
44
|
+
user system total real
|
45
|
+
set:plain:memcache-client 0.560000 0.320000 0.880000 ( 1.849380)
|
46
|
+
set:ruby:memcache-client 0.630000 0.320000 0.950000 ( 1.968208)
|
47
|
+
get:plain:memcache-client 0.640000 0.330000 0.970000 ( 1.962473)
|
48
|
+
get:ruby:memcache-client 0.690000 0.320000 1.010000 ( 2.002295)
|
49
|
+
multiget:ruby:memcache-client 0.460000 0.110000 0.570000 ( 0.885827)
|
50
|
+
missing:ruby:memcache-client 0.530000 0.320000 0.850000 ( 1.721371)
|
51
|
+
mixed:ruby:memcache-client 1.340000 0.660000 2.000000 ( 3.973213)
|
52
|
+
|
53
|
+
== 1.7.0, no timeout, 1.8.6
|
54
|
+
user system total real
|
55
|
+
set:plain:memcache-client 1.220000 0.310000 1.530000 ( 2.763310)
|
56
|
+
set:ruby:memcache-client 1.270000 0.300000 1.570000 ( 2.806251)
|
57
|
+
get:plain:memcache-client 1.400000 0.300000 1.700000 ( 2.944343)
|
58
|
+
get:ruby:memcache-client 1.450000 0.310000 1.760000 ( 2.997234)
|
59
|
+
multiget:ruby:memcache-client 1.120000 0.110000 1.230000 ( 1.665716)
|
60
|
+
missing:ruby:memcache-client 1.160000 0.300000 1.460000 ( 2.683376)
|
61
|
+
mixed:ruby:memcache-client 2.760000 0.610000 3.370000 ( 5.851047)
|
62
|
+
|
63
|
+
== 1.7.1, timeout, 1.8.6, raw + gets SystemTimer
|
64
|
+
user system total real
|
65
|
+
set:plain:memcache-client 2.670000 0.510000 3.180000 ( 3.489509)
|
66
|
+
set:ruby:memcache-client 2.810000 0.530000 3.340000 ( 3.675955)
|
67
|
+
get:plain:memcache-client 4.380000 0.720000 5.100000 ( 5.400587)
|
68
|
+
get:ruby:memcache-client 4.490000 0.730000 5.220000 ( 5.477543)
|
69
|
+
multiget:ruby:memcache-client 2.570000 0.310000 2.880000 ( 3.034944)
|
70
|
+
missing:ruby:memcache-client 2.800000 0.530000 3.330000 ( 3.547073)
|
71
|
+
mixed:ruby:memcache-client 7.460000 1.250000 8.710000 ( 9.272177)
|
72
|
+
|
73
|
+
== 1.7.1, timeout, 1.9.1, raw + gets Timeout
|
74
|
+
user system total real
|
75
|
+
set:plain:memcache-client 1.370000 1.300000 2.670000 ( 2.708669)
|
76
|
+
set:ruby:memcache-client 1.400000 1.240000 2.640000 ( 2.713737)
|
77
|
+
get:plain:memcache-client 2.070000 2.020000 4.090000 ( 3.950879)
|
78
|
+
get:ruby:memcache-client 2.160000 2.090000 4.250000 ( 3.924613)
|
79
|
+
multiget:ruby:memcache-client 1.080000 0.820000 1.900000 ( 1.744107)
|
80
|
+
missing:ruby:memcache-client 1.330000 1.270000 2.600000 ( 2.547597)
|
81
|
+
mixed:ruby:memcache-client 3.540000 3.270000 6.810000 ( 6.735349)
|
82
|
+
|
83
|
+
== 1.7.1, timeout, 1.8.6, raw + gets SystemTimer, native binary search
|
84
|
+
user system total real
|
85
|
+
set:plain:memcache-client 1.840000 0.450000 2.290000 ( 2.651285)
|
86
|
+
set:ruby:memcache-client 1.960000 0.460000 2.420000 ( 2.712650)
|
87
|
+
get:plain:memcache-client 3.180000 0.630000 3.810000 ( 4.079930)
|
88
|
+
get:ruby:memcache-client 3.290000 0.640000 3.930000 ( 4.242648)
|
89
|
+
multiget:ruby:memcache-client 1.640000 0.250000 1.890000 ( 2.003687)
|
90
|
+
missing:ruby:memcache-client 1.940000 0.450000 2.390000 ( 2.619675)
|
91
|
+
mixed:ruby:memcache-client 5.360000 1.100000 6.460000 ( 7.040998)
|
92
|
+
|
93
|
+
== 1.7.2, timeout, 1.8.6, SystemTimer, native binary search
|
94
|
+
user system total real
|
95
|
+
set:plain:memcache-client 3.260000 0.590000 3.850000 ( 4.067382)
|
96
|
+
set:ruby:memcache-client 3.370000 0.590000 3.960000 ( 4.364004)
|
97
|
+
get:plain:memcache-client 6.740000 1.240000 7.980000 ( 8.586676)
|
98
|
+
get:ruby:memcache-client 6.780000 1.210000 7.990000 ( 8.423400)
|
99
|
+
multiget:ruby:memcache-client 3.480000 0.540000 4.020000 ( 4.288633)
|
100
|
+
missing:ruby:memcache-client 3.250000 0.590000 3.840000 ( 4.043602)
|
101
|
+
mixed:ruby:memcache-client 10.150000 1.810000 11.960000 ( 12.372054)
|
102
|
+
|
103
|
+
== 1.7.4, 1.8.6, buffered and non-blocking IO
|
104
|
+
user system total real
|
105
|
+
set:plain:memcache-client 2.450000 0.790000 3.240000 ( 3.397091)
|
106
|
+
set:ruby:memcache-client 2.490000 0.790000 3.280000 ( 3.555436)
|
107
|
+
get:plain:memcache-client 2.840000 0.810000 3.650000 ( 3.759695)
|
108
|
+
get:ruby:memcache-client 2.890000 0.790000 3.680000 ( 3.778011)
|
109
|
+
multiget:ruby:memcache-client 1.380000 0.280000 1.660000 ( 1.695290)
|
110
|
+
missing:ruby:memcache-client 2.380000 0.780000 3.160000 ( 3.251136)
|
111
|
+
mixed:ruby:memcache-client 5.360000 1.600000 6.960000 ( 7.189314)
|
112
|
+
|
113
|
+
== memcached 0.13 + libmemcached 0.25.4 versus memcache-client 1.7.4
|
114
|
+
|
115
|
+
user system total real
|
116
|
+
set:plain:noblock:memcached 0.090000 0.030000 0.120000 ( 0.277929)
|
117
|
+
set:plain:memcached 0.220000 0.270000 0.490000 ( 1.251547)
|
118
|
+
set:plain:memcache-client 0.610000 0.270000 0.880000 ( 1.670718)
|
119
|
+
set:ruby:noblock:memcached 0.150000 0.020000 0.170000 ( 0.309201)
|
120
|
+
set:ruby:memcached 0.300000 0.290000 0.590000 ( 1.390354)
|
121
|
+
set:ruby:memcache-client 0.670000 0.270000 0.940000 ( 1.713558)
|
122
|
+
get:plain:memcached 0.240000 0.270000 0.510000 ( 1.169909)
|
123
|
+
get:plain:memcache-client 0.850000 0.270000 1.120000 ( 1.885270)
|
124
|
+
get:ruby:memcached 0.270000 0.280000 0.550000 ( 1.229705)
|
125
|
+
get:ruby:memcache-client 0.890000 0.260000 1.150000 ( 1.861660)
|
126
|
+
multiget:ruby:memcached 0.190000 0.090000 0.280000 ( 0.396264)
|
127
|
+
multiget:ruby:memcache-client 0.530000 0.100000 0.630000 ( 0.901016)
|
128
|
+
missing:ruby:memcached 0.280000 0.290000 0.570000 ( 1.254400)
|
129
|
+
missing:ruby:memcached:inline 0.300000 0.290000 0.590000 ( 1.235122)
|
130
|
+
missing:ruby:memcache-client 0.570000 0.250000 0.820000 ( 1.461293)
|
131
|
+
mixed:ruby:noblock:memcached 0.540000 0.620000 1.160000 ( 2.429200)
|
132
|
+
mixed:ruby:memcached 0.580000 0.570000 1.150000 ( 2.610819)
|
133
|
+
mixed:ruby:memcache-client 1.580000 0.540000 2.120000 ( 3.632775)
|
134
|
+
|
135
|
+
== 1.7.6, 1.8.7 64-bit (Snow Leopard), SystemTimer
|
136
|
+
user system total real
|
137
|
+
set:plain:memcache-client 3.070000 0.380000 3.450000 ( 3.643275)
|
138
|
+
set:ruby:memcache-client 3.140000 0.370000 3.510000 ( 3.698602)
|
139
|
+
get:plain:memcache-client 3.480000 0.360000 3.840000 ( 3.983941)
|
140
|
+
get:ruby:memcache-client 3.540000 0.360000 3.900000 ( 4.034308)
|
141
|
+
multiget:ruby:memcache-client 1.690000 0.140000 1.830000 ( 1.889290)
|
142
|
+
missing:ruby:memcache-client 3.070000 0.360000 3.430000 ( 3.571754)
|
143
|
+
mixed:ruby:memcache-client 6.720000 0.750000 7.470000 ( 7.838771)
|
@@ -0,0 +1,134 @@
|
|
1
|
+
HERE = File.dirname(__FILE__)
|
2
|
+
$LOAD_PATH.unshift "#{HERE}/../lib"
|
3
|
+
#$LOAD_PATH << "/Library/Ruby/Gems/1.8/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1"
|
4
|
+
|
5
|
+
require 'benchmark'
|
6
|
+
require 'rubygems'
|
7
|
+
require 'test/unit'
|
8
|
+
require 'yaml'
|
9
|
+
$TESTING = true
|
10
|
+
require 'memcache' if not defined?(MemCache)
|
11
|
+
|
12
|
+
class TestBenchmark < Test::Unit::TestCase
|
13
|
+
|
14
|
+
def setup
|
15
|
+
puts "Testing #{MemCache::VERSION}"
|
16
|
+
# We'll use a simple @value to try to avoid spending time in Marshal,
|
17
|
+
# which is a constant penalty that both clients have to pay
|
18
|
+
@value = []
|
19
|
+
@marshalled = Marshal.dump(@value)
|
20
|
+
|
21
|
+
@opts = [
|
22
|
+
['127.0.0.1:11211', 'localhost:11211'],
|
23
|
+
{
|
24
|
+
:namespace => "namespace",
|
25
|
+
# :no_reply => true,
|
26
|
+
# :timeout => nil,
|
27
|
+
}
|
28
|
+
]
|
29
|
+
@key1 = "Short"
|
30
|
+
@key2 = "Sym1-2-3::45"*8
|
31
|
+
@key3 = "Long"*40
|
32
|
+
@key4 = "Medium"*8
|
33
|
+
# 5 and 6 are only used for multiget miss test
|
34
|
+
@key5 = "Medium2"*8
|
35
|
+
@key6 = "Long3"*40
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_benchmark
|
39
|
+
Benchmark.bm(31) do |x|
|
40
|
+
|
41
|
+
n = 2500
|
42
|
+
# n = 1000
|
43
|
+
|
44
|
+
@m = MemCache.new(*@opts)
|
45
|
+
x.report("set:plain:memcache-client") do
|
46
|
+
n.times do
|
47
|
+
@m.set @key1, @marshalled, 0, true
|
48
|
+
@m.set @key2, @marshalled, 0, true
|
49
|
+
@m.set @key3, @marshalled, 0, true
|
50
|
+
@m.set @key1, @marshalled, 0, true
|
51
|
+
@m.set @key2, @marshalled, 0, true
|
52
|
+
@m.set @key3, @marshalled, 0, true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
@m = MemCache.new(*@opts)
|
57
|
+
x.report("set:ruby:memcache-client") do
|
58
|
+
n.times do
|
59
|
+
@m.set @key1, @value
|
60
|
+
@m.set @key2, @value
|
61
|
+
@m.set @key3, @value
|
62
|
+
@m.set @key1, @value
|
63
|
+
@m.set @key2, @value
|
64
|
+
@m.set @key3, @value
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
@m = MemCache.new(*@opts)
|
69
|
+
x.report("get:plain:memcache-client") do
|
70
|
+
n.times do
|
71
|
+
@m.get @key1, true
|
72
|
+
@m.get @key2, true
|
73
|
+
@m.get @key3, true
|
74
|
+
@m.get @key1, true
|
75
|
+
@m.get @key2, true
|
76
|
+
@m.get @key3, true
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
@m = MemCache.new(*@opts)
|
81
|
+
x.report("get:ruby:memcache-client") do
|
82
|
+
n.times do
|
83
|
+
@m.get @key1
|
84
|
+
@m.get @key2
|
85
|
+
@m.get @key3
|
86
|
+
@m.get @key1
|
87
|
+
@m.get @key2
|
88
|
+
@m.get @key3
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
@m = MemCache.new(*@opts)
|
93
|
+
x.report("multiget:ruby:memcache-client") do
|
94
|
+
n.times do
|
95
|
+
# We don't use the keys array because splat is slow
|
96
|
+
@m.get_multi @key1, @key2, @key3, @key4, @key5, @key6
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
@m = MemCache.new(*@opts)
|
101
|
+
x.report("missing:ruby:memcache-client") do
|
102
|
+
n.times do
|
103
|
+
begin @m.delete @key1; rescue; end
|
104
|
+
begin @m.get @key1; rescue; end
|
105
|
+
begin @m.delete @key2; rescue; end
|
106
|
+
begin @m.get @key2; rescue; end
|
107
|
+
begin @m.delete @key3; rescue; end
|
108
|
+
begin @m.get @key3; rescue; end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
@m = MemCache.new(*@opts)
|
113
|
+
x.report("mixed:ruby:memcache-client") do
|
114
|
+
n.times do
|
115
|
+
@m.set @key1, @value
|
116
|
+
@m.set @key2, @value
|
117
|
+
@m.set @key3, @value
|
118
|
+
@m.get @key1
|
119
|
+
@m.get @key2
|
120
|
+
@m.get @key3
|
121
|
+
@m.set @key1, @value
|
122
|
+
@m.get @key1
|
123
|
+
@m.set @key2, @value
|
124
|
+
@m.get @key2
|
125
|
+
@m.set @key3, @value
|
126
|
+
@m.get @key3
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
assert true
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|