redistat 0.0.4 → 0.0.5

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 CHANGED
@@ -2,8 +2,3 @@ source 'http://rubygems.org/'
2
2
 
3
3
  # Specify your gem's dependencies in redistat.gemspec
4
4
  gemspec
5
-
6
- group :development do
7
- gem 'rspec', '>= 2.1.0'
8
- gem 'yard', '>= 0.6.3'
9
- end
data/lib/redistat.rb CHANGED
@@ -10,6 +10,7 @@ require 'json'
10
10
  require 'digest/sha1'
11
11
 
12
12
  require 'redistat/collection'
13
+ require 'redistat/connection'
13
14
  require 'redistat/database'
14
15
  require 'redistat/date'
15
16
  require 'redistat/event'
@@ -34,51 +35,28 @@ module Redistat
34
35
  KEY_EVENT_IDS = ".event_ids"
35
36
 
36
37
  class InvalidOptions < ArgumentError; end
37
-
38
- # Provides access to the Redis database. This is shared accross all models and instances.
39
- def redis
40
- threaded[:redis] ||= connection(*options)
41
- end
42
-
43
- def redis=(connection)
44
- threaded[:redis] = connection
45
- end
46
-
47
- def threaded
48
- Thread.current[:redistat] ||= {}
49
- end
50
-
51
- # Connect to a redis database.
52
- #
53
- # @param options [Hash] options to create a message with.
54
- # @option options [#to_s] :host ('127.0.0.1') Host of the redis database.
55
- # @option options [#to_s] :port (6379) Port number.
56
- # @option options [#to_s] :db (0) Database number.
57
- # @option options [#to_s] :timeout (0) Database timeout in seconds.
58
- # @example Connect to a database in port 6380.
59
- # Redistat.connect(:port => 6380)
60
- def connect(*options)
61
- self.redis = nil
62
- @options = options
63
- end
64
-
65
- # Return a connection to Redis.
66
- #
67
- # This is a wapper around Redis.new(options)
68
- def connection(*options)
69
- Redis.new(*options)
70
- end
71
-
72
- def options
73
- @options = [] unless defined? @options
74
- @options
75
- end
76
-
77
- # Clear the database.
78
- def flush
79
- redis.flushdb
80
- end
38
+ class RedisServerIsTooOld < Exception; end
81
39
 
82
- module_function :connect, :connection, :flush, :redis, :redis=, :options, :threaded
83
-
40
+ class << self
41
+
42
+ def connection(ref = nil)
43
+ Connection.get(ref)
44
+ end
45
+ alias :redis :connection
46
+
47
+ def connection=(connection)
48
+ Connection.add(connection)
49
+ end
50
+ alias :redis= :connection=
51
+
52
+ def connect(options)
53
+ Connection.create(options)
54
+ end
55
+
56
+ def flush
57
+ puts "WARNING: Redistat.flush is deprecated. Use Redistat.redis.flush instead."
58
+ connection.flushdb
59
+ end
60
+
61
+ end
84
62
  end
@@ -12,5 +12,9 @@ module Redistat
12
12
  @depth = options[:depth] ||= nil
13
13
  end
14
14
 
15
+ def total
16
+ @total ||= {}
17
+ end
18
+
15
19
  end
16
20
  end
