redis 3.3.5 → 4.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +236 -2
  3. data/README.md +169 -89
  4. data/lib/redis/client.rb +176 -108
  5. data/lib/redis/cluster/command.rb +79 -0
  6. data/lib/redis/cluster/command_loader.rb +33 -0
  7. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  8. data/lib/redis/cluster/node.rb +120 -0
  9. data/lib/redis/cluster/node_key.rb +31 -0
  10. data/lib/redis/cluster/node_loader.rb +34 -0
  11. data/lib/redis/cluster/option.rb +100 -0
  12. data/lib/redis/cluster/slot.rb +86 -0
  13. data/lib/redis/cluster/slot_loader.rb +46 -0
  14. data/lib/redis/cluster.rb +315 -0
  15. data/lib/redis/commands/bitmaps.rb +63 -0
  16. data/lib/redis/commands/cluster.rb +45 -0
  17. data/lib/redis/commands/connection.rb +58 -0
  18. data/lib/redis/commands/geo.rb +84 -0
  19. data/lib/redis/commands/hashes.rb +251 -0
  20. data/lib/redis/commands/hyper_log_log.rb +37 -0
  21. data/lib/redis/commands/keys.rb +455 -0
  22. data/lib/redis/commands/lists.rb +290 -0
  23. data/lib/redis/commands/pubsub.rb +72 -0
  24. data/lib/redis/commands/scripting.rb +114 -0
  25. data/lib/redis/commands/server.rb +188 -0
  26. data/lib/redis/commands/sets.rb +223 -0
  27. data/lib/redis/commands/sorted_sets.rb +812 -0
  28. data/lib/redis/commands/streams.rb +382 -0
  29. data/lib/redis/commands/strings.rb +313 -0
  30. data/lib/redis/commands/transactions.rb +139 -0
  31. data/lib/redis/commands.rb +240 -0
  32. data/lib/redis/connection/command_helper.rb +7 -10
  33. data/lib/redis/connection/hiredis.rb +5 -3
  34. data/lib/redis/connection/registry.rb +2 -1
  35. data/lib/redis/connection/ruby.rb +136 -128
  36. data/lib/redis/connection/synchrony.rb +24 -9
  37. data/lib/redis/connection.rb +3 -1
  38. data/lib/redis/distributed.rb +255 -85
  39. data/lib/redis/errors.rb +57 -0
  40. data/lib/redis/hash_ring.rb +30 -73
  41. data/lib/redis/pipeline.rb +178 -13
  42. data/lib/redis/subscribe.rb +11 -12
  43. data/lib/redis/version.rb +3 -1
  44. data/lib/redis.rb +174 -2661
  45. metadata +66 -202
  46. data/.gitignore +0 -16
  47. data/.travis/Gemfile +0 -11
  48. data/.travis.yml +0 -89
  49. data/.yardopts +0 -3
  50. data/Gemfile +0 -4
  51. data/Rakefile +0 -87
  52. data/benchmarking/logging.rb +0 -71
  53. data/benchmarking/pipeline.rb +0 -51
  54. data/benchmarking/speed.rb +0 -21
  55. data/benchmarking/suite.rb +0 -24
  56. data/benchmarking/worker.rb +0 -71
  57. data/examples/basic.rb +0 -15
  58. data/examples/consistency.rb +0 -114
  59. data/examples/dist_redis.rb +0 -43
  60. data/examples/incr-decr.rb +0 -17
  61. data/examples/list.rb +0 -26
  62. data/examples/pubsub.rb +0 -37
  63. data/examples/sentinel/sentinel.conf +0 -9
  64. data/examples/sentinel/start +0 -49
  65. data/examples/sentinel.rb +0 -41
  66. data/examples/sets.rb +0 -36
  67. data/examples/unicorn/config.ru +0 -3
  68. data/examples/unicorn/unicorn.rb +0 -20
  69. data/redis.gemspec +0 -44
  70. data/test/bitpos_test.rb +0 -69
  71. data/test/blocking_commands_test.rb +0 -42
  72. data/test/client_test.rb +0 -59
  73. data/test/command_map_test.rb +0 -30
  74. data/test/commands_on_hashes_test.rb +0 -21
  75. data/test/commands_on_hyper_log_log_test.rb +0 -21
  76. data/test/commands_on_lists_test.rb +0 -20
  77. data/test/commands_on_sets_test.rb +0 -77
  78. data/test/commands_on_sorted_sets_test.rb +0 -137
  79. data/test/commands_on_strings_test.rb +0 -101
  80. data/test/commands_on_value_types_test.rb +0 -133
  81. data/test/connection_handling_test.rb +0 -277
  82. data/test/connection_test.rb +0 -57
  83. data/test/db/.gitkeep +0 -0
  84. data/test/distributed_blocking_commands_test.rb +0 -46
  85. data/test/distributed_commands_on_hashes_test.rb +0 -10
  86. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  87. data/test/distributed_commands_on_lists_test.rb +0 -22
  88. data/test/distributed_commands_on_sets_test.rb +0 -83
  89. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  90. data/test/distributed_commands_on_strings_test.rb +0 -59
  91. data/test/distributed_commands_on_value_types_test.rb +0 -95
  92. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  93. data/test/distributed_connection_handling_test.rb +0 -23
  94. data/test/distributed_internals_test.rb +0 -79
  95. data/test/distributed_key_tags_test.rb +0 -52
  96. data/test/distributed_persistence_control_commands_test.rb +0 -26
  97. data/test/distributed_publish_subscribe_test.rb +0 -92
  98. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  99. data/test/distributed_scripting_test.rb +0 -102
  100. data/test/distributed_sorting_test.rb +0 -20
  101. data/test/distributed_test.rb +0 -58
  102. data/test/distributed_transactions_test.rb +0 -32
  103. data/test/encoding_test.rb +0 -18
  104. data/test/error_replies_test.rb +0 -59
  105. data/test/fork_safety_test.rb +0 -65
  106. data/test/helper.rb +0 -232
  107. data/test/helper_test.rb +0 -24
  108. data/test/internals_test.rb +0 -417
  109. data/test/lint/blocking_commands.rb +0 -150
  110. data/test/lint/hashes.rb +0 -162
  111. data/test/lint/hyper_log_log.rb +0 -60
  112. data/test/lint/lists.rb +0 -143
  113. data/test/lint/sets.rb +0 -140
  114. data/test/lint/sorted_sets.rb +0 -316
  115. data/test/lint/strings.rb +0 -260
  116. data/test/lint/value_types.rb +0 -122
  117. data/test/persistence_control_commands_test.rb +0 -26
  118. data/test/pipelining_commands_test.rb +0 -242
  119. data/test/publish_subscribe_test.rb +0 -282
  120. data/test/remote_server_control_commands_test.rb +0 -118
  121. data/test/scanning_test.rb +0 -413
  122. data/test/scripting_test.rb +0 -78
  123. data/test/sentinel_command_test.rb +0 -80
  124. data/test/sentinel_test.rb +0 -255
  125. data/test/sorting_test.rb +0 -59
  126. data/test/ssl_test.rb +0 -73
  127. data/test/support/connection/hiredis.rb +0 -1
  128. data/test/support/connection/ruby.rb +0 -1
  129. data/test/support/connection/synchrony.rb +0 -17
  130. data/test/support/redis_mock.rb +0 -130
  131. data/test/support/ssl/gen_certs.sh +0 -31
  132. data/test/support/ssl/trusted-ca.crt +0 -25
  133. data/test/support/ssl/trusted-ca.key +0 -27
  134. data/test/support/ssl/trusted-cert.crt +0 -81
  135. data/test/support/ssl/trusted-cert.key +0 -28
  136. data/test/support/ssl/untrusted-ca.crt +0 -26
  137. data/test/support/ssl/untrusted-ca.key +0 -27
  138. data/test/support/ssl/untrusted-cert.crt +0 -82
  139. data/test/support/ssl/untrusted-cert.key +0 -28
  140. data/test/support/wire/synchrony.rb +0 -24
  141. data/test/support/wire/thread.rb +0 -5
  142. data/test/synchrony_driver.rb +0 -88
  143. data/test/test.conf.erb +0 -9
  144. data/test/thread_safety_test.rb +0 -62
  145. data/test/transactions_test.rb +0 -264
  146. data/test/unknown_commands_test.rb +0 -14
  147. data/test/url_param_test.rb +0 -138
