redis 4.0.1 → 4.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +17 -29
- data/.travis/Gemfile +5 -0
- data/CHANGELOG.md +29 -0
- data/Gemfile +5 -0
- data/README.md +1 -1
- data/bin/build +71 -0
- data/lib/redis.rb +198 -12
- data/lib/redis/client.rb +26 -12
- data/lib/redis/cluster.rb +285 -0
- data/lib/redis/cluster/command.rb +81 -0
- data/lib/redis/cluster/command_loader.rb +32 -0
- data/lib/redis/cluster/key_slot_converter.rb +72 -0
- data/lib/redis/cluster/node.rb +104 -0
- data/lib/redis/cluster/node_key.rb +35 -0
- data/lib/redis/cluster/node_loader.rb +35 -0
- data/lib/redis/cluster/option.rb +76 -0
- data/lib/redis/cluster/slot.rb +69 -0
- data/lib/redis/cluster/slot_loader.rb +47 -0
- data/lib/redis/connection/ruby.rb +5 -2
- data/lib/redis/distributed.rb +10 -2
- data/lib/redis/errors.rb +46 -0
- data/lib/redis/pipeline.rb +9 -1
- data/lib/redis/version.rb +1 -1
- data/makefile +54 -22
- data/redis.gemspec +2 -1
- data/test/client_test.rb +17 -0
- data/test/cluster_abnormal_state_test.rb +38 -0
- data/test/cluster_blocking_commands_test.rb +15 -0
- data/test/cluster_client_internals_test.rb +77 -0
- data/test/cluster_client_key_hash_tags_test.rb +88 -0
- data/test/cluster_client_options_test.rb +147 -0
- data/test/cluster_client_pipelining_test.rb +59 -0
- data/test/cluster_client_replicas_test.rb +36 -0
- data/test/cluster_client_slots_test.rb +94 -0
- data/test/cluster_client_transactions_test.rb +71 -0
- data/test/cluster_commands_on_cluster_test.rb +165 -0
- data/test/cluster_commands_on_connection_test.rb +40 -0
- data/test/cluster_commands_on_geo_test.rb +74 -0
- data/test/cluster_commands_on_hashes_test.rb +11 -0
- data/test/cluster_commands_on_hyper_log_log_test.rb +17 -0
- data/test/cluster_commands_on_keys_test.rb +134 -0
- data/test/cluster_commands_on_lists_test.rb +15 -0
- data/test/cluster_commands_on_pub_sub_test.rb +101 -0
- data/test/cluster_commands_on_scripting_test.rb +56 -0
- data/test/cluster_commands_on_server_test.rb +221 -0
- data/test/cluster_commands_on_sets_test.rb +39 -0
- data/test/cluster_commands_on_sorted_sets_test.rb +35 -0
- data/test/cluster_commands_on_streams_test.rb +196 -0
- data/test/cluster_commands_on_strings_test.rb +15 -0
- data/test/cluster_commands_on_transactions_test.rb +41 -0
- data/test/cluster_commands_on_value_types_test.rb +14 -0
- data/test/commands_on_geo_test.rb +116 -0
- data/test/commands_on_hashes_test.rb +2 -14
- data/test/commands_on_hyper_log_log_test.rb +2 -14
- data/test/commands_on_lists_test.rb +2 -13
- data/test/commands_on_sets_test.rb +2 -70
- data/test/commands_on_sorted_sets_test.rb +2 -145
- data/test/commands_on_strings_test.rb +2 -94
- data/test/commands_on_value_types_test.rb +36 -0
- data/test/distributed_blocking_commands_test.rb +8 -0
- data/test/distributed_commands_on_hashes_test.rb +16 -3
- data/test/distributed_commands_on_hyper_log_log_test.rb +8 -13
- data/test/distributed_commands_on_lists_test.rb +4 -5
- data/test/distributed_commands_on_sets_test.rb +45 -46
- data/test/distributed_commands_on_sorted_sets_test.rb +51 -8
- data/test/distributed_commands_on_strings_test.rb +10 -0
- data/test/distributed_commands_on_value_types_test.rb +36 -0
- data/test/helper.rb +176 -32
- data/test/internals_test.rb +20 -1
- data/test/lint/blocking_commands.rb +40 -16
- data/test/lint/hashes.rb +41 -0
- data/test/lint/hyper_log_log.rb +15 -1
- data/test/lint/lists.rb +16 -0
- data/test/lint/sets.rb +142 -0
- data/test/lint/sorted_sets.rb +183 -2
- data/test/lint/strings.rb +102 -0
- data/test/pipelining_commands_test.rb +8 -0
- data/test/support/cluster/orchestrator.rb +199 -0
- data/test/support/redis_mock.rb +1 -1
- data/test/transactions_test.rb +10 -0
- metadata +81 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ec178932a6874e8ac7a4f6cfa4390c8223367ec
|
4
|
+
data.tar.gz: 986e6c5d1729b9ec8f7d66900e5d9ad9437e29f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14db8cb42f08014ebd942c39b5f119a68a8ec50fec046572bb3afc7708634589311b9bea0d4153bfd1d7cb1c46a94a00d77613872b2cb8c10c33f132755cd62d
|
7
|
+
data.tar.gz: efe0db683450fcb30b6d23b8c9448d6925b5c5d95b847f9563405a61cc7e667bbf8aea22642dcc9d8a1b716dc9c8cb55c562c86a08223e020991f69eff7df7f7
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,13 +1,19 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache:
|
3
|
+
directories:
|
4
|
+
- tmp/cache
|
5
|
+
before_install:
|
6
|
+
- gem update --system 2.6.14
|
7
|
+
- gem --version
|
2
8
|
|
3
|
-
script: make
|
9
|
+
script: make
|
4
10
|
|
5
11
|
rvm:
|
6
12
|
- 2.2.2
|
7
13
|
- 2.3.3
|
8
14
|
- 2.4.1
|
9
|
-
-
|
10
|
-
-
|
15
|
+
- 2.5.0
|
16
|
+
- jruby-9.1.17.0
|
11
17
|
|
12
18
|
gemfile: ".travis/Gemfile"
|
13
19
|
|
@@ -19,7 +25,7 @@ before_script:
|
|
19
25
|
env:
|
20
26
|
global:
|
21
27
|
- VERBOSE=true
|
22
|
-
- TIMEOUT=
|
28
|
+
- TIMEOUT=9
|
23
29
|
matrix:
|
24
30
|
- DRIVER=ruby REDIS_BRANCH=3.0
|
25
31
|
- DRIVER=ruby REDIS_BRANCH=3.2
|
@@ -27,7 +33,7 @@ env:
|
|
27
33
|
- DRIVER=hiredis REDIS_BRANCH=3.2
|
28
34
|
- DRIVER=synchrony REDIS_BRANCH=3.0
|
29
35
|
- DRIVER=synchrony REDIS_BRANCH=3.2
|
30
|
-
- DRIVER=ruby REDIS_BRANCH=
|
36
|
+
- DRIVER=ruby REDIS_BRANCH=4.0
|
31
37
|
|
32
38
|
branches:
|
33
39
|
only:
|
@@ -38,34 +44,16 @@ branches:
|
|
38
44
|
matrix:
|
39
45
|
exclude:
|
40
46
|
# hiredis
|
41
|
-
- rvm: jruby-9
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
gemfile: .travis/Gemfile
|
46
|
-
env: DRIVER=hiredis REDIS_BRANCH=3.2
|
47
|
-
- rvm: jruby-9
|
48
|
-
gemfile: .travis/Gemfile
|
49
|
-
env: DRIVER=hiredis REDIS_BRANCH=3.0
|
50
|
-
- rvm: jruby-9
|
51
|
-
gemfile: .travis/Gemfile
|
52
|
-
env: DRIVER=hiredis REDIS_BRANCH=3.2
|
47
|
+
- rvm: jruby-9.1.17.0
|
48
|
+
env: DRIVER=hiredis REDIS_BRANCH=3.0
|
49
|
+
- rvm: jruby-9.1.17.0
|
50
|
+
env: DRIVER=hiredis REDIS_BRANCH=3.2
|
53
51
|
|
54
52
|
# synchrony
|
55
|
-
- rvm: jruby-9
|
56
|
-
gemfile: .travis/Gemfile
|
53
|
+
- rvm: jruby-9.1.17.0
|
57
54
|
env: DRIVER=synchrony REDIS_BRANCH=3.0
|
58
|
-
- rvm: jruby-9
|
59
|
-
gemfile: .travis/Gemfile
|
55
|
+
- rvm: jruby-9.1.17.0
|
60
56
|
env: DRIVER=synchrony REDIS_BRANCH=3.2
|
61
|
-
- rvm: jruby-9
|
62
|
-
gemfile: .travis/Gemfile
|
63
|
-
env: DRIVER=synchrony REDIS_BRANCH=3.0
|
64
|
-
- rvm: jruby-9
|
65
|
-
gemfile: .travis/Gemfile
|
66
|
-
env: DRIVER=synchrony REDIS_BRANCH=3.2
|
67
|
-
allow_failures:
|
68
|
-
- rvm: rbx-3
|
69
57
|
|
70
58
|
notifications:
|
71
59
|
irc:
|
data/.travis/Gemfile
CHANGED
@@ -2,6 +2,11 @@ source "https://rubygems.org"
|
|
2
2
|
|
3
3
|
gemspec :path => "../"
|
4
4
|
|
5
|
+
# Using jruby-openssl 0.10.0, we get NPEs in jruby tests: https://github.com/redis/redis-rb/issues/756
|
6
|
+
platform :jruby do
|
7
|
+
gem 'jruby-openssl', '<0.10.0'
|
8
|
+
end
|
9
|
+
|
5
10
|
case ENV["DRIVER"]
|
6
11
|
when "hiredis"
|
7
12
|
gem "hiredis"
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
# 4.0.3
|
2
|
+
|
3
|
+
* Fix raising command error for first command in pipeline. See #788.
|
4
|
+
* Fix the gemspec to stop exposing a `build` executable. See #785.
|
5
|
+
* Add `:reconnect_delay` and `:reconnect_delay_max` options. See #778.
|
6
|
+
|
7
|
+
# 4.0.2
|
8
|
+
|
9
|
+
* Added `Redis#unlink`. See #766.
|
10
|
+
|
11
|
+
* `Redis.new` now accept a custom connector via `:connector`. See #591.
|
12
|
+
|
13
|
+
* `Redis#multi` no longer perform empty transactions. See #747.
|
14
|
+
|
15
|
+
* `Redis#hdel` now accepts hash keys as multiple arguments like `#del`. See #755.
|
16
|
+
|
17
|
+
* Allow to skip SSL verification. See #745.
|
18
|
+
|
19
|
+
* Add Geo commands: `geoadd`, `geohash`, `georadius`, `georadiusbymember`, `geopos`, `geodist`. See #730.
|
20
|
+
|
1
21
|
# 4.0.1
|
2
22
|
|
3
23
|
* `Redis::Distributed` now supports `mget` and `mapped_mget`. See #687.
|
@@ -21,6 +41,15 @@
|
|
21
41
|
|
22
42
|
* Dropped official support for Ruby < 2.2.2.
|
23
43
|
|
44
|
+
# 3.3.5
|
45
|
+
|
46
|
+
* Fixed Ruby 1.8 compatibility after backporting `Redis#connection`. See #719.
|
47
|
+
|
48
|
+
# 3.3.4 (yanked)
|
49
|
+
|
50
|
+
* `Redis#connection` returns a hash with connection information.
|
51
|
+
You shouldn't need to call `Redis#_client`, ever.
|
52
|
+
|
24
53
|
# 3.3.3
|
25
54
|
|
26
55
|
* Improved timeout handling after dropping Timeout module.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -176,7 +176,7 @@ it can't connect to the server a `Redis::CannotConnectError` error will be raise
|
|
176
176
|
```ruby
|
177
177
|
begin
|
178
178
|
redis.ping
|
179
|
-
rescue
|
179
|
+
rescue StandardError => e
|
180
180
|
e.inspect
|
181
181
|
# => #<Redis::CannotConnectError: Timed out connecting to Redis on 10.0.1.1:6380>
|
182
182
|
|
data/bin/build
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
TARBALL = ARGV[0]
|
4
|
+
|
5
|
+
require 'digest/sha1'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
class Builder
|
9
|
+
def initialize(redis_branch, tmp_dir)
|
10
|
+
@redis_branch = redis_branch
|
11
|
+
@tmp_dir = tmp_dir
|
12
|
+
@build_dir = File.join(@tmp_dir, "cache", "redis-#{redis_branch}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
download_tarball
|
17
|
+
if old_checkum != checksum
|
18
|
+
build
|
19
|
+
update_checksum
|
20
|
+
end
|
21
|
+
0
|
22
|
+
end
|
23
|
+
|
24
|
+
def download_tarball
|
25
|
+
command!('wget', tarball_url, '-O', tarball_path)
|
26
|
+
end
|
27
|
+
|
28
|
+
def tarball_path
|
29
|
+
File.join(@tmp_dir, "redis-#{@redis_branch}.tar.gz")
|
30
|
+
end
|
31
|
+
|
32
|
+
def tarball_url
|
33
|
+
"https://github.com/antirez/redis/archive/#{@redis_branch}.tar.gz"
|
34
|
+
end
|
35
|
+
|
36
|
+
def build
|
37
|
+
FileUtils.rm_rf(@build_dir)
|
38
|
+
FileUtils.mkdir_p(@build_dir)
|
39
|
+
command!('tar', 'xf', tarball_path, '-C', File.expand_path('../', @build_dir))
|
40
|
+
Dir.chdir(@build_dir) do
|
41
|
+
command!('make')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def update_checksum
|
46
|
+
File.write(checksum_path, checksum)
|
47
|
+
end
|
48
|
+
|
49
|
+
def old_checkum
|
50
|
+
File.read(checksum_path)
|
51
|
+
rescue Errno::ENOENT
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
|
55
|
+
def checksum_path
|
56
|
+
File.join(@build_dir, 'build.checksum')
|
57
|
+
end
|
58
|
+
|
59
|
+
def checksum
|
60
|
+
@checksum ||= Digest::SHA1.file(tarball_path).hexdigest
|
61
|
+
end
|
62
|
+
|
63
|
+
def command!(*args)
|
64
|
+
puts "$ #{args.join(' ')}"
|
65
|
+
unless system(*args)
|
66
|
+
raise "Command failed with status #{$?.exitstatus}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
exit Builder.new(ARGV[0], ARGV[1]).run
|
data/lib/redis.rb
CHANGED
@@ -31,11 +31,16 @@ class Redis
|
|
31
31
|
# @option options [Boolean] :inherit_socket (false) Whether to use socket in forked process or not
|
32
32
|
# @option options [Array] :sentinels List of sentinels to contact
|
33
33
|
# @option options [Symbol] :role (:master) Role to fetch via Sentinel, either `:master` or `:slave`
|
34
|
+
# @option options [Array<String, Hash{Symbol => String, Integer}>] :cluster List of cluster nodes to contact
|
35
|
+
# @option options [Boolean] :replica Whether to use readonly replica nodes in Redis Cluster or not
|
36
|
+
# @option options [Class] :connector Class of custom connector
|
34
37
|
#
|
35
38
|
# @return [Redis] a new client instance
|
36
39
|
def initialize(options = {})
|
37
40
|
@options = options.dup
|
38
|
-
@
|
41
|
+
@cluster_mode = options.key?(:cluster)
|
42
|
+
client = @cluster_mode ? Cluster : Client
|
43
|
+
@original_client = @client = client.new(options)
|
39
44
|
@queue = Hash.new { |h, k| h[k] = [] }
|
40
45
|
|
41
46
|
super() # Monitor#initialize
|
@@ -273,9 +278,7 @@ class Redis
|
|
273
278
|
synchronize do |client|
|
274
279
|
client.call([:info, cmd].compact) do |reply|
|
275
280
|
if reply.kind_of?(String)
|
276
|
-
reply =
|
277
|
-
line.split(":", 2) unless line =~ /^(#|$)/
|
278
|
-
end.compact]
|
281
|
+
reply = HashifyInfo.call(reply)
|
279
282
|
|
280
283
|
if cmd && cmd.to_s == "commandstats"
|
281
284
|
# Extract nested hashes for INFO COMMANDSTATS
|
@@ -524,6 +527,16 @@ class Redis
|
|
524
527
|
end
|
525
528
|
end
|
526
529
|
|
530
|
+
# Unlink one or more keys.
|
531
|
+
#
|
532
|
+
# @param [String, Array<String>] keys
|
533
|
+
# @return [Fixnum] number of keys that were unlinked
|
534
|
+
def unlink(*keys)
|
535
|
+
synchronize do |client|
|
536
|
+
client.call([:unlink] + keys)
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
527
540
|
# Determine if a key exists.
|
528
541
|
#
|
529
542
|
# @param [String] key
|
@@ -2102,9 +2115,9 @@ class Redis
|
|
2102
2115
|
# @param [String] key
|
2103
2116
|
# @param [String, Array<String>] field
|
2104
2117
|
# @return [Fixnum] the number of fields that were removed from the hash
|
2105
|
-
def hdel(key,
|
2118
|
+
def hdel(key, *fields)
|
2106
2119
|
synchronize do |client|
|
2107
|
-
client.call([:hdel, key,
|
2120
|
+
client.call([:hdel, key, *fields])
|
2108
2121
|
end
|
2109
2122
|
end
|
2110
2123
|
|
@@ -2710,6 +2723,86 @@ class Redis
|
|
2710
2723
|
end
|
2711
2724
|
end
|
2712
2725
|
|
2726
|
+
# Adds the specified geospatial items (latitude, longitude, name) to the specified key
|
2727
|
+
#
|
2728
|
+
# @param [String] key
|
2729
|
+
# @param [Array] member arguemnts for member or members: longitude, latitude, name
|
2730
|
+
# @return [Intger] number of elements added to the sorted set
|
2731
|
+
def geoadd(key, *member)
|
2732
|
+
synchronize do |client|
|
2733
|
+
client.call([:geoadd, key, member])
|
2734
|
+
end
|
2735
|
+
end
|
2736
|
+
|
2737
|
+
# Returns geohash string representing position for specified members of the specified key.
|
2738
|
+
#
|
2739
|
+
# @param [String] key
|
2740
|
+
# @param [String, Array<String>] member one member or array of members
|
2741
|
+
# @return [Array<String, nil>] returns array containg geohash string if member is present, nil otherwise
|
2742
|
+
def geohash(key, member)
|
2743
|
+
synchronize do |client|
|
2744
|
+
client.call([:geohash, key, member])
|
2745
|
+
end
|
2746
|
+
end
|
2747
|
+
|
2748
|
+
|
2749
|
+
# Query a sorted set representing a geospatial index to fetch members matching a
|
2750
|
+
# given maximum distance from a point
|
2751
|
+
#
|
2752
|
+
# @param [Array] args key, longitude, latitude, radius, unit(m|km|ft|mi)
|
2753
|
+
# @param ['asc', 'desc'] sort sort returned items from the nearest to the farthest or the farthest to the nearest relative to the center
|
2754
|
+
# @param [Integer] count limit the results to the first N matching items
|
2755
|
+
# @param ['WITHDIST', 'WITHCOORD', 'WITHHASH'] options to return additional information
|
2756
|
+
# @return [Array<String>] may be changed with `options`
|
2757
|
+
|
2758
|
+
def georadius(*args, **geoptions)
|
2759
|
+
geoarguments = _geoarguments(*args, **geoptions)
|
2760
|
+
|
2761
|
+
synchronize do |client|
|
2762
|
+
client.call([:georadius, *geoarguments])
|
2763
|
+
end
|
2764
|
+
end
|
2765
|
+
|
2766
|
+
# Query a sorted set representing a geospatial index to fetch members matching a
|
2767
|
+
# given maximum distance from an already existing member
|
2768
|
+
#
|
2769
|
+
# @param [Array] args key, member, radius, unit(m|km|ft|mi)
|
2770
|
+
# @param ['asc', 'desc'] sort sort returned items from the nearest to the farthest or the farthest to the nearest relative to the center
|
2771
|
+
# @param [Integer] count limit the results to the first N matching items
|
2772
|
+
# @param ['WITHDIST', 'WITHCOORD', 'WITHHASH'] options to return additional information
|
2773
|
+
# @return [Array<String>] may be changed with `options`
|
2774
|
+
|
2775
|
+
def georadiusbymember(*args, **geoptions)
|
2776
|
+
geoarguments = _geoarguments(*args, **geoptions)
|
2777
|
+
|
2778
|
+
synchronize do |client|
|
2779
|
+
client.call([:georadiusbymember, *geoarguments])
|
2780
|
+
end
|
2781
|
+
end
|
2782
|
+
|
2783
|
+
# Returns longitude and latitude of members of a geospatial index
|
2784
|
+
#
|
2785
|
+
# @param [String] key
|
2786
|
+
# @param [String, Array<String>] member one member or array of members
|
2787
|
+
# @return [Array<Array<String>, nil>] returns array of elements, where each element is either array of longitude and latitude or nil
|
2788
|
+
def geopos(key, member)
|
2789
|
+
synchronize do |client|
|
2790
|
+
client.call([:geopos, key, member])
|
2791
|
+
end
|
2792
|
+
end
|
2793
|
+
|
2794
|
+
# Returns the distance between two members of a geospatial index
|
2795
|
+
#
|
2796
|
+
# @param [String ]key
|
2797
|
+
# @param [Array<String>] members
|
2798
|
+
# @param ['m', 'km', 'mi', 'ft'] unit
|
2799
|
+
# @return [String, nil] returns distance in spefied unit if both members present, nil otherwise.
|
2800
|
+
def geodist(key, member1, member2, unit = 'm')
|
2801
|
+
synchronize do |client|
|
2802
|
+
client.call([:geodist, key, member1, member2, unit])
|
2803
|
+
end
|
2804
|
+
end
|
2805
|
+
|
2713
2806
|
# Interact with the sentinel command (masters, master, slaves, failover)
|
2714
2807
|
#
|
2715
2808
|
# @param [String] subcommand e.g. `masters`, `master`, `slaves`
|
@@ -2737,6 +2830,41 @@ class Redis
|
|
2737
2830
|
end
|
2738
2831
|
end
|
2739
2832
|
|
2833
|
+
# Sends `CLUSTER *` command to random node and returns its reply.
|
2834
|
+
#
|
2835
|
+
# @see https://redis.io/commands#cluster Reference of cluster command
|
2836
|
+
#
|
2837
|
+
# @param subcommand [String, Symbol] the subcommand of cluster command
|
2838
|
+
# e.g. `:slots`, `:nodes`, `:slaves`, `:info`
|
2839
|
+
#
|
2840
|
+
# @return [Object] depends on the subcommand
|
2841
|
+
def cluster(subcommand, *args)
|
2842
|
+
subcommand = subcommand.to_s.downcase
|
2843
|
+
block = case subcommand
|
2844
|
+
when 'slots' then HashifyClusterSlots
|
2845
|
+
when 'nodes' then HashifyClusterNodes
|
2846
|
+
when 'slaves' then HashifyClusterSlaves
|
2847
|
+
when 'info' then HashifyInfo
|
2848
|
+
else Noop
|
2849
|
+
end
|
2850
|
+
|
2851
|
+
# @see https://github.com/antirez/redis/blob/unstable/src/redis-trib.rb#L127 raw reply expected
|
2852
|
+
block = Noop unless @cluster_mode
|
2853
|
+
|
2854
|
+
synchronize do |client|
|
2855
|
+
client.call([:cluster, subcommand] + args, &block)
|
2856
|
+
end
|
2857
|
+
end
|
2858
|
+
|
2859
|
+
# Sends `ASKING` command to random node and returns its reply.
|
2860
|
+
#
|
2861
|
+
# @see https://redis.io/topics/cluster-spec#ask-redirection ASK redirection
|
2862
|
+
#
|
2863
|
+
# @return [String] `'OK'`
|
2864
|
+
def asking
|
2865
|
+
synchronize { |client| client.call(%i[asking]) }
|
2866
|
+
end
|
2867
|
+
|
2740
2868
|
def id
|
2741
2869
|
@original_client.id
|
2742
2870
|
end
|
@@ -2750,6 +2878,8 @@ class Redis
|
|
2750
2878
|
end
|
2751
2879
|
|
2752
2880
|
def connection
|
2881
|
+
return @original_client.connection_info if @cluster_mode
|
2882
|
+
|
2753
2883
|
{
|
2754
2884
|
host: @original_client.host,
|
2755
2885
|
port: @original_client.port,
|
@@ -2805,14 +2935,70 @@ private
|
|
2805
2935
|
}
|
2806
2936
|
|
2807
2937
|
FloatifyPairs =
|
2808
|
-
lambda { |
|
2809
|
-
|
2810
|
-
|
2811
|
-
|
2812
|
-
|
2938
|
+
lambda { |result|
|
2939
|
+
result.each_slice(2).map do |member, score|
|
2940
|
+
[member, Floatify.call(score)]
|
2941
|
+
end
|
2942
|
+
}
|
2943
|
+
|
2944
|
+
HashifyInfo =
|
2945
|
+
lambda { |reply|
|
2946
|
+
Hash[reply.split("\r\n").map do |line|
|
2947
|
+
line.split(':', 2) unless line =~ /^(#|$)/
|
2948
|
+
end.compact]
|
2949
|
+
}
|
2950
|
+
|
2951
|
+
HashifyClusterNodeInfo =
|
2952
|
+
lambda { |str|
|
2953
|
+
arr = str.split(' ')
|
2954
|
+
{
|
2955
|
+
'node_id' => arr[0],
|
2956
|
+
'ip_port' => arr[1],
|
2957
|
+
'flags' => arr[2].split(','),
|
2958
|
+
'master_node_id' => arr[3],
|
2959
|
+
'ping_sent' => arr[4],
|
2960
|
+
'pong_recv' => arr[5],
|
2961
|
+
'config_epoch' => arr[6],
|
2962
|
+
'link_state' => arr[7],
|
2963
|
+
'slots' => arr[8].nil? ? nil : Range.new(*arr[8].split('-'))
|
2964
|
+
}
|
2965
|
+
}
|
2966
|
+
|
2967
|
+
HashifyClusterSlots =
|
2968
|
+
lambda { |reply|
|
2969
|
+
reply.map do |arr|
|
2970
|
+
first_slot, last_slot = arr[0..1]
|
2971
|
+
master = { 'ip' => arr[2][0], 'port' => arr[2][1], 'node_id' => arr[2][2] }
|
2972
|
+
replicas = arr[3..-1].map { |r| { 'ip' => r[0], 'port' => r[1], 'node_id' => r[2] } }
|
2973
|
+
{
|
2974
|
+
'start_slot' => first_slot,
|
2975
|
+
'end_slot' => last_slot,
|
2976
|
+
'master' => master,
|
2977
|
+
'replicas' => replicas
|
2978
|
+
}
|
2813
2979
|
end
|
2814
2980
|
}
|
2815
2981
|
|
2982
|
+
HashifyClusterNodes =
|
2983
|
+
lambda { |reply|
|
2984
|
+
reply.split(/[\r\n]+/).map { |str| HashifyClusterNodeInfo.call(str) }
|
2985
|
+
}
|
2986
|
+
|
2987
|
+
HashifyClusterSlaves =
|
2988
|
+
lambda { |reply|
|
2989
|
+
reply.map { |str| HashifyClusterNodeInfo.call(str) }
|
2990
|
+
}
|
2991
|
+
|
2992
|
+
Noop = ->(reply) { reply }
|
2993
|
+
|
2994
|
+
def _geoarguments(*args, options: nil, sort: nil, count: nil)
|
2995
|
+
args.push sort if sort
|
2996
|
+
args.push 'count', count if count
|
2997
|
+
args.push options if options
|
2998
|
+
|
2999
|
+
args.uniq
|
3000
|
+
end
|
3001
|
+
|
2816
3002
|
def _subscription(method, timeout, channels, block)
|
2817
3003
|
return @client.call([method] + channels) if subscribed?
|
2818
3004
|
|
@@ -2827,11 +3013,11 @@ private
|
|
2827
3013
|
@client = original
|
2828
3014
|
end
|
2829
3015
|
end
|
2830
|
-
|
2831
3016
|
end
|
2832
3017
|
|
2833
3018
|
require_relative "redis/version"
|
2834
3019
|
require_relative "redis/connection"
|
2835
3020
|
require_relative "redis/client"
|
3021
|
+
require_relative "redis/cluster"
|
2836
3022
|
require_relative "redis/pipeline"
|
2837
3023
|
require_relative "redis/subscribe"
|