rails_redis_cache 0.0.1
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 +1 -0
- data/lib/rails_redis_cache.rb +72 -0
- data/test/test_helper.rb +2 -0
- data/test/test_rails_redis_cache.rb +103 -0
- metadata +105 -0
data/README.rdoc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
redis cache for rails3
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'base64'
|
3
|
+
require 'redis'
|
4
|
+
require 'time'
|
5
|
+
|
6
|
+
module ActiveSupport
|
7
|
+
module Cache
|
8
|
+
class RailsRedisCache < Store
|
9
|
+
|
10
|
+
TIME_PREF = "rails_redis_cache_time"
|
11
|
+
VALUE_PREF = "rails_redis_cache_value"
|
12
|
+
|
13
|
+
attr_reader :redis
|
14
|
+
|
15
|
+
def initialize(options={})
|
16
|
+
super()
|
17
|
+
@redis = Redis.connect(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
# ============================= basic store impl ==============================
|
21
|
+
|
22
|
+
def read_entry(key, options)
|
23
|
+
raw_value = @redis.get "#{VALUE_PREF}_#{key}"
|
24
|
+
return nil unless raw_value
|
25
|
+
|
26
|
+
time = Time.parse @redis.get("#{TIME_PREF}_#{key}")
|
27
|
+
value = Marshal.load(Base64.decode64(raw_value))
|
28
|
+
ActiveSupport::Cache::Entry.create value, time
|
29
|
+
end
|
30
|
+
|
31
|
+
def write_entry(key, entry, options)
|
32
|
+
value = Base64.encode64(Marshal.dump(entry.value))
|
33
|
+
time = Time.now
|
34
|
+
@redis.mset "#{VALUE_PREF}_#{key}", value, "#{TIME_PREF}_#{key}", time
|
35
|
+
return unless expiry = options[:expires_in]
|
36
|
+
@redis.expire "#{VALUE_PREF}_#{key}", expiry
|
37
|
+
@redis.expire "#{TIME_PREF}_#{key}", expiry
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete_entry(key, options)
|
41
|
+
@redis.del "#{VALUE_PREF}_#{key}", "#{TIME_PREF}_#{key}"
|
42
|
+
end
|
43
|
+
|
44
|
+
# ============================= optional store impl ==============================
|
45
|
+
|
46
|
+
def delete_matched(matcher, options = nil)
|
47
|
+
@redis.keys("#{VALUE_PREF}_*").map{|key| key[(VALUE_PREF.size + 1)..-1] }.grep(matcher).each do |key|
|
48
|
+
delete_entry(key, options)
|
49
|
+
end.size
|
50
|
+
end
|
51
|
+
|
52
|
+
def increment(name, amount = 1, options = nil)
|
53
|
+
write(name, amount + read(name, options).to_i, options)
|
54
|
+
end
|
55
|
+
|
56
|
+
def decrement(name, amount = 1, options = nil)
|
57
|
+
write(name, -1 * amount + read(name, options).to_i, options)
|
58
|
+
end
|
59
|
+
|
60
|
+
def cleanup(options = nil)
|
61
|
+
p value_keys = @redis.keys("#{VALUE_PREF}_*")
|
62
|
+
p time_keys = @redis.keys("#{TIME_PREF}_*")
|
63
|
+
@redis.del *(value_keys + time_keys)
|
64
|
+
end
|
65
|
+
|
66
|
+
def clear(options = nil)
|
67
|
+
cleanup(options)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'rails_redis_cache'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
class TestRailsRedisCache < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
ActiveSupport::Cache::RailsRedisCache.logger = Logger.new(STDOUT)
|
9
|
+
@cache = ActiveSupport::Cache::RailsRedisCache.new(:url => ENV['RAILS_REDIS_CACHE_URL'])
|
10
|
+
@cache.redis.flushdb
|
11
|
+
@value = "entry"
|
12
|
+
@key = "key"
|
13
|
+
@options = {:option => 'any'}
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_delete_no_error
|
17
|
+
@cache.delete(@key, @options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_write_no_error
|
21
|
+
@cache.write(@key, @value, @options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_read_no_error
|
25
|
+
@cache.read(@key, @options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_read_write
|
29
|
+
@cache.delete(@key, @options)
|
30
|
+
assert_nil(@cache.read(@key, @options))
|
31
|
+
@cache.write(@key, @value, @options)
|
32
|
+
assert_equal(@value, @cache.read(@key, @options))
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_expires_in
|
36
|
+
@cache.write(@key, @value, :expires_in=>2.seconds)
|
37
|
+
assert_equal(@value, @cache.read(@key, @options))
|
38
|
+
sleep(3)
|
39
|
+
assert_nil(@cache.read(@key, @options))
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_fetch
|
43
|
+
count = 0
|
44
|
+
@cache.fetch(@key, :expires_in=>3.seconds) {count += 1}
|
45
|
+
@cache.fetch(@key) {count += 1}
|
46
|
+
@cache.fetch(@key) {count += 1}
|
47
|
+
assert_equal(count, 1)
|
48
|
+
@cache.delete(@key)
|
49
|
+
@cache.fetch(@key, :expires_in=>0.seconds) {count += 1}
|
50
|
+
assert_equal(count, 2)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_fetch_with_proc
|
54
|
+
@cache.fetch(@key, @options, &lambda{@value})
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_fetch_with_array
|
58
|
+
@cache.fetch(@key, @options){[@value]}
|
59
|
+
assert_equal([@value], @cache.fetch(@key, @options))
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_delete_matched
|
63
|
+
@cache.write('aaaa', @value, @options)
|
64
|
+
@cache.write('aaa', @value, @options)
|
65
|
+
@cache.write('aa', @value, @options)
|
66
|
+
assert_equal(3, @cache.delete_matched(/aa+/, @options))
|
67
|
+
assert_nil(@cache.read('aaaa', @options))
|
68
|
+
assert_nil(@cache.read('aaa', @options))
|
69
|
+
assert_nil(@cache.read('aa', @options))
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_create_exist?
|
73
|
+
@cache.write(@key, @value, @options)
|
74
|
+
assert_equal(true, @cache.exist?(@key, @options))
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_delete_exists
|
78
|
+
@cache.write(@key, @value, @options)
|
79
|
+
@cache.delete(@key, @options)
|
80
|
+
assert_equal(false, @cache.exist?(@key, @options))
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_increment
|
84
|
+
@cache.write(@key, 1)
|
85
|
+
assert_equal(1, @cache.read(@key).to_i)
|
86
|
+
@cache.increment(@key)
|
87
|
+
assert_equal(2, @cache.read(@key).to_i)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_decrement
|
91
|
+
@cache.write(@key, 1)
|
92
|
+
assert_equal(1, @cache.read(@key).to_i)
|
93
|
+
@cache.decrement(@key)
|
94
|
+
assert_equal(0, @cache.read(@key).to_i)
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_cleanup
|
98
|
+
@cache.write(@key, @value)
|
99
|
+
@cache.cleanup
|
100
|
+
assert_equal(0, @cache.redis.dbsize)
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails_redis_cache
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Peter Schr\xC3\xB6der"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-10 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: activesupport
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: -1442725791
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
- beta
|
35
|
+
version: 3.0.0.beta
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: redis
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 15
|
47
|
+
segments:
|
48
|
+
- 2
|
49
|
+
- 0
|
50
|
+
- 0
|
51
|
+
version: 2.0.0
|
52
|
+
type: :runtime
|
53
|
+
version_requirements: *id002
|
54
|
+
description: Rails cache store implementation using Redis.
|
55
|
+
email: phoetmail@googlemail.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files: []
|
61
|
+
|
62
|
+
files:
|
63
|
+
- lib/rails_redis_cache.rb
|
64
|
+
- README.rdoc
|
65
|
+
- test/test_helper.rb
|
66
|
+
- test/test_rails_redis_cache.rb
|
67
|
+
has_rdoc: true
|
68
|
+
homepage: http://github.com/phoet/rails_redis_cache
|
69
|
+
licenses: []
|
70
|
+
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options:
|
73
|
+
- -a
|
74
|
+
- --inline-source
|
75
|
+
- --charset=UTF-8
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
86
|
+
version: "0"
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 3
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
requirements: []
|
97
|
+
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 1.3.7
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: Rails cache store implementation using Redis.
|
103
|
+
test_files:
|
104
|
+
- test/test_helper.rb
|
105
|
+
- test/test_rails_redis_cache.rb
|