redis 3.3.5 → 4.7.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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +220 -2
- data/README.md +169 -89
- data/lib/redis/client.rb +176 -99
- data/lib/redis/cluster/command.rb +79 -0
- data/lib/redis/cluster/command_loader.rb +33 -0
- data/lib/redis/cluster/key_slot_converter.rb +72 -0
- data/lib/redis/cluster/node.rb +120 -0
- data/lib/redis/cluster/node_key.rb +31 -0
- data/lib/redis/cluster/node_loader.rb +34 -0
- data/lib/redis/cluster/option.rb +100 -0
- data/lib/redis/cluster/slot.rb +86 -0
- data/lib/redis/cluster/slot_loader.rb +46 -0
- data/lib/redis/cluster.rb +315 -0
- data/lib/redis/commands/bitmaps.rb +63 -0
- data/lib/redis/commands/cluster.rb +45 -0
- data/lib/redis/commands/connection.rb +58 -0
- data/lib/redis/commands/geo.rb +84 -0
- data/lib/redis/commands/hashes.rb +251 -0
- data/lib/redis/commands/hyper_log_log.rb +37 -0
- data/lib/redis/commands/keys.rb +411 -0
- data/lib/redis/commands/lists.rb +289 -0
- data/lib/redis/commands/pubsub.rb +72 -0
- data/lib/redis/commands/scripting.rb +114 -0
- data/lib/redis/commands/server.rb +188 -0
- data/lib/redis/commands/sets.rb +207 -0
- data/lib/redis/commands/sorted_sets.rb +812 -0
- data/lib/redis/commands/streams.rb +382 -0
- data/lib/redis/commands/strings.rb +313 -0
- data/lib/redis/commands/transactions.rb +139 -0
- data/lib/redis/commands.rb +242 -0
- data/lib/redis/connection/command_helper.rb +7 -10
- data/lib/redis/connection/hiredis.rb +5 -5
- data/lib/redis/connection/registry.rb +2 -1
- data/lib/redis/connection/ruby.rb +130 -128
- data/lib/redis/connection/synchrony.rb +24 -9
- data/lib/redis/connection.rb +3 -1
- data/lib/redis/distributed.rb +231 -72
- data/lib/redis/errors.rb +57 -0
- data/lib/redis/hash_ring.rb +30 -73
- data/lib/redis/pipeline.rb +178 -13
- data/lib/redis/subscribe.rb +11 -12
- data/lib/redis/version.rb +3 -1
- data/lib/redis.rb +173 -2661
- metadata +66 -202
- data/.gitignore +0 -16
- data/.travis/Gemfile +0 -11
- data/.travis.yml +0 -89
- data/.yardopts +0 -3
- data/Gemfile +0 -4
- data/Rakefile +0 -87
- data/benchmarking/logging.rb +0 -71
- data/benchmarking/pipeline.rb +0 -51
- data/benchmarking/speed.rb +0 -21
- data/benchmarking/suite.rb +0 -24
- data/benchmarking/worker.rb +0 -71
- data/examples/basic.rb +0 -15
- data/examples/consistency.rb +0 -114
- data/examples/dist_redis.rb +0 -43
- data/examples/incr-decr.rb +0 -17
- data/examples/list.rb +0 -26
- data/examples/pubsub.rb +0 -37
- data/examples/sentinel/sentinel.conf +0 -9
- data/examples/sentinel/start +0 -49
- data/examples/sentinel.rb +0 -41
- data/examples/sets.rb +0 -36
- data/examples/unicorn/config.ru +0 -3
- data/examples/unicorn/unicorn.rb +0 -20
- data/redis.gemspec +0 -44
- data/test/bitpos_test.rb +0 -69
- data/test/blocking_commands_test.rb +0 -42
- data/test/client_test.rb +0 -59
- data/test/command_map_test.rb +0 -30
- data/test/commands_on_hashes_test.rb +0 -21
- data/test/commands_on_hyper_log_log_test.rb +0 -21
- data/test/commands_on_lists_test.rb +0 -20
- data/test/commands_on_sets_test.rb +0 -77
- data/test/commands_on_sorted_sets_test.rb +0 -137
- data/test/commands_on_strings_test.rb +0 -101
- data/test/commands_on_value_types_test.rb +0 -133
- data/test/connection_handling_test.rb +0 -277
- data/test/connection_test.rb +0 -57
- data/test/db/.gitkeep +0 -0
- data/test/distributed_blocking_commands_test.rb +0 -46
- data/test/distributed_commands_on_hashes_test.rb +0 -10
- data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
- data/test/distributed_commands_on_lists_test.rb +0 -22
- data/test/distributed_commands_on_sets_test.rb +0 -83
- data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
- data/test/distributed_commands_on_strings_test.rb +0 -59
- data/test/distributed_commands_on_value_types_test.rb +0 -95
- data/test/distributed_commands_requiring_clustering_test.rb +0 -164
- data/test/distributed_connection_handling_test.rb +0 -23
- data/test/distributed_internals_test.rb +0 -79
- data/test/distributed_key_tags_test.rb +0 -52
- data/test/distributed_persistence_control_commands_test.rb +0 -26
- data/test/distributed_publish_subscribe_test.rb +0 -92
- data/test/distributed_remote_server_control_commands_test.rb +0 -66
- data/test/distributed_scripting_test.rb +0 -102
- data/test/distributed_sorting_test.rb +0 -20
- data/test/distributed_test.rb +0 -58
- data/test/distributed_transactions_test.rb +0 -32
- data/test/encoding_test.rb +0 -18
- data/test/error_replies_test.rb +0 -59
- data/test/fork_safety_test.rb +0 -65
- data/test/helper.rb +0 -232
- data/test/helper_test.rb +0 -24
- data/test/internals_test.rb +0 -417
- data/test/lint/blocking_commands.rb +0 -150
- data/test/lint/hashes.rb +0 -162
- data/test/lint/hyper_log_log.rb +0 -60
- data/test/lint/lists.rb +0 -143
- data/test/lint/sets.rb +0 -140
- data/test/lint/sorted_sets.rb +0 -316
- data/test/lint/strings.rb +0 -260
- data/test/lint/value_types.rb +0 -122
- data/test/persistence_control_commands_test.rb +0 -26
- data/test/pipelining_commands_test.rb +0 -242
- data/test/publish_subscribe_test.rb +0 -282
- data/test/remote_server_control_commands_test.rb +0 -118
- data/test/scanning_test.rb +0 -413
- data/test/scripting_test.rb +0 -78
- data/test/sentinel_command_test.rb +0 -80
- data/test/sentinel_test.rb +0 -255
- data/test/sorting_test.rb +0 -59
- data/test/ssl_test.rb +0 -73
- data/test/support/connection/hiredis.rb +0 -1
- data/test/support/connection/ruby.rb +0 -1
- data/test/support/connection/synchrony.rb +0 -17
- data/test/support/redis_mock.rb +0 -130
- data/test/support/ssl/gen_certs.sh +0 -31
- data/test/support/ssl/trusted-ca.crt +0 -25
- data/test/support/ssl/trusted-ca.key +0 -27
- data/test/support/ssl/trusted-cert.crt +0 -81
- data/test/support/ssl/trusted-cert.key +0 -28
- data/test/support/ssl/untrusted-ca.crt +0 -26
- data/test/support/ssl/untrusted-ca.key +0 -27
- data/test/support/ssl/untrusted-cert.crt +0 -82
- data/test/support/ssl/untrusted-cert.key +0 -28
- data/test/support/wire/synchrony.rb +0 -24
- data/test/support/wire/thread.rb +0 -5
- data/test/synchrony_driver.rb +0 -88
- data/test/test.conf.erb +0 -9
- data/test/thread_safety_test.rb +0 -62
- data/test/transactions_test.rb +0 -264
- data/test/unknown_commands_test.rb +0 -14
- data/test/url_param_test.rb +0 -138
@@ -1,164 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedCommandsRequiringClustering < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_rename
|
10
|
-
r.set("{qux}foo", "s1")
|
11
|
-
r.rename "{qux}foo", "{qux}bar"
|
12
|
-
|
13
|
-
assert_equal "s1", r.get("{qux}bar")
|
14
|
-
assert_equal nil, r.get("{qux}foo")
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_renamenx
|
18
|
-
r.set("{qux}foo", "s1")
|
19
|
-
r.set("{qux}bar", "s2")
|
20
|
-
|
21
|
-
assert_equal false, r.renamenx("{qux}foo", "{qux}bar")
|
22
|
-
|
23
|
-
assert_equal "s1", r.get("{qux}foo")
|
24
|
-
assert_equal "s2", r.get("{qux}bar")
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_brpoplpush
|
28
|
-
r.rpush "{qux}foo", "s1"
|
29
|
-
r.rpush "{qux}foo", "s2"
|
30
|
-
|
31
|
-
assert_equal "s2", r.brpoplpush("{qux}foo", "{qux}bar", :timeout => 1)
|
32
|
-
assert_equal ["s2"], r.lrange("{qux}bar", 0, -1)
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_rpoplpush
|
36
|
-
r.rpush "{qux}foo", "s1"
|
37
|
-
r.rpush "{qux}foo", "s2"
|
38
|
-
|
39
|
-
assert_equal "s2", r.rpoplpush("{qux}foo", "{qux}bar")
|
40
|
-
assert_equal ["s2"], r.lrange("{qux}bar", 0, -1)
|
41
|
-
assert_equal "s1", r.rpoplpush("{qux}foo", "{qux}bar")
|
42
|
-
assert_equal ["s1", "s2"], r.lrange("{qux}bar", 0, -1)
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_smove
|
46
|
-
r.sadd "{qux}foo", "s1"
|
47
|
-
r.sadd "{qux}bar", "s2"
|
48
|
-
|
49
|
-
assert r.smove("{qux}foo", "{qux}bar", "s1")
|
50
|
-
assert r.sismember("{qux}bar", "s1")
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_sinter
|
54
|
-
r.sadd "{qux}foo", "s1"
|
55
|
-
r.sadd "{qux}foo", "s2"
|
56
|
-
r.sadd "{qux}bar", "s2"
|
57
|
-
|
58
|
-
assert_equal ["s2"], r.sinter("{qux}foo", "{qux}bar")
|
59
|
-
end
|
60
|
-
|
61
|
-
def test_sinterstore
|
62
|
-
r.sadd "{qux}foo", "s1"
|
63
|
-
r.sadd "{qux}foo", "s2"
|
64
|
-
r.sadd "{qux}bar", "s2"
|
65
|
-
|
66
|
-
r.sinterstore("{qux}baz", "{qux}foo", "{qux}bar")
|
67
|
-
|
68
|
-
assert_equal ["s2"], r.smembers("{qux}baz")
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_sunion
|
72
|
-
r.sadd "{qux}foo", "s1"
|
73
|
-
r.sadd "{qux}foo", "s2"
|
74
|
-
r.sadd "{qux}bar", "s2"
|
75
|
-
r.sadd "{qux}bar", "s3"
|
76
|
-
|
77
|
-
assert_equal ["s1", "s2", "s3"], r.sunion("{qux}foo", "{qux}bar").sort
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_sunionstore
|
81
|
-
r.sadd "{qux}foo", "s1"
|
82
|
-
r.sadd "{qux}foo", "s2"
|
83
|
-
r.sadd "{qux}bar", "s2"
|
84
|
-
r.sadd "{qux}bar", "s3"
|
85
|
-
|
86
|
-
r.sunionstore("{qux}baz", "{qux}foo", "{qux}bar")
|
87
|
-
|
88
|
-
assert_equal ["s1", "s2", "s3"], r.smembers("{qux}baz").sort
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_sdiff
|
92
|
-
r.sadd "{qux}foo", "s1"
|
93
|
-
r.sadd "{qux}foo", "s2"
|
94
|
-
r.sadd "{qux}bar", "s2"
|
95
|
-
r.sadd "{qux}bar", "s3"
|
96
|
-
|
97
|
-
assert_equal ["s1"], r.sdiff("{qux}foo", "{qux}bar")
|
98
|
-
assert_equal ["s3"], r.sdiff("{qux}bar", "{qux}foo")
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_sdiffstore
|
102
|
-
r.sadd "{qux}foo", "s1"
|
103
|
-
r.sadd "{qux}foo", "s2"
|
104
|
-
r.sadd "{qux}bar", "s2"
|
105
|
-
r.sadd "{qux}bar", "s3"
|
106
|
-
|
107
|
-
r.sdiffstore("{qux}baz", "{qux}foo", "{qux}bar")
|
108
|
-
|
109
|
-
assert_equal ["s1"], r.smembers("{qux}baz")
|
110
|
-
end
|
111
|
-
|
112
|
-
def test_sort
|
113
|
-
r.set("{qux}foo:1", "s1")
|
114
|
-
r.set("{qux}foo:2", "s2")
|
115
|
-
|
116
|
-
r.rpush("{qux}bar", "1")
|
117
|
-
r.rpush("{qux}bar", "2")
|
118
|
-
|
119
|
-
assert_equal ["s1"], r.sort("{qux}bar", :get => "{qux}foo:*", :limit => [0, 1])
|
120
|
-
assert_equal ["s2"], r.sort("{qux}bar", :get => "{qux}foo:*", :limit => [0, 1], :order => "desc alpha")
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_sort_with_an_array_of_gets
|
124
|
-
r.set("{qux}foo:1:a", "s1a")
|
125
|
-
r.set("{qux}foo:1:b", "s1b")
|
126
|
-
|
127
|
-
r.set("{qux}foo:2:a", "s2a")
|
128
|
-
r.set("{qux}foo:2:b", "s2b")
|
129
|
-
|
130
|
-
r.rpush("{qux}bar", "1")
|
131
|
-
r.rpush("{qux}bar", "2")
|
132
|
-
|
133
|
-
assert_equal [["s1a", "s1b"]], r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"], :limit => [0, 1])
|
134
|
-
assert_equal [["s2a", "s2b"]], r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"], :limit => [0, 1], :order => "desc alpha")
|
135
|
-
assert_equal [["s1a", "s1b"], ["s2a", "s2b"]], r.sort("{qux}bar", :get => ["{qux}foo:*:a", "{qux}foo:*:b"])
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_sort_with_store
|
139
|
-
r.set("{qux}foo:1", "s1")
|
140
|
-
r.set("{qux}foo:2", "s2")
|
141
|
-
|
142
|
-
r.rpush("{qux}bar", "1")
|
143
|
-
r.rpush("{qux}bar", "2")
|
144
|
-
|
145
|
-
r.sort("{qux}bar", :get => "{qux}foo:*", :store => "{qux}baz")
|
146
|
-
assert_equal ["s1", "s2"], r.lrange("{qux}baz", 0, -1)
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_bitop
|
150
|
-
target_version "2.5.10" do
|
151
|
-
r.set("{qux}foo", "a")
|
152
|
-
r.set("{qux}bar", "b")
|
153
|
-
|
154
|
-
r.bitop(:and, "{qux}foo&bar", "{qux}foo", "{qux}bar")
|
155
|
-
assert_equal "\x60", r.get("{qux}foo&bar")
|
156
|
-
r.bitop(:or, "{qux}foo|bar", "{qux}foo", "{qux}bar")
|
157
|
-
assert_equal "\x63", r.get("{qux}foo|bar")
|
158
|
-
r.bitop(:xor, "{qux}foo^bar", "{qux}foo", "{qux}bar")
|
159
|
-
assert_equal "\x03", r.get("{qux}foo^bar")
|
160
|
-
r.bitop(:not, "{qux}~foo", "{qux}foo")
|
161
|
-
assert_equal "\x9E", r.get("{qux}~foo")
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedConnectionHandling < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_ping
|
10
|
-
assert_equal ["PONG"], r.ping
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_select
|
14
|
-
r.set "foo", "bar"
|
15
|
-
|
16
|
-
r.select 14
|
17
|
-
assert_equal nil, r.get("foo")
|
18
|
-
|
19
|
-
r.select 15
|
20
|
-
|
21
|
-
assert_equal "bar", r.get("foo")
|
22
|
-
end
|
23
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedInternals < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_provides_a_meaningful_inspect
|
10
|
-
nodes = ["redis://localhost:#{PORT}/15", *NODES]
|
11
|
-
redis = Redis::Distributed.new nodes
|
12
|
-
|
13
|
-
assert_equal "#<Redis client v#{Redis::VERSION} for #{redis.nodes.map(&:id).join(', ')}>", redis.inspect
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_default_as_urls
|
17
|
-
nodes = ["redis://localhost:#{PORT}/15", *NODES]
|
18
|
-
redis = Redis::Distributed.new nodes
|
19
|
-
assert_equal ["redis://localhost:#{PORT}/15", *NODES], redis.nodes.map { |node| node.client.id}
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_default_as_config_hashes
|
23
|
-
nodes = [OPTIONS.merge(:host => '127.0.0.1'), OPTIONS.merge(:host => 'somehost', :port => PORT.next)]
|
24
|
-
redis = Redis::Distributed.new nodes
|
25
|
-
assert_equal ["redis://127.0.0.1:#{PORT}/15","redis://somehost:#{PORT.next}/15"], redis.nodes.map { |node| node.client.id }
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_as_mix_and_match
|
29
|
-
nodes = ["redis://127.0.0.1:7389/15", OPTIONS.merge(:host => 'somehost'), OPTIONS.merge(:host => 'somehost', :port => PORT.next)]
|
30
|
-
redis = Redis::Distributed.new nodes
|
31
|
-
assert_equal ["redis://127.0.0.1:7389/15", "redis://somehost:#{PORT}/15", "redis://somehost:#{PORT.next}/15"], redis.nodes.map { |node| node.client.id }
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_override_id
|
35
|
-
nodes = [OPTIONS.merge(:host => '127.0.0.1', :id => "test"), OPTIONS.merge( :host => 'somehost', :port => PORT.next, :id => "test1")]
|
36
|
-
redis = Redis::Distributed.new nodes
|
37
|
-
assert_equal redis.nodes.first.client.id, "test"
|
38
|
-
assert_equal redis.nodes.last.client.id, "test1"
|
39
|
-
assert_equal "#<Redis client v#{Redis::VERSION} for #{redis.nodes.map(&:id).join(', ')}>", redis.inspect
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_can_be_duped_to_create_a_new_connection
|
43
|
-
redis = Redis::Distributed.new(NODES)
|
44
|
-
|
45
|
-
clients = redis.info[0]["connected_clients"].to_i
|
46
|
-
|
47
|
-
r2 = redis.dup
|
48
|
-
r2.ping
|
49
|
-
|
50
|
-
assert_equal clients + 1, redis.info[0]["connected_clients"].to_i
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_keeps_options_after_dup
|
54
|
-
r1 = Redis::Distributed.new(NODES, :tag => /^(\w+):/)
|
55
|
-
|
56
|
-
assert_raise(Redis::Distributed::CannotDistribute) do
|
57
|
-
r1.sinter("foo", "bar")
|
58
|
-
end
|
59
|
-
|
60
|
-
assert_equal [], r1.sinter("baz:foo", "baz:bar")
|
61
|
-
|
62
|
-
r2 = r1.dup
|
63
|
-
|
64
|
-
assert_raise(Redis::Distributed::CannotDistribute) do
|
65
|
-
r2.sinter("foo", "bar")
|
66
|
-
end
|
67
|
-
|
68
|
-
assert_equal [], r2.sinter("baz:foo", "baz:bar")
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_colliding_node_ids
|
72
|
-
nodes = ["redis://localhost:#{PORT}/15", "redis://localhost:#{PORT}/15", *NODES]
|
73
|
-
|
74
|
-
assert_raise(RuntimeError) do
|
75
|
-
Redis::Distributed.new nodes
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedKeyTags < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper
|
8
|
-
include Helper::Distributed
|
9
|
-
|
10
|
-
def test_hashes_consistently
|
11
|
-
r1 = Redis::Distributed.new ["redis://localhost:#{PORT}/15", *NODES]
|
12
|
-
r2 = Redis::Distributed.new ["redis://localhost:#{PORT}/15", *NODES]
|
13
|
-
r3 = Redis::Distributed.new ["redis://localhost:#{PORT}/15", *NODES]
|
14
|
-
|
15
|
-
assert_equal r1.node_for("foo").id, r2.node_for("foo").id
|
16
|
-
assert_equal r1.node_for("foo").id, r3.node_for("foo").id
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_allows_clustering_of_keys
|
20
|
-
r = Redis::Distributed.new(NODES)
|
21
|
-
r.add_node("redis://127.0.0.1:#{PORT}/14")
|
22
|
-
r.flushdb
|
23
|
-
|
24
|
-
100.times do |i|
|
25
|
-
r.set "{foo}users:#{i}", i
|
26
|
-
end
|
27
|
-
|
28
|
-
assert_equal [0, 100], r.nodes.map { |node| node.keys.size }
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_distributes_keys_if_no_clustering_is_used
|
32
|
-
r.add_node("redis://127.0.0.1:#{PORT}/14")
|
33
|
-
r.flushdb
|
34
|
-
|
35
|
-
r.set "users:1", 1
|
36
|
-
r.set "users:4", 4
|
37
|
-
|
38
|
-
assert_equal [1, 1], r.nodes.map { |node| node.keys.size }
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_allows_passing_a_custom_tag_extractor
|
42
|
-
r = Redis::Distributed.new(NODES, :tag => /^(.+?):/)
|
43
|
-
r.add_node("redis://127.0.0.1:#{PORT}/14")
|
44
|
-
r.flushdb
|
45
|
-
|
46
|
-
100.times do |i|
|
47
|
-
r.set "foo:users:#{i}", i
|
48
|
-
end
|
49
|
-
|
50
|
-
assert_equal [0, 100], r.nodes.map { |node| node.keys.size }
|
51
|
-
end
|
52
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedPersistenceControlCommands < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_save
|
10
|
-
redis_mock(:save => lambda { "+SAVE" }) do |redis|
|
11
|
-
assert_equal ["SAVE"], redis.save
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_bgsave
|
16
|
-
redis_mock(:bgsave => lambda { "+BGSAVE" }) do |redis|
|
17
|
-
assert_equal ["BGSAVE"], redis.bgsave
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_lastsave
|
22
|
-
redis_mock(:lastsave => lambda { "+LASTSAVE" }) do |redis|
|
23
|
-
assert_equal ["LASTSAVE"], redis.lastsave
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedPublishSubscribe < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_subscribe_and_unsubscribe
|
10
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
11
|
-
r.subscribe("foo", "bar") { }
|
12
|
-
end
|
13
|
-
|
14
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
15
|
-
r.subscribe("{qux}foo", "bar") { }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_subscribe_and_unsubscribe_with_tags
|
20
|
-
@subscribed = false
|
21
|
-
@unsubscribed = false
|
22
|
-
|
23
|
-
wire = Wire.new do
|
24
|
-
r.subscribe("foo") do |on|
|
25
|
-
on.subscribe do |channel, total|
|
26
|
-
@subscribed = true
|
27
|
-
@t1 = total
|
28
|
-
end
|
29
|
-
|
30
|
-
on.message do |channel, message|
|
31
|
-
if message == "s1"
|
32
|
-
r.unsubscribe
|
33
|
-
@message = message
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
on.unsubscribe do |channel, total|
|
38
|
-
@unsubscribed = true
|
39
|
-
@t2 = total
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Wait until the subscription is active before publishing
|
45
|
-
Wire.pass while !@subscribed
|
46
|
-
|
47
|
-
Redis::Distributed.new(NODES).publish("foo", "s1")
|
48
|
-
|
49
|
-
wire.join
|
50
|
-
|
51
|
-
assert @subscribed
|
52
|
-
assert_equal 1, @t1
|
53
|
-
assert @unsubscribed
|
54
|
-
assert_equal 0, @t2
|
55
|
-
assert_equal "s1", @message
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_subscribe_within_subscribe
|
59
|
-
@channels = []
|
60
|
-
|
61
|
-
wire = Wire.new do
|
62
|
-
r.subscribe("foo") do |on|
|
63
|
-
on.subscribe do |channel, total|
|
64
|
-
@channels << channel
|
65
|
-
|
66
|
-
r.subscribe("bar") if channel == "foo"
|
67
|
-
r.unsubscribe if channel == "bar"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
wire.join
|
73
|
-
|
74
|
-
assert_equal ["foo", "bar"], @channels
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_other_commands_within_a_subscribe
|
78
|
-
assert_raise Redis::CommandError do
|
79
|
-
r.subscribe("foo") do |on|
|
80
|
-
on.subscribe do |channel, total|
|
81
|
-
r.set("bar", "s2")
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_subscribe_without_a_block
|
88
|
-
assert_raise LocalJumpError do
|
89
|
-
r.subscribe("foo")
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedRemoteServerControlCommands < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_info
|
10
|
-
keys = [
|
11
|
-
"redis_version",
|
12
|
-
"uptime_in_seconds",
|
13
|
-
"uptime_in_days",
|
14
|
-
"connected_clients",
|
15
|
-
"used_memory",
|
16
|
-
"total_connections_received",
|
17
|
-
"total_commands_processed",
|
18
|
-
]
|
19
|
-
|
20
|
-
infos = r.info
|
21
|
-
|
22
|
-
infos.each do |info|
|
23
|
-
keys.each do |k|
|
24
|
-
msg = "expected #info to include #{k}"
|
25
|
-
assert info.keys.include?(k), msg
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_info_commandstats
|
31
|
-
target_version "2.5.7" do
|
32
|
-
r.nodes.each { |n| n.config(:resetstat) }
|
33
|
-
r.ping # Executed on every node
|
34
|
-
|
35
|
-
r.info(:commandstats).each do |info|
|
36
|
-
assert_equal "1", info["ping"]["calls"]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_monitor
|
42
|
-
begin
|
43
|
-
r.monitor
|
44
|
-
rescue Exception => ex
|
45
|
-
ensure
|
46
|
-
assert ex.kind_of?(NotImplementedError)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_echo
|
51
|
-
assert_equal ["foo bar baz\n"], r.echo("foo bar baz\n")
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_time
|
55
|
-
target_version "2.5.4" do
|
56
|
-
# Test that the difference between the time that Ruby reports and the time
|
57
|
-
# that Redis reports is minimal (prevents the test from being racy).
|
58
|
-
r.time.each do |rv|
|
59
|
-
redis_usec = rv[0] * 1_000_000 + rv[1]
|
60
|
-
ruby_usec = Integer(Time.now.to_f * 1_000_000)
|
61
|
-
|
62
|
-
assert 500_000 > (ruby_usec - redis_usec).abs
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,102 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedScripting < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def to_sha(script)
|
10
|
-
r.script(:load, script).first
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_script_exists
|
14
|
-
target_version "2.5.9" do # 2.6-rc1
|
15
|
-
a = to_sha("return 1")
|
16
|
-
b = a.succ
|
17
|
-
|
18
|
-
assert_equal [true], r.script(:exists, a)
|
19
|
-
assert_equal [false], r.script(:exists, b)
|
20
|
-
assert_equal [[true]], r.script(:exists, [a])
|
21
|
-
assert_equal [[false]], r.script(:exists, [b])
|
22
|
-
assert_equal [[true, false]], r.script(:exists, [a, b])
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_script_flush
|
27
|
-
target_version "2.5.9" do # 2.6-rc1
|
28
|
-
sha = to_sha("return 1")
|
29
|
-
assert r.script(:exists, sha).first
|
30
|
-
assert_equal ["OK"], r.script(:flush)
|
31
|
-
assert !r.script(:exists, sha).first
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_script_kill
|
36
|
-
target_version "2.5.9" do # 2.6-rc1
|
37
|
-
redis_mock(:script => lambda { |arg| "+#{arg.upcase}" }) do |redis|
|
38
|
-
assert_equal ["KILL"], redis.script(:kill)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_eval
|
44
|
-
target_version "2.5.9" do # 2.6-rc1
|
45
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
46
|
-
r.eval("return #KEYS")
|
47
|
-
end
|
48
|
-
|
49
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
50
|
-
r.eval("return KEYS", ["k1", "k2"])
|
51
|
-
end
|
52
|
-
|
53
|
-
assert_equal ["k1"], r.eval("return KEYS", ["k1"])
|
54
|
-
assert_equal ["a1", "a2"], r.eval("return ARGV", ["k1"], ["a1", "a2"])
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_eval_with_options_hash
|
59
|
-
target_version "2.5.9" do # 2.6-rc1
|
60
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
61
|
-
r.eval("return #KEYS", {})
|
62
|
-
end
|
63
|
-
|
64
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
65
|
-
r.eval("return KEYS", { :keys => ["k1", "k2"] })
|
66
|
-
end
|
67
|
-
|
68
|
-
assert_equal ["k1"], r.eval("return KEYS", { :keys => ["k1"] })
|
69
|
-
assert_equal ["a1", "a2"], r.eval("return ARGV", { :keys => ["k1"], :argv => ["a1", "a2"] })
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_evalsha
|
74
|
-
target_version "2.5.9" do # 2.6-rc1
|
75
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
76
|
-
r.evalsha(to_sha("return #KEYS"))
|
77
|
-
end
|
78
|
-
|
79
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
80
|
-
r.evalsha(to_sha("return KEYS"), ["k1", "k2"])
|
81
|
-
end
|
82
|
-
|
83
|
-
assert_equal ["k1"], r.evalsha(to_sha("return KEYS"), ["k1"])
|
84
|
-
assert_equal ["a1", "a2"], r.evalsha(to_sha("return ARGV"), ["k1"], ["a1", "a2"])
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_evalsha_with_options_hash
|
89
|
-
target_version "2.5.9" do # 2.6-rc1
|
90
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
91
|
-
r.evalsha(to_sha("return #KEYS"), {})
|
92
|
-
end
|
93
|
-
|
94
|
-
assert_raises(Redis::Distributed::CannotDistribute) do
|
95
|
-
r.evalsha(to_sha("return KEYS"), { :keys => ["k1", "k2"] })
|
96
|
-
end
|
97
|
-
|
98
|
-
assert_equal ["k1"], r.evalsha(to_sha("return KEYS"), { :keys => ["k1"] })
|
99
|
-
assert_equal ["a1", "a2"], r.evalsha(to_sha("return ARGV"), { :keys => ["k1"], :argv => ["a1", "a2"] })
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributedSorting < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_sort
|
10
|
-
assert_raise(Redis::Distributed::CannotDistribute) do
|
11
|
-
r.set("foo:1", "s1")
|
12
|
-
r.set("foo:2", "s2")
|
13
|
-
|
14
|
-
r.rpush("bar", "1")
|
15
|
-
r.rpush("bar", "2")
|
16
|
-
|
17
|
-
r.sort("bar", :get => "foo:*", :limit => [0, 1])
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/test/distributed_test.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
|
-
require File.expand_path("helper", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
class TestDistributed < Test::Unit::TestCase
|
6
|
-
|
7
|
-
include Helper::Distributed
|
8
|
-
|
9
|
-
def test_handle_multiple_servers
|
10
|
-
@r = Redis::Distributed.new ["redis://localhost:#{PORT}/15", *NODES]
|
11
|
-
|
12
|
-
100.times do |idx|
|
13
|
-
@r.set(idx.to_s, "foo#{idx}")
|
14
|
-
end
|
15
|
-
|
16
|
-
100.times do |idx|
|
17
|
-
assert_equal "foo#{idx}", @r.get(idx.to_s)
|
18
|
-
end
|
19
|
-
|
20
|
-
assert_equal "0", @r.keys("*").sort.first
|
21
|
-
assert_equal "string", @r.type("1")
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_add_nodes
|
25
|
-
logger = Logger.new("/dev/null")
|
26
|
-
|
27
|
-
@r = Redis::Distributed.new NODES, :logger => logger, :timeout => 10
|
28
|
-
|
29
|
-
assert_equal "127.0.0.1", @r.nodes[0].client.host
|
30
|
-
assert_equal PORT, @r.nodes[0].client.port
|
31
|
-
assert_equal 15, @r.nodes[0].client.db
|
32
|
-
assert_equal 10, @r.nodes[0].client.timeout
|
33
|
-
assert_equal logger, @r.nodes[0].client.logger
|
34
|
-
|
35
|
-
@r.add_node("redis://127.0.0.1:6380/14")
|
36
|
-
|
37
|
-
assert_equal "127.0.0.1", @r.nodes[1].client.host
|
38
|
-
assert_equal 6380, @r.nodes[1].client.port
|
39
|
-
assert_equal 14, @r.nodes[1].client.db
|
40
|
-
assert_equal 10, @r.nodes[1].client.timeout
|
41
|
-
assert_equal logger, @r.nodes[1].client.logger
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_pipelining_commands_cannot_be_distributed
|
45
|
-
assert_raise Redis::Distributed::CannotDistribute do
|
46
|
-
r.pipelined do
|
47
|
-
r.lpush "foo", "s1"
|
48
|
-
r.lpush "foo", "s2"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_unknown_commands_does_not_work_by_default
|
54
|
-
assert_raise NoMethodError do
|
55
|
-
r.not_yet_implemented_command
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|