@@ -0,0 +1,67 @@
1
+ module Redistat
2
+ module Connection
3
+
4
+ REQUIRED_SERVER_VERSION = "1.3.10"
5
+
6
+ class << self
7
+
8
+ def get(ref = nil)
9
+ ref ||= :default
10
+ connections[references[ref]] || create
11
+ end
12
+
13
+ def add(conn, ref = nil)
14
+ ref ||= :default
15
+ check_redis_version(conn)
16
+ references[ref] = conn.client.id
17
+ connections[conn.client.id] = conn
18
+ end
19
+
20
+ def create(options = {})
21
+ ref = options.delete(:ref) || :default
22
+ options.reverse_merge!(default_options)
23
+ conn = (connections[connection_id(options)] ||= connection(options))
24
+ references[ref] = conn.client.id
25
+ conn
26
+ end
27
+
28
+ def connections
29
+ threaded[:connections] ||= {}
30
+ end
31
+
32
+ def references
33
+ threaded[:references] ||= {}
34
+ end
35
+
36
+ def threaded
37
+ Thread.current[:redistat] ||= {}
38
+ end
39
+
40
+ private
41
+
42
+ def check_redis_version(conn)
43
+ raise RedisServerIsTooOld if conn.info["redis_version"] < REQUIRED_SERVER_VERSION
44
+ conn
45
+ end
46
+
47
+ def connection(options)
48
+ check_redis_version(Redis.new(options))
49
+ end
50
+
51
+ def connection_id(options = {})
52
+ options.reverse_merge!(default_options)
53
+ "redis://#{options[:host]}:#{options[:port]}/#{options[:db]}"
54
+ end
55
+
56
+ def default_options
57
+ {
58
+ :host => '127.0.0.1',
59
+ :port => 6379,
60
+ :db => 0,
61
+ :timeout => 5
62
+ }
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -3,8 +3,8 @@ module Redistat
3
3
  def self.included(base)
4
4
  base.extend(Database)
5
5
  end
6
- def db
7
- Redistat.redis
6
+ def db(ref = nil)
7
+ Redistat.connection(ref)
8
8
  end
9
9
  end
10
10
  end
@@ -4,21 +4,34 @@ module Redistat
4
4
 
5
5
  attr_reader :id
6
6
  attr_reader :key
7
+ attr_reader :connection_ref
7
8
 
8
9
  attr_accessor :stats
9
10
  attr_accessor :meta
10
11
  attr_accessor :options
11
12
 
12
13
  def initialize(scope, label = nil, date = nil, stats = {}, options = {}, meta = {}, is_new = true)
13
- @options = default_options.merge(options)
14
+ @options = parse_options(options)
15
+ @connection_ref = @options[:connection_ref]
14
16
  @key = Key.new(scope, label, date, @options)
15
17
  @stats = stats ||= {}
16
18
  @meta = meta ||= {}
17
19
  @new = is_new
18
20
  end
21
+
22
+ def db
23
+ super(@connection_ref)
24
+ end
25
+
26
+ def parse_options(options)
27
+ default_options.each do |opt, val|
28
+ options[opt] = val if options[opt].nil?
29
+ end
30
+ options
31
+ end
19
32
 
20
33
  def default_options
21
- { :depth => :hour, :store_event => false }
34
+ { :depth => :hour, :store_event => false, :connection_ref => nil }
22
35
  end
23
36
 
24
37
  def new?
@@ -59,7 +72,7 @@ module Redistat
59
72
 
60
73
  def save
61
74
  return false if !self.new?
62
- Summary.update_all(@key, @stats, depth_limit)
75
+ Summary.update_all(@key, @stats, depth_limit, @connection_ref)
63
76
  if @options[:store_event]
64
77
  @id = self.next_id