@@ -1,264 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestTransactions < Test::Unit::TestCase
6
-
7
- include Helper::Client
8
-
9
- def test_multi_discard
10
- r.multi
11
-
12
- assert_equal "QUEUED", r.set("foo", "1")
13
- assert_equal "QUEUED", r.get("foo")
14
-
15
- r.discard
16
-
17
- assert_equal nil, r.get("foo")
18
- end
19
-
20
- def test_multi_exec_with_a_block
21
- r.multi do |multi|
22
- multi.set "foo", "s1"
23
- end
24
-
25
- assert_equal "s1", r.get("foo")
26
- end
27
-
28
- def test_multi_exec_with_a_block_doesn_t_return_replies_for_multi_and_exec
29
- r1, r2, nothing_else = r.multi do |multi|
30
- multi.set "foo", "s1"
31
- multi.get "foo"
32
- end
33
-
34
- assert_equal "OK", r1
35
- assert_equal "s1", r2
36
- assert_equal nil, nothing_else
37
- end
38
-
39
- def test_assignment_inside_multi_exec_block
40
- r.multi do |m|
41
- @first = m.sadd("foo", 1)
42
- @second = m.sadd("foo", 1)
43
- end
44
-
45
- assert_equal true, @first.value
46
- assert_equal false, @second.value
47
- end
48
-
49
- # Although we could support accessing the values in these futures,
50
- # it doesn't make a lot of sense.
51
- def test_assignment_inside_multi_exec_block_with_delayed_command_errors
52
- assert_raise(Redis::CommandError) do
53
- r.multi do |m|
54
- @first = m.set("foo", "s1")
55
- @second = m.incr("foo") # not an integer
56
- @third = m.lpush("foo", "value") # wrong kind of value
57
- end
58
- end
59
-
60
- assert_equal "OK", @first.value
61
- assert_raise(Redis::CommandError) { @second.value }
62
- assert_raise(Redis::FutureNotReady) { @third.value }
63
- end
64
-
65
- def test_assignment_inside_multi_exec_block_with_immediate_command_errors
66
- assert_raise(Redis::CommandError) do
67
- r.multi do |m|
68
- m.doesnt_exist
69
- @first = m.sadd("foo", 1)
70
- @second = m.sadd("foo", 1)
71
- end
72
- end
73
-
74
- assert_raise(Redis::FutureNotReady) { @first.value }
75
- assert_raise(Redis::FutureNotReady) { @second.value }
76
- end
77
-
78
- def test_raise_immediate_errors_in_multi_exec
79
- assert_raise(RuntimeError) do
80
- r.multi do |multi|
81
- multi.set "bar", "s2"
82
- raise "Some error"
83
- multi.set "baz", "s3"
84
- end
85
- end
86
-
87
- assert_equal nil, r.get("bar")
88
- assert_equal nil, r.get("baz")
89
- end
90
-
91
- def test_transformed_replies_as_return_values_for_multi_exec_block
92
- info, _ = r.multi do |m|
93
- r.info
94
- end
95
-
96
- assert info.kind_of?(Hash)
97
- end
98
-
99
- def test_transformed_replies_inside_multi_exec_block
100
- r.multi do |m|
101
- @info = r.info
102
- end
103
-
104
- assert @info.value.kind_of?(Hash)
105
- end
106
-
107
- def test_raise_command_errors_in_multi_exec
108
- assert_raise(Redis::CommandError) do
109
- r.multi do |m|
110
- m.set("foo", "s1")
111
- m.incr("foo") # not an integer
112
- m.lpush("foo", "value") # wrong kind of value
113
- end
114
- end
115
-
116
- assert_equal "s1", r.get("foo")
117
- end
118
-
119
- def test_raise_command_errors_when_accessing_futures_after_multi_exec
120
- begin
121
- r.multi do |m|
122
- m.set("foo", "s1")
123
- @counter = m.incr("foo") # not an integer
124
- end
125
- rescue Exception
126
- # Not gonna deal with it
127
- end
128
-
129
- # We should test for Redis::Error here, but hiredis doesn't yet do
130
- # custom error classes.
131
- err = nil
132
- begin
133
- @counter.value
134
- rescue => err
135
- end
136
-
137
- assert err.kind_of?(RuntimeError)
138
- end
139
-
140
- def test_multi_with_a_block_yielding_the_client
141
- r.multi do |multi|
142
- multi.set "foo", "s1"
143
- end
144
-
145
- assert_equal "s1", r.get("foo")
146
- end
147
-
148
- def test_raise_command_error_when_exec_fails
149
- redis_mock(:exec => lambda { |*_| "-ERROR" }) do |redis|
150
- assert_raise(Redis::CommandError) do
151
- redis.multi do |m|
152
- m.set "foo", "s1"
153
- end
154
- end
155
- end
156
- end
157
-
158
- def test_watch
159
- res = r.watch "foo"
160
-
161
- assert_equal "OK", res
162
- end
163
-
164
- def test_watch_with_an_unmodified_key
165
- r.watch "foo"
166
- r.multi do |multi|
167
- multi.set "foo", "s1"
168
- end
169
-
170
- assert_equal "s1", r.get("foo")
171
- end
172
-
173
- def test_watch_with_an_unmodified_key_passed_as_array
174
- r.watch ["foo", "bar"]
175
- r.multi do |multi|
176
- multi.set "foo", "s1"
177
- end
178
-
179
- assert_equal "s1", r.get("foo")
180
- end
181
-
182
- def test_watch_with_a_modified_key
183
- r.watch "foo"
184
- r.set "foo", "s1"
185
- res = r.multi do |multi|
186
- multi.set "foo", "s2"
187
- end
188
-
189
- assert_equal nil, res
190
- assert_equal "s1", r.get("foo")
191
- end
192
-
193
- def test_watch_with_a_modified_key_passed_as_array
194
- r.watch ["foo", "bar"]
195
- r.set "foo", "s1"
196
- res = r.multi do |multi|
197
- multi.set "foo", "s2"
198
- end
199
-
200
- assert_equal nil, res
201
- assert_equal "s1", r.get("foo")
202
- end
203
-
204
- def test_watch_with_a_block_and_an_unmodified_key
205
- result = r.watch "foo" do |rd|
206
-
207
- assert_same r, rd
208
-
209
- rd.multi do |multi|
210
- multi.set "foo", "s1"
211
- end
212
- end
213
-
214
- assert_equal ["OK"], result
215
- assert_equal "s1", r.get("foo")
216
- end
217
-
218
- def test_watch_with_a_block_and_a_modified_key
219
- result = r.watch "foo" do |rd|
220
-
221
- assert_same r, rd
222
-
223
- rd.set "foo", "s1"
224
- rd.multi do |multi|
225
- multi.set "foo", "s2"
226
- end
227
- end
228
-
229
- assert_equal nil, result
230
- assert_equal "s1", r.get("foo")
231
- end
232
-
233
- def test_watch_with_a_block_that_raises_an_exception
234
- r.set("foo", "s1")
235
-
236
- begin
237
- r.watch "foo" do
238
- raise "test"
239
- end
240
- rescue RuntimeError
241
- end
242
-
243
- r.set("foo", "s2")
244
-
245
- # If the watch was still set from within the block above, this multi/exec
246
- # would fail. This proves that raising an exception above unwatches.
247
- r.multi do |multi|
248
- multi.set "foo", "s3"
249
- end
250
-
251
- assert_equal "s3", r.get("foo")
252
- end
253
-
254
- def test_unwatch_with_a_modified_key
255
- r.watch "foo"
256
- r.set "foo", "s1"
257
- r.unwatch
258
- r.multi do |multi|
259
- multi.set "foo", "s2"
260
- end
261
-
262
- assert_equal "s2", r.get("foo")
263
- end
264
- end
@@ -1,14 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestUnknownCommands < Test::Unit::TestCase
6
-
7
- include Helper::Client
8
-
9
- def test_should_try_to_work
10
- assert_raise Redis::CommandError do
11
- r.not_yet_implemented_command
12
- end
13
- end
14
- end
@@ -1,138 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require File.expand_path("helper", File.dirname(__FILE__))
4
-
5
- class TestUrlParam < Test::Unit::TestCase
6
-
7
- include Helper::Client
8
-
9
- def test_url_defaults_to_______________
10
- redis = Redis.new
11
-
12
- assert_equal "127.0.0.1", redis.client.host
13
- assert_equal 6379, redis.client.port
14
- assert_equal 0, redis.client.db
15
- assert_equal nil, redis.client.password
16
- end
17
-
18
- def test_allows_to_pass_in_a_url
19
- redis = Redis.new :url => "redis://:secr3t@foo.com:999/2"
20
-
21
- assert_equal "foo.com", redis.client.host
22
- assert_equal 999, redis.client.port
23
- assert_equal 2, redis.client.db
24
- assert_equal "secr3t", redis.client.password
25
- end
26
-
27
- def test_allows_to_pass_in_a_url_with_string_key
28
- redis = Redis.new "url" => "redis://:secr3t@foo.com:999/2"
29
-
30
- assert_equal "foo.com", redis.client.host
31
- assert_equal 999, redis.client.port
32
- assert_equal 2, redis.client.db
33
- assert_equal "secr3t", redis.client.password
34
- end
35
-
36
- def test_unescape_password_from_url
37
- redis = Redis.new :url => "redis://:secr3t%3A@foo.com:999/2"
38
-
39
- assert_equal "secr3t:", redis.client.password
40
- end
41
-
42
- def test_unescape_password_from_url_with_string_key
43
- redis = Redis.new "url" => "redis://:secr3t%3A@foo.com:999/2"
44
-
45
- assert_equal "secr3t:", redis.client.password
46
- end
47
-
48
- def test_does_not_unescape_password_when_explicitly_passed
49
- redis = Redis.new :url => "redis://:secr3t%3A@foo.com:999/2", :password => "secr3t%3A"
50
-
51
- assert_equal "secr3t%3A", redis.client.password
52
- end
53
-
54
- def test_does_not_unescape_password_when_explicitly_passed_with_string_key
55
- redis = Redis.new :url => "redis://:secr3t%3A@foo.com:999/2", "password" => "secr3t%3A"
56
-
57
- assert_equal "secr3t%3A", redis.client.password
58
- end
59
-
60
- def test_override_url_if_path_option_is_passed
61
- redis = Redis.new :url => "redis://:secr3t@foo.com/foo:999/2", :path => "/tmp/redis.sock"
62
-
63
- assert_equal "/tmp/redis.sock", redis.client.path
64
- assert_equal nil, redis.client.host
65
- assert_equal nil, redis.client.port
66
- end
67
-
68
- def test_override_url_if_path_option_is_passed_with_string_key
69
- redis = Redis.new :url => "redis://:secr3t@foo.com/foo:999/2", "path" => "/tmp/redis.sock"
70
-
71
- assert_equal "/tmp/redis.sock", redis.client.path
72
- assert_equal nil, redis.client.host
73
- assert_equal nil, redis.client.port
74
- end
75
-
76
- def test_overrides_url_if_another_connection_option_is_passed
77
- redis = Redis.new :url => "redis://:secr3t@foo.com:999/2", :port => 1000
78
-
79
- assert_equal "foo.com", redis.client.host
80
- assert_equal 1000, redis.client.port
81
- assert_equal 2, redis.client.db
82
- assert_equal "secr3t", redis.client.password
83
- end
84
-
85
- def test_overrides_url_if_another_connection_option_is_passed_with_string_key
86
- redis = Redis.new :url => "redis://:secr3t@foo.com:999/2", "port" => 1000
87
-
88
- assert_equal "foo.com", redis.client.host
89
- assert_equal 1000, redis.client.port
90
- assert_equal 2, redis.client.db
91
- assert_equal "secr3t", redis.client.password
92
- end
93
-
94
- def test_does_not_overrides_url_if_a_nil_option_is_passed
95
- redis = Redis.new :url => "redis://:secr3t@foo.com:999/2", :port => nil
96
-
97
- assert_equal "foo.com", redis.client.host
98
- assert_equal 999, redis.client.port
99
- assert_equal 2, redis.client.db
100
- assert_equal "secr3t", redis.client.password
101
- end
102
-
103
- def test_does_not_overrides_url_if_a_nil_option_is_passed_with_string_key
104
- redis = Redis.new :url => "redis://:secr3t@foo.com:999/2", "port" => nil
105
-
106
- assert_equal "foo.com", redis.client.host
107
- assert_equal 999, redis.client.port
108
- assert_equal 2, redis.client.db
109
- assert_equal "secr3t", redis.client.password
110
- end
111
-
112
- def test_does_not_modify_the_passed_options
113
- options = { :url => "redis://:secr3t@foo.com:999/2" }
114
-
115
- Redis.new(options)
116
-
117
- assert({ :url => "redis://:secr3t@foo.com:999/2" } == options)
118
- end
119
-
120
- def test_uses_redis_url_over_default_if_available
121
- ENV["REDIS_URL"] = "redis://:secr3t@foo.com:999/2"
122
-
123
- redis = Redis.new
124
-
125
- assert_equal "foo.com", redis.client.host
126
- assert_equal 999, redis.client.port
127
- assert_equal 2, redis.client.db
128
- assert_equal "secr3t", redis.client.password
129
-
130
- ENV.delete("REDIS_URL")
131
- end
132
-
133
- def test_defaults_to_localhost
134
- redis = Redis.new(:url => "redis:///")
135
-
136
- assert_equal "127.0.0.1", redis.client.host
137
- end
138
- end