tokyo_cache_cow 0.0.5 → 0.0.6
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/README.rdoc +16 -1
- data/VERSION.yml +2 -2
- data/lib/tokyo_cache_cow/cache/base.rb +26 -2
- data/lib/tokyo_cache_cow/server.rb +5 -5
- metadata +1 -1
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Tokyo Cache Cow
|
2
2
|
|
3
|
-
Tokyo Cache Cow is MemCache protocol speaking cache server. It offers the ability to delete keys based on a substring.
|
3
|
+
Tokyo Cache Cow is MemCache protocol speaking cache server. It offers the ability to delete keys based on a substring as well as aggregate functions based on substrings.
|
4
4
|
|
5
5
|
== Motivation
|
6
6
|
|
@@ -60,6 +60,21 @@ But <i>other_key</i> is still peachy.
|
|
60
60
|
>> Rails.cache.read('other_key')
|
61
61
|
=> "other_value"
|
62
62
|
|
63
|
+
=== Aggregate functions
|
64
|
+
|
65
|
+
You can invoke aggregates by using the prefixes <tt>average-</tt>, <tt>count-</tt>, <tt>sum-</tt>, <tt>min-</tt> and <tt>max-</tt>.
|
66
|
+
|
67
|
+
>> Rails.cache.write('hello1', '1')
|
68
|
+
=> true
|
69
|
+
>> Rails.cache.write('hello2', '2')
|
70
|
+
=> true
|
71
|
+
>> Rails.cache.write('hello3', '3')
|
72
|
+
=> true
|
73
|
+
>> Rails.cache.read('average-hello')
|
74
|
+
=> "2.0"
|
75
|
+
>> Rails.cache.read('sum-hello')
|
76
|
+
=> "6.0"
|
77
|
+
|
63
78
|
|
64
79
|
== Usage
|
65
80
|
|
data/VERSION.yml
CHANGED
@@ -11,11 +11,35 @@ class TokyoCacheCow
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def average_match(match)
|
14
|
-
|
15
|
-
values = average_keys.map{|ak| get(ak)}.map{|v| Integer(v[:value]) rescue nil}.compact
|
14
|
+
values = numeric_values_match(match)
|
16
15
|
values.inject(0.0) { |sum, el| sum + el } / values.size
|
17
16
|
end
|
18
17
|
|
18
|
+
def sum_match(match)
|
19
|
+
values = numeric_values_match(match)
|
20
|
+
values.inject(0.0) { |sum, el| sum + el }
|
21
|
+
end
|
22
|
+
|
23
|
+
def count_match(match)
|
24
|
+
values = numeric_values_match(match)
|
25
|
+
values.size
|
26
|
+
end
|
27
|
+
|
28
|
+
def min_match(match)
|
29
|
+
values = numeric_values_match(match)
|
30
|
+
values.min
|
31
|
+
end
|
32
|
+
|
33
|
+
def max_match(match)
|
34
|
+
values = numeric_values_match(match)
|
35
|
+
values.max
|
36
|
+
end
|
37
|
+
|
38
|
+
def numeric_values_match(match)
|
39
|
+
numeric_keys = get_match(match)
|
40
|
+
numeric_keys.map{|ak| get(ak)}.map{|v| Integer(v[:value]) rescue nil}.compact
|
41
|
+
end
|
42
|
+
|
19
43
|
end
|
20
44
|
end
|
21
45
|
end
|
@@ -101,11 +101,11 @@ class TokyoCacheCow
|
|
101
101
|
keys = args.split(/\s+/)
|
102
102
|
keys.each do |k|
|
103
103
|
next unless validate_key(k)
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
104
|
+
if k =~ /^(average|sum|count|min|max)-(.*)/
|
105
|
+
average = @cache.send(:"#{$1}_match", $2).to_s
|
106
|
+
send_data(GetValueReply % [k, "0", average.size])
|
107
|
+
send_data(average)
|
108
|
+
send_data(Terminator)
|
109
109
|
else
|
110
110
|
if data = @cache.get(k)
|
111
111
|
if command == 'get'
|