65
78
  db.hmset("#{self.scope}#{KEY_EVENT}#{@id}",
@@ -8,6 +8,10 @@ module Redistat
8
8
  @options = options
9
9
  end
10
10
 
11
+ def db
12
+ super(@options[:connection_ref])
13
+ end
14
+
11
15
  def valid_options?
12
16
  return true if !@options[:scope].blank? && !@options[:label].blank? && !@options[:from].blank? && !@options[:till].blank?
13
17
  false
@@ -3,11 +3,16 @@ module Redistat
3
3
  include Database
4
4
 
5
5
  attr_reader :raw
6
+ attr_reader :connection_ref
6
7
 
7
8
  def initialize(str, options = {})
8
9
  @options = options
9
10
  @raw = str.to_s
10
11
  end
12
+
13
+ def db
14
+ super(@options[:connection_ref])
15
+ end
11
16
 
12
17
  def name
13
18
  @options[:hashed_label] ? hash : @raw
@@ -1,5 +1,6 @@
1
1
  module Redistat
2
2
  module Model
3
+ include Redistat::Database
3
4
 
4
5
  def self.included(base)
5
6
  base.extend(self)
@@ -10,6 +11,16 @@ module Redistat
10
11
  end
11
12
  alias :event :store
12
13
 
14
+ def connect_to(opts = {})
15
+ Connection.create(opts.merge(:ref => name))
16
+ options[:connection_ref] = name
17
+ end
18
+
19
+ def connection
20
+ db(options[:connection_ref])
21
+ end
22
+ alias :redis :connection
23
+
13
24
  def fetch(label, from, till, opts = {})
14
25
  Finder.find({
15
26
  :scope => name,
@@ -2,21 +2,21 @@ module Redistat
2
2
  class Summary
3
3
  include Database
4
4
 
5
- def self.update_all(key, stats = {}, depth_limit = nil)
5
+ def self.update_all(key, stats = {}, depth_limit = nil, connection_ref = nil)
6
6
  stats ||= {}
7
7
  depth_limit ||= key.depth
8
8
  return nil if stats.size == 0
9
9
  Date::DEPTHS.each do |depth|
10
- update(key, stats, depth)
10
+ update(key, stats, depth, connection_ref)
11
11
  break if depth == depth_limit
12
12
  end
13
13
  end
14
14
 
15
15
  private
16
16
 
17
- def self.update(key, stats, depth)
17
+ def self.update(key, stats, depth, connection_ref = nil)
18
18
  stats.each do |field, value|
19
- db.hincrby key.to_s(depth), field, value
19
+ db(connection_ref).hincrby key.to_s(depth), field, value
20
20
  end
21
21
  end
22
22
 
@@ -1,3 +1,3 @@
1
1
  module Redistat
2
- VERSION = "0.0.4"
3
- end
2
+ VERSION = "0.0.5"
3
+ end
data/redistat.gemspec CHANGED
@@ -24,4 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_runtime_dependency 'redis', '>= 2.1.1'
25
25
  s.add_runtime_dependency 'system_timer', '>= 1.0.0'
26
26
  s.add_runtime_dependency 'time_ext', '>= 0.2.8'
27
+
28
+ s.add_development_dependency 'rspec', '>= 2.1.0'
29
+ s.add_development_dependency 'yard', '>= 0.6.3'
27
30
  end
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe Redistat::Collection do
4
4
 
5
- it "should should initialize properly" do
5
+ it "should initialize properly" do
6
6
  options = {:from => "from", :till => "till", :depth => "depth"}
7
7
  result = Redistat::Collection.new(options)
8
8
  result.from.should == options[:from]
@@ -10,4 +10,11 @@ describe Redistat::Collection do
10
10
  result.depth.should == options[:depth]
11
11
  end
12
12
 
13
+ it "should have a total property" do
14
+ col = Redistat::Collection.new()
15
+ col.total.should == {}
16
+ col.total = {:foo => "bar"}
17
+ col.total.should == {:foo => "bar"}
18
+ end
19
+
13
20
  end
@@ -0,0 +1,61 @@
1
+ require "spec_helper"
2
+ include Redistat
3
+
4
+ describe Redistat::Connection do
5
+
6
+ it "should have a valid Redis client instance" do
7
+ Redistat.redis.should_not be_nil
8
+ end
9
+
10
+ it "should have initialized custom testing connection" do
11
+ redis = Redistat.redis
12
+ redis.client.host.should == '127.0.0.1'
13
+ redis.client.port.should == 8379
14
+ redis.client.db.should == 15
15
+ end
16
+
17
+ it "should be able to set and get data" do
18
+ redis = Redistat.redis
19
+ redis.set("hello", "world")
20
+ redis.get("hello").should == "world"
21
+ redis.del("hello").should be_true
22
+ end
23
+
24
+ it "should be able to store hashes to Redis" do
25
+ redis = Redistat.redis
26
+ redis.hset("hash", "field", "1")
27
+ redis.hget("hash", "field").should == "1"
28
+ redis.hincrby("hash", "field", 1)
29
+ redis.hget("hash", "field").should == "2"
30
+ redis.hincrby("hash", "field", -1)
31
+ redis.hget("hash", "field").should == "1"
32
+ redis.del("hash")
33
+ end
34
+
35
+ it "should be accessible from Redistat module" do
36
+ Redistat.redis.should == Connection.get
37
+ Redistat.redis.should == Redistat.connection
38
+ end
39
+
40
+ it "should handle multiple connections with refs" do
41
+ Redistat.redis.client.db.should == 15
42
+ Redistat.connect(:port => 8379, :db => 14, :ref => "Custom")
43
+ Redistat.redis.client.db.should == 15
44
+ Redistat.redis("Custom").client.db.should == 14
45
+ end
46
+
47
+ it "should be able to overwrite default and custom refs" do
48
+ Redistat.redis.client.db.should == 15
49
+ Redistat.connect(:port => 8379, :db => 14)
50
+ Redistat.redis.client.db.should == 14
51
+
52
+ Redistat.redis("Custom").client.db.should == 14
53
+ Redistat.connect(:port => 8379, :db => 15, :ref => "Custom")
54
+ Redistat.redis("Custom").client.db.should == 15
55
+
56
+ # Reset the default connection to the testing server or all hell
57
+ # might brake loose from the rest of the specs
58
+ Redistat.connect(:port => 8379, :db => 15)
59
+ end
60
+
61
+ end
@@ -0,0 +1,10 @@
1
+ require "spec_helper"
2
+
3
+ describe Redistat::Database do
4
+ include Redistat::Database
5
+
6
+ it "should make #db method available when included" do
7
+ db.should == Redistat.redis
8
+ end
9
+
10
+ end
data/spec/model_helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require "redistat"
2
2
 
3
- class ModelHelper
3
+ class ModelHelper1
4
4
  include Redistat::Model
5
5
 
6
6
 
@@ -13,4 +13,11 @@ class ModelHelper2
13
13
  store_event true
14
14
  hashed_label true
15
15
 
16
+ end
17
+
18
+ class ModelHelper3
19
+ include Redistat::Model
20
+
21
+ connect_to :port => 8379, :db => 14
22
+
16
23
  end
data/spec/model_spec.rb CHANGED
@@ -5,11 +5,13 @@ describe Redistat::Model do
5
5
  include Redistat::Database
6
6
 
7
7
  before(:each) do
8
- db.flushdb
8
+ ModelHelper1.redis.flushdb
9
+ ModelHelper2.redis.flushdb
10
+ ModelHelper3.redis.flushdb
9
11
  end
10
12
 
11
13
  it "should should name itself correctly" do
12
- ModelHelper.send(:name).should == "ModelHelper"
14
+ ModelHelper1.send(:name).should == "ModelHelper1"
13
15
  ModelHelper2.send(:name).should == "ModelHelper2"
14
16
  end
15
17
 
@@ -18,49 +20,81 @@ describe Redistat::Model do
18
20
  ModelHelper2.store_event.should == true
19
21
  ModelHelper2.hashed_label.should == true
20
22
 
21
- ModelHelper.depth.should == nil
22
- ModelHelper.store_event.should == nil
23
- ModelHelper.hashed_label.should == nil
24
- ModelHelper.depth(:hour)
25
- ModelHelper.depth.should == :hour
26
- ModelHelper.store_event(true)
27
- ModelHelper.store_event.should == true
28
- ModelHelper.hashed_label(true)
29
- ModelHelper.hashed_label.should == true
30
- ModelHelper.options[:depth] = nil
31
- ModelHelper.options[:store_event] = nil
32
- ModelHelper.options[:hashed_label] = nil
33
- ModelHelper.depth.should == nil
34
- ModelHelper.store_event.should == nil
35
- ModelHelper.hashed_label.should == nil
23
+ ModelHelper1.depth.should == nil
24
+ ModelHelper1.store_event.should == nil
25
+ ModelHelper1.hashed_label.should == nil
26
+ ModelHelper1.depth(:hour)
27
+ ModelHelper1.depth.should == :hour
28
+ ModelHelper1.store_event(true)
29
+ ModelHelper1.store_event.should == true
30
+ ModelHelper1.hashed_label(true)
31
+ ModelHelper1.hashed_label.should == true
32
+ ModelHelper1.options[:depth] = nil
33
+ ModelHelper1.options[:store_event] = nil
34
+ ModelHelper1.options[:hashed_label] = nil
35
+ ModelHelper1.depth.should == nil
36
+ ModelHelper1.store_event.should == nil
37
+ ModelHelper1.hashed_label.should == nil
36
38
  end
37
39
 
38
40
  it "should store and fetch stats" do
39
- ModelHelper.store("sheep.black", {:count => 6, :weight => 461}, 4.hours.ago)
40
- ModelHelper.store("sheep.black", {:count => 2, :weight => 156})
41
+ ModelHelper1.store("sheep.black", {:count => 6, :weight => 461}, 4.hours.ago)
42
+ ModelHelper1.store("sheep.black", {:count => 2, :weight => 156})
41
43
 
42
- stats = ModelHelper.fetch("sheep.black", 2.hours.ago, 1.hour.from_now)
44
+ stats = ModelHelper1.fetch("sheep.black", 2.hours.ago, 1.hour.from_now)
43
45
  stats.total["count"].should == 2
44
46
  stats.total["weight"].should == 156
45
47
  stats.first.should == stats.total
46
48
 
47
- stats = ModelHelper.fetch("sheep.black", 5.hours.ago, 1.hour.from_now)
49
+ stats = ModelHelper1.fetch("sheep.black", 5.hours.ago, 1.hour.from_now)
48
50
  stats.total[:count].should == 8
49
51
  stats.total[:weight].should == 617
50
52
  stats.first.should == stats.total
51
53
 
52
- ModelHelper.store("sheep.white", {:count => 5, :weight => 393}, 4.hours.ago)
53
- ModelHelper.store("sheep.white", {:count => 4, :weight => 316})
54
+ ModelHelper1.store("sheep.white", {:count => 5, :weight => 393}, 4.hours.ago)
55
+ ModelHelper1.store("sheep.white", {:count => 4, :weight => 316})
54
56
 
55
- stats = ModelHelper.fetch("sheep.white", 2.hours.ago, 1.hour.from_now)
57
+ stats = ModelHelper1.fetch("sheep.white", 2.hours.ago, 1.hour.from_now)
56
58
  stats.total[:count].should == 4
57
59
  stats.total[:weight].should == 316
58
60
  stats.first.should == stats.total
59
61
 
60
- stats = ModelHelper.fetch("sheep.white", 5.hours.ago, 1.hour.from_now)
62
+ stats = ModelHelper1.fetch("sheep.white", 5.hours.ago, 1.hour.from_now)
61
63
  stats.total[:count].should == 9
62
64
  stats.total[:weight].should == 709
63
65
  stats.first.should == stats.total
64
66
  end
65
67
 
66
- end
68
+ it "should connect to different Redis servers on a per-model basis" do
69
+ ModelHelper3.redis.client.db.should == 14
70
+
71
+ ModelHelper3.store("sheep.black", {:count => 6, :weight => 461}, 4.hours.ago)
72
+ ModelHelper3.store("sheep.black", {:count => 2, :weight => 156})
73
+
74
+ db.keys("*").should be_empty
75
+ ModelHelper1.redis.keys("*").should be_empty
76
+ db("ModelHelper3").keys("*").should have(5).items
77
+ ModelHelper3.redis.keys("*").should have(5).items
78
+
79
+ stats = ModelHelper3.fetch("sheep.black", 2.hours.ago, 1.hour.from_now)
80
+ stats.total["count"].should == 2
81
+ stats.total["weight"].should == 156
82
+ stats = ModelHelper3.fetch("sheep.black", 5.hours.ago, 1.hour.from_now)
83
+ stats.total[:count].should == 8
84
+ stats.total[:weight].should == 617
85
+
86
+ ModelHelper3.connect_to(:port => 8379, :db => 13)
87
+ ModelHelper3.redis.client.db.should == 13
88
+
89
+ stats = ModelHelper3.fetch("sheep.black", 5.hours.ago, 1.hour.from_now)
90
+ stats.total.should == {}
91
+
92
+ ModelHelper3.connect_to(:port => 8379, :db => 14)
93
+ ModelHelper3.redis.client.db.should == 14
94
+
95
+ stats = ModelHelper3.fetch("sheep.black", 5.hours.ago, 1.hour.from_now)
96
+ stats.total[:count].should == 8
97
+ stats.total[:weight].should == 617
98
+ end
99
+
100
+ end
data/spec/spec_helper.rb CHANGED
@@ -8,5 +8,5 @@ require 'rspec'
8
8
  require 'rspec/autorun'
9
9
 
10
10
  # use the test Redistat instance
11
- Redistat.connect({:port => 8379, :db => 15})
12
- Redistat.flush
11
+ Redistat.connect(:port => 8379, :db => 15)
12
+ Redistat.redis.flushdb
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redistat
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jim Myhrberg
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-24 00:00:00 +00:00
18
+ date: 2010-11-28 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -98,6 +98,38 @@ dependencies:
98
98
  version: 0.2.8
99
99
  type: :runtime
100
100
  version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: rspec
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 11
110
+ segments:
111
+ - 2
112
+ - 1
113
+ - 0
114
+ version: 2.1.0
115
+ type: :development
116
+ version_requirements: *id006
117
+ - !ruby/object:Gem::Dependency
118
+ name: yard
119
+ prerelease: false
120
+ requirement: &id007 !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ hash: 1
126
+ segments:
127
+ - 0
128
+ - 6
129
+ - 3
130
+ version: 0.6.3
131
+ type: :development
132
+ version_requirements: *id007
101
133
  description: A Redis-backed statistics storage and querying library written in Ruby.
102
134
  email:
103
135
  - contact@jimeh.me
@@ -118,6 +150,7 @@ files:
118
150
  - Rakefile
119
151
  - lib/redistat.rb
120
152
  - lib/redistat/collection.rb
153
+ - lib/redistat/connection.rb
121
154
  - lib/redistat/core_ext/date.rb
122
155
  - lib/redistat/core_ext/fixnum.rb
123
156
  - lib/redistat/core_ext/time.rb
@@ -134,8 +167,9 @@ files:
134
167
  - lib/redistat/summary.rb
135
168
  - lib/redistat/version.rb
136
169
  - redistat.gemspec
137
- - spec/_redistat_spec.rb
138
170
  - spec/collection_spec.rb
171
+ - spec/connection_spec.rb
172
+ - spec/database_spec.rb
139
173
  - spec/date_spec.rb
140
174
  - spec/db/.emptydir
141
175
  - spec/event_spec.rb
@@ -185,8 +219,9 @@ signing_key:
185
219
  specification_version: 3
186
220
  summary: A Redis-backed statistics storage and querying library written in Ruby.
187
221
  test_files:
188
- - spec/_redistat_spec.rb
189
222
  - spec/collection_spec.rb
223
+ - spec/connection_spec.rb
224
+ - spec/database_spec.rb
190
225
  - spec/date_spec.rb
191
226
  - spec/db/.emptydir
192
227
  - spec/event_spec.rb
@@ -1,34 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Redistat do
4
- include Redistat::Database
5
-
6
- before(:each) do
7
- db.flushdb
8
- end
9
-
10
- it "should have a valid Redis client instance" do
11
- db.should_not be_nil
12
- end
13
-
14
- it "should be connected to the testing server" do
15
- db.client.port.should == 8379
16
- db.client.host.should == "127.0.0.1"
17
- end
18
-
19
- it "should be able to set and get data" do
20
- db.set("hello", "world")
21
- db.get("hello").should == "world"
22
- db.del("hello").should be_true
23
- end
24
-
25
- it "should be able to store hashes to Redis" do
26
- db.hset("key", "field", "1")
27
- db.hget("key", "field").should == "1"
28
- db.hincrby("key", "field", 1)
29
- db.hget("key", "field").should == "2"
30
- db.hincrby("key", "field", -1)
31
- db.hget("key", "field").should == "1"
32
- end
33
-
34
- end