redis-classy 0.9.1 → 1.0.0
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/Gemfile +3 -3
- data/Gemfile.lock +14 -14
- data/README.md +129 -0
- data/Rakefile +6 -23
- data/VERSION +1 -1
- data/lib/redis/classy.rb +6 -0
- data/redis-classy.gemspec +16 -20
- data/spec/redis-classy_spec.rb +60 -2
- data/spec/spec_helper.rb +2 -1
- metadata +13 -14
- data/README.rdoc +0 -106
data/Gemfile
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
2
|
|
3
|
-
gem "redis-namespace", "~> 0.
|
3
|
+
gem "redis-namespace", "~> 1.0.0"
|
4
4
|
|
5
5
|
group :development do
|
6
|
-
gem "rspec", "~> 2.
|
6
|
+
gem "rspec", "~> 2.6.0"
|
7
7
|
gem "bundler", "~> 1.0.0"
|
8
|
-
gem "jeweler", "~> 1.
|
8
|
+
gem "jeweler", "~> 1.6.0"
|
9
9
|
end
|
data/Gemfile.lock
CHANGED
@@ -3,28 +3,28 @@ GEM
|
|
3
3
|
specs:
|
4
4
|
diff-lcs (1.1.2)
|
5
5
|
git (1.2.5)
|
6
|
-
jeweler (1.
|
6
|
+
jeweler (1.6.0)
|
7
7
|
bundler (~> 1.0.0)
|
8
8
|
git (>= 1.2.5)
|
9
9
|
rake
|
10
|
-
rake (0.
|
11
|
-
redis (2.
|
12
|
-
redis-namespace (0.
|
10
|
+
rake (0.9.0)
|
11
|
+
redis (2.2.0)
|
12
|
+
redis-namespace (1.0.3)
|
13
13
|
redis (< 3.0.0)
|
14
|
-
rspec (2.
|
15
|
-
rspec-core (~> 2.
|
16
|
-
rspec-expectations (~> 2.
|
17
|
-
rspec-mocks (~> 2.
|
18
|
-
rspec-core (2.
|
19
|
-
rspec-expectations (2.
|
14
|
+
rspec (2.6.0)
|
15
|
+
rspec-core (~> 2.6.0)
|
16
|
+
rspec-expectations (~> 2.6.0)
|
17
|
+
rspec-mocks (~> 2.6.0)
|
18
|
+
rspec-core (2.6.2)
|
19
|
+
rspec-expectations (2.6.0)
|
20
20
|
diff-lcs (~> 1.1.2)
|
21
|
-
rspec-mocks (2.
|
21
|
+
rspec-mocks (2.6.0)
|
22
22
|
|
23
23
|
PLATFORMS
|
24
24
|
ruby
|
25
25
|
|
26
26
|
DEPENDENCIES
|
27
27
|
bundler (~> 1.0.0)
|
28
|
-
jeweler (~> 1.
|
29
|
-
redis-namespace (~> 0.
|
30
|
-
rspec (~> 2.
|
28
|
+
jeweler (~> 1.6.0)
|
29
|
+
redis-namespace (~> 1.0.0)
|
30
|
+
rspec (~> 2.6.0)
|
data/README.md
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
Redis Classy
|
2
|
+
============
|
3
|
+
|
4
|
+
Class-style namespace prefixing for Redis.
|
5
|
+
|
6
|
+
With Redis Classy, class names become the prefix part of the Redis keys.
|
7
|
+
|
8
|
+
class Something < Redis::Classy
|
9
|
+
end
|
10
|
+
|
11
|
+
Something.set "foo", "bar" # equivalent of => redis.set "Something:foo", "bar"
|
12
|
+
Something.get "foo" # => redis.get "Something:foo"
|
13
|
+
=> "bar"
|
14
|
+
|
15
|
+
This library contains only 33 lines of code, yet powerful when you need better abstraction on Redis objects to keep things organized.
|
16
|
+
|
17
|
+
Requies the `redis-namespace` gem.
|
18
|
+
|
19
|
+
What's new:
|
20
|
+
|
21
|
+
* v1.0.0: Play nice with Mongoid
|
22
|
+
|
23
|
+
Synopsis
|
24
|
+
--------
|
25
|
+
|
26
|
+
With the vanilla redis gem, you've been doing this:
|
27
|
+
|
28
|
+
redis = Redis.new
|
29
|
+
redis.set "foo", "bar"
|
30
|
+
|
31
|
+
With the redis-namespace gem, you can add a prefix in the following manner:
|
32
|
+
|
33
|
+
redis_ns = Redis::Namespace.new('ns', :redis => redis)
|
34
|
+
redis_ns['foo'] = 'bar' # equivalent of => redis.set "ns:foo", "bar"
|
35
|
+
|
36
|
+
Now, with the redis-classy gem, you could finally do:
|
37
|
+
|
38
|
+
class Something < Redis::Classy
|
39
|
+
end
|
40
|
+
|
41
|
+
Something.set "foo", "bar" # equivalent of => redis.set "Prefix:foo", "bar"
|
42
|
+
Something.get "foo"
|
43
|
+
=> "bar"
|
44
|
+
|
45
|
+
Install
|
46
|
+
-------
|
47
|
+
|
48
|
+
gem install redis-classy
|
49
|
+
|
50
|
+
Usage
|
51
|
+
-----
|
52
|
+
|
53
|
+
In Gemfile:
|
54
|
+
|
55
|
+
gem "redis-classy"
|
56
|
+
|
57
|
+
In config/initializers/redis_classy.rb:
|
58
|
+
|
59
|
+
Redis::Classy.db = Redis.new
|
60
|
+
|
61
|
+
Now you can write models that inherit the Redis::Classy class, automatically prefixing keys with its class name.
|
62
|
+
You can use any Redis commands on the class, since they are simply passed to the Redis instance.
|
63
|
+
|
64
|
+
class UniqueUser < Redis::Classy
|
65
|
+
def self.nuke
|
66
|
+
self.keys.each{|key| self.del(key) }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
UniqueUser.sadd "2011-02-28", @user_a.id
|
71
|
+
UniqueUser.sadd "2011-02-28", @user_b.id
|
72
|
+
UniqueUser.sadd "2011-03-01", @user_c.id
|
73
|
+
|
74
|
+
UniqueUser.smembers "2011-02-28"
|
75
|
+
=> ["123", "456"]
|
76
|
+
|
77
|
+
UniqueUser.nuke
|
78
|
+
=> ["2011-02-28", "2011-03-01"]
|
79
|
+
|
80
|
+
UniqueUser.keys
|
81
|
+
=> []
|
82
|
+
|
83
|
+
In most cases you may be just fine with class methods, but by creating an instance with a key, even further binding is possible.
|
84
|
+
|
85
|
+
class Counter < Redis::Classy
|
86
|
+
def initialize(object)
|
87
|
+
super("#{object.class.name}:#{object.id}")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class Room < ActiveRecord::Base
|
92
|
+
end
|
93
|
+
|
94
|
+
@room = Room.create
|
95
|
+
|
96
|
+
counter = Counter.new(@room)
|
97
|
+
counter.incr
|
98
|
+
counter.incr
|
99
|
+
counter.get
|
100
|
+
=> "2"
|
101
|
+
|
102
|
+
counter.key
|
103
|
+
=> "Room:123"
|
104
|
+
|
105
|
+
You also have access to the non-namespaced, raw Redis instance via Redis::Classy
|
106
|
+
|
107
|
+
Redis::Classy.keys "UniqueUser:*"
|
108
|
+
=> ["UniqueUser:2011-02-28", "UniqueUser:2011-03-01"]
|
109
|
+
|
110
|
+
Redis::Classy.multi do
|
111
|
+
UniqueUser.sadd "2011-02-28", @user_a.id
|
112
|
+
UniqueUser.sadd "2011-02-28", @user_b.id
|
113
|
+
end
|
114
|
+
|
115
|
+
Since the "db" attribute is a class instance variable, you can dynamically assign different databases for each class.
|
116
|
+
|
117
|
+
UniqueUser.db = Redis::Namespace.new("UniqueUser", :redis => Redis.new(:host => "another.host"))
|
118
|
+
|
119
|
+
Reference
|
120
|
+
---------
|
121
|
+
|
122
|
+
Dependency:
|
123
|
+
|
124
|
+
* <https://github.com/ezmobius/redis-rb>
|
125
|
+
* <https://github.com/defunkt/redis-namespace>
|
126
|
+
|
127
|
+
Use case:
|
128
|
+
|
129
|
+
* <https://github.com/kenn/redis-mutex>
|
data/Rakefile
CHANGED
@@ -7,39 +7,22 @@ rescue Bundler::BundlerError => e
|
|
7
7
|
$stderr.puts "Run `bundle install` to install missing gems"
|
8
8
|
exit e.status_code
|
9
9
|
end
|
10
|
-
require 'rake'
|
10
|
+
require 'rake/file_utils'
|
11
|
+
include FileUtils
|
11
12
|
|
12
13
|
require 'jeweler'
|
13
14
|
Jeweler::Tasks.new do |gem|
|
14
15
|
gem.name = "redis-classy"
|
15
16
|
gem.homepage = "http://github.com/kenn/redis-classy"
|
16
17
|
gem.license = "MIT"
|
17
|
-
gem.summary = "
|
18
|
-
gem.description = "
|
18
|
+
gem.summary = "Class-style namespace prefixing for Redis"
|
19
|
+
gem.description = "Class-style namespace prefixing for Redis"
|
19
20
|
gem.email = "kenn.ejima@gmail.com"
|
20
21
|
gem.authors = ["Kenn Ejima"]
|
21
22
|
end
|
22
23
|
Jeweler::RubygemsDotOrgTasks.new
|
23
24
|
|
24
|
-
require 'rspec/core'
|
25
|
-
require 'rspec/core/rake_task'
|
26
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
27
|
-
spec.pattern = FileList['spec/**/*_spec.rb']
|
28
|
-
end
|
29
|
-
|
30
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
31
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
32
|
-
spec.rcov = true
|
33
|
-
end
|
34
|
-
|
35
25
|
task :default => :spec
|
36
|
-
|
37
|
-
|
38
|
-
Rake::RDocTask.new do |rdoc|
|
39
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
40
|
-
|
41
|
-
rdoc.rdoc_dir = 'rdoc'
|
42
|
-
rdoc.title = "redis-classy #{version}"
|
43
|
-
rdoc.rdoc_files.include('README*')
|
44
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
26
|
+
task :spec do
|
27
|
+
exec "rspec spec/redis-classy_spec.rb"
|
45
28
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/lib/redis/classy.rb
CHANGED
@@ -12,6 +12,12 @@ class Redis
|
|
12
12
|
def method_missing(method_name, *args, &block)
|
13
13
|
self.db.send(method_name, *args, &block)
|
14
14
|
end
|
15
|
+
|
16
|
+
Redis::Namespace::COMMANDS.keys.each do |key|
|
17
|
+
define_method(key) do |*args|
|
18
|
+
self.db.send(key, *args)
|
19
|
+
end
|
20
|
+
end
|
15
21
|
end
|
16
22
|
|
17
23
|
attr_accessor :key
|
data/redis-classy.gemspec
CHANGED
@@ -5,16 +5,16 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{redis-classy}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "1.0.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kenn Ejima"]
|
12
|
-
s.date = %q{2011-
|
13
|
-
s.description = %q{
|
12
|
+
s.date = %q{2011-05-21}
|
13
|
+
s.description = %q{Class-style namespace prefixing for Redis}
|
14
14
|
s.email = %q{kenn.ejima@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.txt",
|
17
|
-
"README.
|
17
|
+
"README.md"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
"Gemfile",
|
23
23
|
"Gemfile.lock",
|
24
24
|
"LICENSE.txt",
|
25
|
-
"README.
|
25
|
+
"README.md",
|
26
26
|
"Rakefile",
|
27
27
|
"VERSION",
|
28
28
|
"lib/redis-classy.rb",
|
@@ -34,32 +34,28 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.homepage = %q{http://github.com/kenn/redis-classy}
|
35
35
|
s.licenses = ["MIT"]
|
36
36
|
s.require_paths = ["lib"]
|
37
|
-
s.rubygems_version = %q{1.
|
38
|
-
s.summary = %q{
|
39
|
-
s.test_files = [
|
40
|
-
"spec/redis-classy_spec.rb",
|
41
|
-
"spec/spec_helper.rb"
|
42
|
-
]
|
37
|
+
s.rubygems_version = %q{1.6.2}
|
38
|
+
s.summary = %q{Class-style namespace prefixing for Redis}
|
43
39
|
|
44
40
|
if s.respond_to? :specification_version then
|
45
41
|
s.specification_version = 3
|
46
42
|
|
47
43
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
|
-
s.add_runtime_dependency(%q<redis-namespace>, ["~> 0.
|
49
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.
|
44
|
+
s.add_runtime_dependency(%q<redis-namespace>, ["~> 1.0.0"])
|
45
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
|
50
46
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
51
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.
|
47
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
|
52
48
|
else
|
53
|
-
s.add_dependency(%q<redis-namespace>, ["~> 0.
|
54
|
-
s.add_dependency(%q<rspec>, ["~> 2.
|
49
|
+
s.add_dependency(%q<redis-namespace>, ["~> 1.0.0"])
|
50
|
+
s.add_dependency(%q<rspec>, ["~> 2.6.0"])
|
55
51
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
52
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
57
53
|
end
|
58
54
|
else
|
59
|
-
s.add_dependency(%q<redis-namespace>, ["~> 0.
|
60
|
-
s.add_dependency(%q<rspec>, ["~> 2.
|
55
|
+
s.add_dependency(%q<redis-namespace>, ["~> 1.0.0"])
|
56
|
+
s.add_dependency(%q<rspec>, ["~> 2.6.0"])
|
61
57
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
58
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
63
59
|
end
|
64
60
|
end
|
65
61
|
|
data/spec/redis-classy_spec.rb
CHANGED
@@ -1,7 +1,65 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
+
class Something < Redis::Classy
|
4
|
+
end
|
5
|
+
|
3
6
|
describe "RedisClassy" do
|
4
|
-
|
5
|
-
|
7
|
+
before(:each) do
|
8
|
+
Redis::Classy.flushdb
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:each) do
|
12
|
+
Redis::Classy.flushdb
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:all) do
|
16
|
+
Redis::Classy.quit
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should prepend class name to the key" do
|
20
|
+
Something.set("foo", "bar")
|
21
|
+
|
22
|
+
Something.keys.should == ["foo"]
|
23
|
+
Redis::Classy.keys.should == ["Something:foo"]
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should delegate class methods" do
|
27
|
+
Something.get("foo").should == nil
|
28
|
+
Something.set("foo", "bar")
|
29
|
+
Something.get("foo").should == "bar"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should delegate instance methods with the key binding" do
|
33
|
+
something = Something.new("foo")
|
34
|
+
|
35
|
+
something.get.should == nil
|
36
|
+
something.set("bar")
|
37
|
+
something.get.should == "bar"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should handle multi block" do
|
41
|
+
Redis::Classy.multi do
|
42
|
+
Something.sadd "foo", "bar"
|
43
|
+
Something.sadd "foo", "baz"
|
44
|
+
end
|
45
|
+
|
46
|
+
Something.smembers("foo").should == ["baz", "bar"]
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should battle against mongoid" do
|
50
|
+
# Emulate notorious Mongoid::Extensions::Object::Conversions
|
51
|
+
class Object
|
52
|
+
def self.get(value)
|
53
|
+
value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# This would have returned "foo" instead of nil, unless we explicitly defined
|
58
|
+
# class methods from Redis::Namespace::COMMANDS
|
59
|
+
Something.get("foo").should == nil
|
60
|
+
|
61
|
+
class << Object
|
62
|
+
remove_method :get
|
63
|
+
end
|
6
64
|
end
|
7
65
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: redis-classy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 1.0.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kenn Ejima
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-05-21 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.
|
23
|
+
version: 1.0.0
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: *id001
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 2.
|
34
|
+
version: 2.6.0
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: *id002
|
@@ -53,11 +53,11 @@ dependencies:
|
|
53
53
|
requirements:
|
54
54
|
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 1.
|
56
|
+
version: 1.6.0
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: *id004
|
60
|
-
description:
|
60
|
+
description: Class-style namespace prefixing for Redis
|
61
61
|
email: kenn.ejima@gmail.com
|
62
62
|
executables: []
|
63
63
|
|
@@ -65,14 +65,14 @@ extensions: []
|
|
65
65
|
|
66
66
|
extra_rdoc_files:
|
67
67
|
- LICENSE.txt
|
68
|
-
- README.
|
68
|
+
- README.md
|
69
69
|
files:
|
70
70
|
- .document
|
71
71
|
- .rspec
|
72
72
|
- Gemfile
|
73
73
|
- Gemfile.lock
|
74
74
|
- LICENSE.txt
|
75
|
-
- README.
|
75
|
+
- README.md
|
76
76
|
- Rakefile
|
77
77
|
- VERSION
|
78
78
|
- lib/redis-classy.rb
|
@@ -94,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
94
|
requirements:
|
95
95
|
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
hash:
|
97
|
+
hash: 1700316394967053203
|
98
98
|
segments:
|
99
99
|
- 0
|
100
100
|
version: "0"
|
@@ -107,10 +107,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements: []
|
108
108
|
|
109
109
|
rubyforge_project:
|
110
|
-
rubygems_version: 1.
|
110
|
+
rubygems_version: 1.6.2
|
111
111
|
signing_key:
|
112
112
|
specification_version: 3
|
113
|
-
summary:
|
114
|
-
test_files:
|
115
|
-
|
116
|
-
- spec/spec_helper.rb
|
113
|
+
summary: Class-style namespace prefixing for Redis
|
114
|
+
test_files: []
|
115
|
+
|
data/README.rdoc
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
= Redis Classy
|
2
|
-
|
3
|
-
Model-friendly base class for Redis.
|
4
|
-
|
5
|
-
With this library, the class name of your model becomes the prefix part of the Redis keys.
|
6
|
-
|
7
|
-
This library contains only 27 lines of code, yet powerful when you need more abstraction on Redis objects rather than dealing with complicated keys in all strings.
|
8
|
-
|
9
|
-
Requies the redis-namespace gem.
|
10
|
-
|
11
|
-
== Synopsis
|
12
|
-
|
13
|
-
With the vanilla redis gem, you've been normally doing this:
|
14
|
-
|
15
|
-
redis = Redis.new
|
16
|
-
redis.set "foo", "bar"
|
17
|
-
|
18
|
-
With the redis-namespace gem, you could add a prefix in the following manner:
|
19
|
-
|
20
|
-
redis_ns = Redis::Namespace.new('ns', :redis => redis)
|
21
|
-
redis_ns['foo'] = 'bar' # equivalent of => redis.set "ns:foo", "bar"
|
22
|
-
|
23
|
-
Now, with the redis-classy gem, you could finally do:
|
24
|
-
|
25
|
-
class Prefix < Redis::Classy
|
26
|
-
end
|
27
|
-
|
28
|
-
Prefix.set "foo", "bar" # equivalent of => redis.set "Prefix:foo", "bar"
|
29
|
-
Prefix.get "foo"
|
30
|
-
=> "bar"
|
31
|
-
|
32
|
-
== Install
|
33
|
-
|
34
|
-
gem install redis-classy
|
35
|
-
|
36
|
-
== Usage
|
37
|
-
|
38
|
-
In Gemfile:
|
39
|
-
|
40
|
-
gem "redis-classy"
|
41
|
-
|
42
|
-
In config/initializers/redis_classy.rb:
|
43
|
-
|
44
|
-
Redis::Classy.db = Redis.new
|
45
|
-
|
46
|
-
Now you can write models that inherit the Redis::Classy class, automatically prefixing keys with its class name.
|
47
|
-
You can use any Redis commands on the class, since they are simply passed to the Redis instance.
|
48
|
-
|
49
|
-
class UniqueUser < Redis::Classy
|
50
|
-
def self.nuke
|
51
|
-
self.keys.each{|key| self.del(key) }
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
UniqueUser.sadd "2011-02-28", @user_a.id
|
56
|
-
UniqueUser.sadd "2011-02-28", @user_b.id
|
57
|
-
UniqueUser.sadd "2011-03-01", @user_c.id
|
58
|
-
|
59
|
-
UniqueUser.smembers "2011-02-28"
|
60
|
-
=> ["123", "456"]
|
61
|
-
|
62
|
-
UniqueUser.nuke
|
63
|
-
=> ["2011-02-28", "2011-03-01"]
|
64
|
-
|
65
|
-
UniqueUser.keys
|
66
|
-
=> []
|
67
|
-
|
68
|
-
In most cases you may be just fine with class methods, but by creating an instance with a key, even further binding is possible.
|
69
|
-
|
70
|
-
class Counter < Redis::Classy
|
71
|
-
def initialize(object)
|
72
|
-
super("#{object.class.name}:#{object.id}")
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
counter = Counter.new(@room)
|
77
|
-
counter.incr
|
78
|
-
counter.incr
|
79
|
-
counter.get
|
80
|
-
=> "2"
|
81
|
-
|
82
|
-
counter.key
|
83
|
-
=> "Room:123"
|
84
|
-
|
85
|
-
You also have access to the non-namespaced, raw Redis instance via Redis::Classy
|
86
|
-
|
87
|
-
Redis::Classy.keys "UniqueUser:*"
|
88
|
-
=> ["UniqueUser:2011-02-28", "UniqueUser:2011-03-01"]
|
89
|
-
|
90
|
-
Redis::Classy.multi do
|
91
|
-
UniqueUser.sadd "2011-02-28", @user_a.id
|
92
|
-
UniqueUser.sadd "2011-02-28", @user_b.id
|
93
|
-
end
|
94
|
-
|
95
|
-
Since the "db" attribute is a class instance variable, you can dynamically assign different databases for each class.
|
96
|
-
|
97
|
-
UniqueUser.db = Redis::Namespace.new("UniqueUser", :redis => Redis.new(:host => "another.host"))
|
98
|
-
|
99
|
-
== Reference
|
100
|
-
|
101
|
-
Dependency:
|
102
|
-
https://github.com/ezmobius/redis-rb
|
103
|
-
https://github.com/defunkt/redis-namespace
|
104
|
-
|
105
|
-
Use case:
|
106
|
-
https://github.com/kenn/redis-mutex
|