redis 4.0.0 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -1
- data/README.md +1 -1
- data/lib/redis.rb +26 -4
- data/lib/redis/distributed.rb +16 -3
- data/lib/redis/version.rb +1 -1
- data/test/commands_on_value_types_test.rb +40 -0
- data/test/connection_test.rb +57 -0
- data/test/distributed_commands_on_sets_test.rb +25 -0
- data/test/distributed_commands_on_strings_test.rb +18 -6
- data/test/internals_test.rb +0 -40
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e0d0ba2328aca583c0f487729779c2b10b12c7b
|
4
|
+
data.tar.gz: 4a411cfa3512bafe7c2c12ac8a02c02bc87065aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3af7dc63dc7bdc243da306817583db9b6989c21a0714c6652b4a443bfd9c46b2afba0707b028d708a74148bbeedd09d4ec207a0459b3559cb19b95f2f030bb07
|
7
|
+
data.tar.gz: 98d5aed456ebcd3ccdc50980879a3c14be4c8a1874c6febae95579d2fb3828bda2e82b05e62dc6a4966e178993d4a2a20dc3dedd9f8583cd731851eab2f8e164
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,16 @@
|
|
1
|
-
# 4.0
|
1
|
+
# 4.0.1
|
2
|
+
|
3
|
+
* `Redis::Distributed` now supports `mget` and `mapped_mget`. See #687.
|
4
|
+
|
5
|
+
* `Redis::Distributed` now supports `sscan` and `sscan_each`. See #572.
|
6
|
+
|
7
|
+
* `Redis#connection` returns a hash with connection information.
|
8
|
+
You shouldn't need to call `Redis#_client`, ever.
|
9
|
+
|
10
|
+
* `Redis#flushdb` and `Redis#flushall` now support the `:async` option. See #706.
|
11
|
+
|
12
|
+
|
13
|
+
# 4.0
|
2
14
|
|
3
15
|
* Removed `Redis.connect`. Use `Redis.new`.
|
4
16
|
|
data/README.md
CHANGED
@@ -363,4 +363,4 @@ requests. You can also ask for help at `#redis-rb` on Freenode.
|
|
363
363
|
[travis-home]: https://travis-ci.org/
|
364
364
|
[travis-image]: https://secure.travis-ci.org/redis/redis-rb.svg?branch=master
|
365
365
|
[travis-link]: https://travis-ci.org/redis/redis-rb
|
366
|
-
[rubydoc]:
|
366
|
+
[rubydoc]: http://www.rubydoc.info/gems/redis
|
data/lib/redis.rb
CHANGED
@@ -237,19 +237,31 @@ class Redis
|
|
237
237
|
|
238
238
|
# Remove all keys from all databases.
|
239
239
|
#
|
240
|
+
# @param [Hash] options
|
241
|
+
# - `:async => Boolean`: async flush (default: false)
|
240
242
|
# @return [String] `OK`
|
241
|
-
def flushall
|
243
|
+
def flushall(options = nil)
|
242
244
|
synchronize do |client|
|
243
|
-
|
245
|
+
if options && options[:async]
|
246
|
+
client.call([:flushall, :async])
|
247
|
+
else
|
248
|
+
client.call([:flushall])
|
249
|
+
end
|
244
250
|
end
|
245
251
|
end
|
246
252
|
|
247
253
|
# Remove all keys from the current database.
|
248
254
|
#
|
255
|
+
# @param [Hash] options
|
256
|
+
# - `:async => Boolean`: async flush (default: false)
|
249
257
|
# @return [String] `OK`
|
250
|
-
def flushdb
|
258
|
+
def flushdb(options = nil)
|
251
259
|
synchronize do |client|
|
252
|
-
|
260
|
+
if options && options[:async]
|
261
|
+
client.call([:flushdb, :async])
|
262
|
+
else
|
263
|
+
client.call([:flushdb])
|
264
|
+
end
|
253
265
|
end
|
254
266
|
end
|
255
267
|
|
@@ -2737,6 +2749,16 @@ class Redis
|
|
2737
2749
|
self.class.new(@options)
|
2738
2750
|
end
|
2739
2751
|
|
2752
|
+
def connection
|
2753
|
+
{
|
2754
|
+
host: @original_client.host,
|
2755
|
+
port: @original_client.port,
|
2756
|
+
db: @original_client.db,
|
2757
|
+
id: @original_client.id,
|
2758
|
+
location: @original_client.location
|
2759
|
+
}
|
2760
|
+
end
|
2761
|
+
|
2740
2762
|
def method_missing(command, *args)
|
2741
2763
|
synchronize do |client|
|
2742
2764
|
client.call([command] + args)
|
data/lib/redis/distributed.rb
CHANGED
@@ -277,13 +277,16 @@ class Redis
|
|
277
277
|
node_for(key).get(key)
|
278
278
|
end
|
279
279
|
|
280
|
-
# Get the values of all the given keys.
|
280
|
+
# Get the values of all the given keys as an Array.
|
281
281
|
def mget(*keys)
|
282
|
-
|
282
|
+
mapped_mget(*keys).values_at(*keys)
|
283
283
|
end
|
284
284
|
|
285
|
+
# Get the values of all the given keys as a Hash.
|
285
286
|
def mapped_mget(*keys)
|
286
|
-
|
287
|
+
keys.group_by { |k| node_for k }.inject({}) do |results, (node, subkeys)|
|
288
|
+
results.merge! node.mapped_mget(*subkeys)
|
289
|
+
end
|
287
290
|
end
|
288
291
|
|
289
292
|
# Overwrite part of a string at key starting at the specified offset.
|
@@ -509,6 +512,16 @@ class Redis
|
|
509
512
|
node_for(key).smembers(key)
|
510
513
|
end
|
511
514
|
|
515
|
+
# Scan a set
|
516
|
+
def sscan(key, cursor, options={})
|
517
|
+
node_for(key).sscan(key, cursor, options)
|
518
|
+
end
|
519
|
+
|
520
|
+
# Scan a set and return an enumerator
|
521
|
+
def sscan_each(key, options={}, &block)
|
522
|
+
node_for(key).sscan_each(key, options, &block)
|
523
|
+
end
|
524
|
+
|
512
525
|
# Subtract multiple sets.
|
513
526
|
def sdiff(*keys)
|
514
527
|
ensure_same_node(:sdiff, keys) do |node|
|
data/lib/redis/version.rb
CHANGED
@@ -79,6 +79,7 @@ class TestCommandsOnValueTypes < Test::Unit::TestCase
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def test_flushdb
|
82
|
+
# Test defaults
|
82
83
|
r.set("foo", "s1")
|
83
84
|
r.set("bar", "s2")
|
84
85
|
|
@@ -87,12 +88,51 @@ class TestCommandsOnValueTypes < Test::Unit::TestCase
|
|
87
88
|
r.flushdb
|
88
89
|
|
89
90
|
assert_equal 0, r.dbsize
|
91
|
+
|
92
|
+
# Test sync
|
93
|
+
r.set("foo", "s1")
|
94
|
+
r.set("bar", "s2")
|
95
|
+
|
96
|
+
assert_equal 2, r.dbsize
|
97
|
+
|
98
|
+
r.flushdb(:async => false)
|
99
|
+
|
100
|
+
assert_equal 0, r.dbsize
|
101
|
+
|
102
|
+
# Test async
|
103
|
+
target_version "3.9.101" do
|
104
|
+
r.set("foo", "s1")
|
105
|
+
r.set("bar", "s2")
|
106
|
+
|
107
|
+
assert_equal 2, r.dbsize
|
108
|
+
|
109
|
+
r.flushdb(:async => true)
|
110
|
+
|
111
|
+
assert_equal 0, r.dbsize
|
112
|
+
|
113
|
+
redis_mock(:flushdb => lambda { |args| "+FLUSHDB #{args.upcase}" }) do |redis|
|
114
|
+
assert_equal "FLUSHDB ASYNC", redis.flushdb(:async => true)
|
115
|
+
end
|
116
|
+
end
|
90
117
|
end
|
91
118
|
|
92
119
|
def test_flushall
|
120
|
+
# Test defaults
|
93
121
|
redis_mock(:flushall => lambda { "+FLUSHALL" }) do |redis|
|
94
122
|
assert_equal "FLUSHALL", redis.flushall
|
95
123
|
end
|
124
|
+
|
125
|
+
# Test sync
|
126
|
+
redis_mock(:flushall => lambda { "+FLUSHALL" }) do |redis|
|
127
|
+
assert_equal "FLUSHALL", redis.flushall(:async => false)
|
128
|
+
end
|
129
|
+
|
130
|
+
# Test async
|
131
|
+
target_version "3.9.101" do
|
132
|
+
redis_mock(:flushall => lambda { |args| "+FLUSHALL #{args.upcase}" }) do |redis|
|
133
|
+
assert_equal "FLUSHALL ASYNC", redis.flushall(:async => true)
|
134
|
+
end
|
135
|
+
end
|
96
136
|
end
|
97
137
|
|
98
138
|
def test_migrate
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative "helper"
|
2
|
+
|
3
|
+
class TestConnection < Test::Unit::TestCase
|
4
|
+
|
5
|
+
include Helper::Client
|
6
|
+
|
7
|
+
def test_provides_a_meaningful_inspect
|
8
|
+
assert_equal "#<Redis client v#{Redis::VERSION} for redis://127.0.0.1:#{PORT}/15>", r.inspect
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_connection_information
|
12
|
+
assert_equal "127.0.0.1", r.connection.fetch(:host)
|
13
|
+
assert_equal 6381, r.connection.fetch(:port)
|
14
|
+
assert_equal 15, r.connection.fetch(:db)
|
15
|
+
assert_equal "127.0.0.1:6381", r.connection.fetch(:location)
|
16
|
+
assert_equal "redis://127.0.0.1:6381/15", r.connection.fetch(:id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_default_id_with_host_and_port
|
20
|
+
redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0))
|
21
|
+
assert_equal "redis://host:1234/0", redis.connection.fetch(:id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_default_id_with_host_and_port_and_explicit_scheme
|
25
|
+
redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0, :scheme => "foo"))
|
26
|
+
assert_equal "redis://host:1234/0", redis.connection.fetch(:id)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_default_id_with_path
|
30
|
+
redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0))
|
31
|
+
assert_equal "redis:///tmp/redis.sock/0", redis.connection.fetch(:id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_default_id_with_path_and_explicit_scheme
|
35
|
+
redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0, :scheme => "foo"))
|
36
|
+
assert_equal "redis:///tmp/redis.sock/0", redis.connection.fetch(:id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_override_id
|
40
|
+
redis = Redis.new(OPTIONS.merge(:id => "test"))
|
41
|
+
assert_equal "test", redis.connection.fetch(:id)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_id_inside_multi
|
45
|
+
redis = Redis.new(OPTIONS)
|
46
|
+
id = nil
|
47
|
+
connection_id = nil
|
48
|
+
|
49
|
+
redis.multi do
|
50
|
+
id = redis.id
|
51
|
+
connection_id = redis.connection.fetch(:id)
|
52
|
+
end
|
53
|
+
|
54
|
+
assert_equal "redis://127.0.0.1:6381/15", id
|
55
|
+
assert_equal "redis://127.0.0.1:6381/15", connection_id
|
56
|
+
end
|
57
|
+
end
|
@@ -78,4 +78,29 @@ class TestDistributedCommandsOnSets < Test::Unit::TestCase
|
|
78
78
|
r.sdiffstore("baz", "foo", "bar")
|
79
79
|
end
|
80
80
|
end
|
81
|
+
|
82
|
+
def test_sscan
|
83
|
+
assert_nothing_raised do
|
84
|
+
r.sadd "foo", "s1"
|
85
|
+
r.sadd "foo", "s2"
|
86
|
+
r.sadd "bar", "s2"
|
87
|
+
r.sadd "bar", "s3"
|
88
|
+
|
89
|
+
cursor, vals = r.sscan "foo", 0
|
90
|
+
assert_equal '0', cursor
|
91
|
+
assert_equal %w(s1 s2), vals.sort
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_sscan_each
|
96
|
+
assert_nothing_raised do
|
97
|
+
r.sadd "foo", "s1"
|
98
|
+
r.sadd "foo", "s2"
|
99
|
+
r.sadd "bar", "s2"
|
100
|
+
r.sadd "bar", "s3"
|
101
|
+
|
102
|
+
vals = r.sscan_each("foo").to_a
|
103
|
+
assert_equal %w(s1 s2), vals.sort
|
104
|
+
end
|
105
|
+
end
|
81
106
|
end
|
@@ -7,15 +7,27 @@ class TestDistributedCommandsOnStrings < Test::Unit::TestCase
|
|
7
7
|
include Lint::Strings
|
8
8
|
|
9
9
|
def test_mget
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
r.set("foo", "s1")
|
11
|
+
r.set("bar", "s2")
|
12
|
+
|
13
|
+
assert_equal ["s1", "s2"] , r.mget("foo", "bar")
|
14
|
+
assert_equal ["s1", "s2", nil], r.mget("foo", "bar", "baz")
|
13
15
|
end
|
14
16
|
|
15
17
|
def test_mget_mapped
|
16
|
-
|
17
|
-
|
18
|
-
|
18
|
+
r.set("foo", "s1")
|
19
|
+
r.set("bar", "s2")
|
20
|
+
|
21
|
+
response = r.mapped_mget("foo", "bar")
|
22
|
+
|
23
|
+
assert_equal "s1", response["foo"]
|
24
|
+
assert_equal "s2", response["bar"]
|
25
|
+
|
26
|
+
response = r.mapped_mget("foo", "bar", "baz")
|
27
|
+
|
28
|
+
assert_equal "s1", response["foo"]
|
29
|
+
assert_equal "s2", response["bar"]
|
30
|
+
assert_equal nil , response["baz"]
|
19
31
|
end
|
20
32
|
|
21
33
|
def test_mset
|
data/test/internals_test.rb
CHANGED
@@ -41,10 +41,6 @@ class TestInternals < Test::Unit::TestCase
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def test_provides_a_meaningful_inspect
|
45
|
-
assert_equal "#<Redis client v#{Redis::VERSION} for redis://127.0.0.1:#{PORT}/15>", r.inspect
|
46
|
-
end
|
47
|
-
|
48
44
|
def test_redis_current
|
49
45
|
assert_equal "127.0.0.1", Redis.current._client.host
|
50
46
|
assert_equal 6379, Redis.current._client.port
|
@@ -76,48 +72,12 @@ class TestInternals < Test::Unit::TestCase
|
|
76
72
|
assert !fresh_client.connected?
|
77
73
|
end
|
78
74
|
|
79
|
-
def test_default_id_with_host_and_port
|
80
|
-
redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0))
|
81
|
-
assert_equal "redis://host:1234/0", redis._client.id
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_default_id_with_host_and_port_and_explicit_scheme
|
85
|
-
redis = Redis.new(OPTIONS.merge(:host => "host", :port => "1234", :db => 0, :scheme => "foo"))
|
86
|
-
assert_equal "redis://host:1234/0", redis._client.id
|
87
|
-
end
|
88
|
-
|
89
|
-
def test_default_id_with_path
|
90
|
-
redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0))
|
91
|
-
assert_equal "redis:///tmp/redis.sock/0", redis._client.id
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_default_id_with_path_and_explicit_scheme
|
95
|
-
redis = Redis.new(OPTIONS.merge(:path => "/tmp/redis.sock", :db => 0, :scheme => "foo"))
|
96
|
-
assert_equal "redis:///tmp/redis.sock/0", redis._client.id
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_override_id
|
100
|
-
redis = Redis.new(OPTIONS.merge(:id => "test"))
|
101
|
-
assert_equal redis._client.id, "test"
|
102
|
-
end
|
103
|
-
|
104
75
|
def test_timeout
|
105
76
|
assert_nothing_raised do
|
106
77
|
Redis.new(OPTIONS.merge(:timeout => 0))
|
107
78
|
end
|
108
79
|
end
|
109
80
|
|
110
|
-
def test_id_inside_multi
|
111
|
-
redis = Redis.new(OPTIONS)
|
112
|
-
id = nil
|
113
|
-
|
114
|
-
redis.multi do
|
115
|
-
id = redis.id
|
116
|
-
end
|
117
|
-
|
118
|
-
assert_equal id, "redis://127.0.0.1:6381/15"
|
119
|
-
end
|
120
|
-
|
121
81
|
driver(:ruby) do
|
122
82
|
def test_tcp_keepalive
|
123
83
|
keepalive = {:time => 20, :intvl => 10, :probes => 5}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ezra Zygmuntowicz
|
@@ -16,7 +16,7 @@ authors:
|
|
16
16
|
autorequire:
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
|
-
date: 2017-
|
19
|
+
date: 2017-09-28 00:00:00.000000000 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: test-unit
|
@@ -123,6 +123,7 @@ files:
|
|
123
123
|
- test/commands_on_strings_test.rb
|
124
124
|
- test/commands_on_value_types_test.rb
|
125
125
|
- test/connection_handling_test.rb
|
126
|
+
- test/connection_test.rb
|
126
127
|
- test/db/.gitkeep
|
127
128
|
- test/distributed_blocking_commands_test.rb
|
128
129
|
- test/distributed_commands_on_hashes_test.rb
|
@@ -225,6 +226,7 @@ test_files:
|
|
225
226
|
- test/commands_on_strings_test.rb
|
226
227
|
- test/commands_on_value_types_test.rb
|
227
228
|
- test/connection_handling_test.rb
|
229
|
+
- test/connection_test.rb
|
228
230
|
- test/db/.gitkeep
|
229
231
|
- test/distributed_blocking_commands_test.rb
|
230
232
|
- test/distributed_commands_on_hashes_test.rb
|