redis 3.2.2 → 4.4.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 +175 -13
- data/README.md +223 -76
- data/lib/redis.rb +1360 -445
- data/lib/redis/client.rb +183 -103
- data/lib/redis/cluster.rb +291 -0
- data/lib/redis/cluster/command.rb +81 -0
- data/lib/redis/cluster/command_loader.rb +34 -0
- data/lib/redis/cluster/key_slot_converter.rb +72 -0
- data/lib/redis/cluster/node.rb +108 -0
- data/lib/redis/cluster/node_key.rb +31 -0
- data/lib/redis/cluster/node_loader.rb +37 -0
- data/lib/redis/cluster/option.rb +93 -0
- data/lib/redis/cluster/slot.rb +86 -0
- data/lib/redis/cluster/slot_loader.rb +49 -0
- data/lib/redis/connection.rb +4 -2
- data/lib/redis/connection/command_helper.rb +5 -10
- data/lib/redis/connection/hiredis.rb +9 -6
- data/lib/redis/connection/registry.rb +2 -1
- data/lib/redis/connection/ruby.rb +168 -63
- data/lib/redis/connection/synchrony.rb +29 -7
- data/lib/redis/distributed.rb +156 -74
- data/lib/redis/errors.rb +48 -0
- data/lib/redis/hash_ring.rb +30 -73
- data/lib/redis/pipeline.rb +55 -15
- data/lib/redis/subscribe.rb +20 -13
- data/lib/redis/version.rb +3 -1
- metadata +41 -170
- data/.gitignore +0 -16
- data/.travis.yml +0 -59
- data/.travis/Gemfile +0 -11
- 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.rb +0 -41
- data/examples/sentinel/sentinel.conf +0 -9
- data/examples/sentinel/start +0 -49
- 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/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 -250
- 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 -437
- 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 -125
- 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 -254
- 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/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 -119
- 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 -32
- data/test/transactions_test.rb +0 -264
- data/test/unknown_commands_test.rb +0 -14
- data/test/url_param_test.rb +0 -138
data/lib/redis/errors.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Redis
|
2
4
|
# Base error for all redis-rb errors.
|
3
5
|
class BaseError < RuntimeError
|
@@ -37,4 +39,50 @@ class Redis
|
|
37
39
|
# Raised when the connection was inherited by a child process.
|
38
40
|
class InheritedError < BaseConnectionError
|
39
41
|
end
|
42
|
+
|
43
|
+
# Raised when client options are invalid.
|
44
|
+
class InvalidClientOptionError < BaseError
|
45
|
+
end
|
46
|
+
|
47
|
+
class Cluster
|
48
|
+
# Raised when client connected to redis as cluster mode
|
49
|
+
# and some cluster subcommands were called.
|
50
|
+
class OrchestrationCommandNotSupported < BaseError
|
51
|
+
def initialize(command, subcommand = '')
|
52
|
+
str = [command, subcommand].map(&:to_s).reject(&:empty?).join(' ').upcase
|
53
|
+
msg = "#{str} command should be used with care "\
|
54
|
+
'only by applications orchestrating Redis Cluster, like redis-trib, '\
|
55
|
+
'and the command if used out of the right context can leave the cluster '\
|
56
|
+
'in a wrong state or cause data loss.'
|
57
|
+
super(msg)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Raised when error occurs on any node of cluster.
|
62
|
+
class CommandErrorCollection < BaseError
|
63
|
+
attr_reader :errors
|
64
|
+
|
65
|
+
# @param errors [Hash{String => Redis::CommandError}]
|
66
|
+
# @param error_message [String]
|
67
|
+
def initialize(errors, error_message = 'Command errors were replied on any node')
|
68
|
+
@errors = errors
|
69
|
+
super(error_message)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Raised when cluster client can't select node.
|
74
|
+
class AmbiguousNodeError < BaseError
|
75
|
+
def initialize(command)
|
76
|
+
super("Cluster client doesn't know which node the #{command} command should be sent to.")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Raised when commands in pipelining include cross slot keys.
|
81
|
+
class CrossSlotPipeliningError < BaseError
|
82
|
+
def initialize(keys)
|
83
|
+
super("Cluster client couldn't send pipelining to single node. "\
|
84
|
+
"The commands include cross slot keys. #{keys}")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
40
88
|
end
|
data/lib/redis/hash_ring.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'zlib'
|
2
4
|
|
3
5
|
class Redis
|
4
6
|
class HashRing
|
5
|
-
|
6
7
|
POINTS_PER_SERVER = 160 # this is the default in libmemcached
|
7
8
|
|
8
9
|
attr_reader :ring, :sorted_keys, :replicas, :nodes
|
@@ -10,7 +11,7 @@ class Redis
|
|
10
11
|
# nodes is a list of objects that have a proper to_s representation.
|
11
12
|
# replicas indicates how many virtual points should be used pr. node,
|
12
13
|
# replicas are required to improve the distribution.
|
13
|
-
def initialize(nodes=[], replicas=POINTS_PER_SERVER)
|
14
|
+
def initialize(nodes = [], replicas = POINTS_PER_SERVER)
|
14
15
|
@replicas = replicas
|
15
16
|
@ring = {}
|
16
17
|
@nodes = []
|
@@ -25,7 +26,6 @@ class Redis
|
|
25
26
|
@nodes << node
|
26
27
|
@replicas.times do |i|
|
27
28
|
key = Zlib.crc32("#{node.id}:#{i}")
|
28
|
-
raise "Node ID collision" if @ring.has_key?(key)
|
29
29
|
@ring[key] = node
|
30
30
|
@sorted_keys << key
|
31
31
|
end
|
@@ -33,11 +33,11 @@ class Redis
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def remove_node(node)
|
36
|
-
@nodes.reject!{|n| n.id == node.id}
|
36
|
+
@nodes.reject! { |n| n.id == node.id }
|
37
37
|
@replicas.times do |i|
|
38
38
|
key = Zlib.crc32("#{node.id}:#{i}")
|
39
39
|
@ring.delete(key)
|
40
|
-
@sorted_keys.reject! {|k| k == key}
|
40
|
+
@sorted_keys.reject! { |k| k == key }
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -47,86 +47,43 @@ class Redis
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def get_node_pos(key)
|
50
|
-
return [nil,nil] if @ring.
|
50
|
+
return [nil, nil] if @ring.empty?
|
51
|
+
|
51
52
|
crc = Zlib.crc32(key)
|
52
53
|
idx = HashRing.binary_search(@sorted_keys, crc)
|
53
|
-
|
54
|
+
[@ring[@sorted_keys[idx]], idx]
|
54
55
|
end
|
55
56
|
|
56
57
|
def iter_nodes(key)
|
57
|
-
return [nil,nil] if @ring.
|
58
|
+
return [nil, nil] if @ring.empty?
|
59
|
+
|
58
60
|
_, pos = get_node_pos(key)
|
59
61
|
@ring.size.times do |n|
|
60
|
-
yield @ring[@sorted_keys[(pos+n) % @ring.size]]
|
62
|
+
yield @ring[@sorted_keys[(pos + n) % @ring.size]]
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
while (lower <= upper) {
|
81
|
-
idx = (lower + upper) / 2;
|
82
|
-
|
83
|
-
VALUE continuumValue = RARRAY_PTR(ary)[idx];
|
84
|
-
unsigned int l = NUM2UINT(continuumValue);
|
85
|
-
if (l == r) {
|
86
|
-
return idx;
|
87
|
-
}
|
88
|
-
else if (l > r) {
|
89
|
-
upper = idx - 1;
|
90
|
-
}
|
91
|
-
else {
|
92
|
-
lower = idx + 1;
|
93
|
-
}
|
94
|
-
}
|
95
|
-
if (upper < 0) {
|
96
|
-
upper = RARRAY_LEN(ary) - 1;
|
97
|
-
}
|
98
|
-
return upper;
|
99
|
-
}
|
100
|
-
EOM
|
66
|
+
# Find the closest index in HashRing with value <= the given value
|
67
|
+
def self.binary_search(ary, value)
|
68
|
+
upper = ary.size - 1
|
69
|
+
lower = 0
|
70
|
+
idx = 0
|
71
|
+
|
72
|
+
while lower <= upper
|
73
|
+
idx = (lower + upper) / 2
|
74
|
+
comp = ary[idx] <=> value
|
75
|
+
|
76
|
+
if comp == 0
|
77
|
+
return idx
|
78
|
+
elsif comp > 0
|
79
|
+
upper = idx - 1
|
80
|
+
else
|
81
|
+
lower = idx + 1
|
101
82
|
end
|
102
|
-
rescue Exception
|
103
|
-
# Find the closest index in HashRing with value <= the given value
|
104
|
-
def binary_search(ary, value, &block)
|
105
|
-
upper = ary.size - 1
|
106
|
-
lower = 0
|
107
|
-
idx = 0
|
108
|
-
|
109
|
-
while(lower <= upper) do
|
110
|
-
idx = (lower + upper) / 2
|
111
|
-
comp = ary[idx] <=> value
|
112
|
-
|
113
|
-
if comp == 0
|
114
|
-
return idx
|
115
|
-
elsif comp > 0
|
116
|
-
upper = idx - 1
|
117
|
-
else
|
118
|
-
lower = idx + 1
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
if upper < 0
|
123
|
-
upper = ary.size - 1
|
124
|
-
end
|
125
|
-
return upper
|
126
|
-
end
|
127
|
-
|
128
83
|
end
|
129
|
-
end
|
130
84
|
|
85
|
+
upper = ary.size - 1 if upper < 0
|
86
|
+
upper
|
87
|
+
end
|
131
88
|
end
|
132
89
|
end
|
data/lib/redis/pipeline.rb
CHANGED
@@ -1,21 +1,23 @@
|
|
1
|
-
|
2
|
-
unless defined?(::BasicObject)
|
3
|
-
class BasicObject
|
4
|
-
instance_methods.each { |meth| undef_method(meth) unless meth =~ /\A(__|instance_eval)/ }
|
5
|
-
end
|
6
|
-
end
|
1
|
+
# frozen_string_literal: true
|
7
2
|
|
3
|
+
class Redis
|
8
4
|
class Pipeline
|
9
5
|
attr_accessor :db
|
6
|
+
attr_reader :client
|
10
7
|
|
11
8
|
attr :futures
|
12
9
|
|
13
|
-
def initialize
|
10
|
+
def initialize(client)
|
11
|
+
@client = client.is_a?(Pipeline) ? client.client : client
|
14
12
|
@with_reconnect = true
|
15
13
|
@shutdown = false
|
16
14
|
@futures = []
|
17
15
|
end
|
18
16
|
|
17
|
+
def timeout
|
18
|
+
client.timeout
|
19
|
+
end
|
20
|
+
|
19
21
|
def with_reconnect?
|
20
22
|
@with_reconnect
|
21
23
|
end
|
@@ -28,15 +30,23 @@ class Redis
|
|
28
30
|
@shutdown
|
29
31
|
end
|
30
32
|
|
31
|
-
def
|
33
|
+
def empty?
|
34
|
+
@futures.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
def call(command, timeout: nil, &block)
|
32
38
|
# A pipeline that contains a shutdown should not raise ECONNRESET when
|
33
39
|
# the connection is gone.
|
34
40
|
@shutdown = true if command.first == :shutdown
|
35
|
-
future = Future.new(command, block)
|
41
|
+
future = Future.new(command, block, timeout)
|
36
42
|
@futures << future
|
37
43
|
future
|
38
44
|
end
|
39
45
|
|
46
|
+
def call_with_timeout(command, timeout, &block)
|
47
|
+
call(command, timeout: timeout, &block)
|
48
|
+
end
|
49
|
+
|
40
50
|
def call_pipeline(pipeline)
|
41
51
|
@shutdown = true if pipeline.shutdown?
|
42
52
|
@futures.concat(pipeline.futures)
|
@@ -45,10 +55,14 @@ class Redis
|
|
45
55
|
end
|
46
56
|
|
47
57
|
def commands
|
48
|
-
@futures.map
|
58
|
+
@futures.map(&:_command)
|
49
59
|
end
|
50
60
|
|
51
|
-
def
|
61
|
+
def timeouts
|
62
|
+
@futures.map(&:timeout)
|
63
|
+
end
|
64
|
+
|
65
|
+
def with_reconnect(val = true)
|
52
66
|
@with_reconnect = false unless val
|
53
67
|
yield
|
54
68
|
end
|
@@ -80,7 +94,8 @@ class Redis
|
|
80
94
|
|
81
95
|
if exec.size < futures.size
|
82
96
|
# Some command wasn't recognized by Redis.
|
83
|
-
|
97
|
+
command_error = replies.detect { |r| r.is_a?(CommandError) }
|
98
|
+
raise command_error
|
84
99
|
end
|
85
100
|
|
86
101
|
super(exec) do |reply|
|
@@ -91,8 +106,20 @@ class Redis
|
|
91
106
|
end
|
92
107
|
end
|
93
108
|
|
109
|
+
def timeouts
|
110
|
+
if empty?
|
111
|
+
[]
|
112
|
+
else
|
113
|
+
[nil, *super, nil]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
94
117
|
def commands
|
95
|
-
|
118
|
+
if empty?
|
119
|
+
[]
|
120
|
+
else
|
121
|
+
[[:multi]] + super + [[:exec]]
|
122
|
+
end
|
96
123
|
end
|
97
124
|
end
|
98
125
|
end
|
@@ -106,12 +133,25 @@ class Redis
|
|
106
133
|
class Future < BasicObject
|
107
134
|
FutureNotReady = ::Redis::FutureNotReady.new
|
108
135
|
|
109
|
-
|
136
|
+
attr_reader :timeout
|
137
|
+
|
138
|
+
def initialize(command, transformation, timeout)
|
110
139
|
@command = command
|
111
140
|
@transformation = transformation
|
141
|
+
@timeout = timeout
|
112
142
|
@object = FutureNotReady
|
113
143
|
end
|
114
144
|
|
145
|
+
def ==(_other)
|
146
|
+
message = +"The methods == and != are deprecated for Redis::Future and will be removed in 4.2.0"
|
147
|
+
message << " - You probably meant to call .value == or .value !="
|
148
|
+
message << " (#{::Kernel.caller(1, 1).first})\n"
|
149
|
+
|
150
|
+
::Kernel.warn(message)
|
151
|
+
|
152
|
+
super
|
153
|
+
end
|
154
|
+
|
115
155
|
def inspect
|
116
156
|
"<Redis::Future #{@command.inspect}>"
|
117
157
|
end
|
@@ -126,7 +166,7 @@ class Redis
|
|
126
166
|
end
|
127
167
|
|
128
168
|
def value
|
129
|
-
::Kernel.raise(@object) if @object.
|
169
|
+
::Kernel.raise(@object) if @object.is_a?(::RuntimeError)
|
130
170
|
@object
|
131
171
|
end
|
132
172
|
|
data/lib/redis/subscribe.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Redis
|
2
4
|
class SubscribedClient
|
3
5
|
def initialize(client)
|
@@ -12,10 +14,18 @@ class Redis
|
|
12
14
|
subscription("subscribe", "unsubscribe", channels, block)
|
13
15
|
end
|
14
16
|
|
17
|
+
def subscribe_with_timeout(timeout, *channels, &block)
|
18
|
+
subscription("subscribe", "unsubscribe", channels, block, timeout)
|
19
|
+
end
|
20
|
+
|
15
21
|
def psubscribe(*channels, &block)
|
16
22
|
subscription("psubscribe", "punsubscribe", channels, block)
|
17
23
|
end
|
18
24
|
|
25
|
+
def psubscribe_with_timeout(timeout, *channels, &block)
|
26
|
+
subscription("psubscribe", "punsubscribe", channels, block, timeout)
|
27
|
+
end
|
28
|
+
|
19
29
|
def unsubscribe(*channels)
|
20
30
|
call([:unsubscribe, *channels])
|
21
31
|
end
|
@@ -24,24 +34,21 @@ class Redis
|
|
24
34
|
call([:punsubscribe, *channels])
|
25
35
|
end
|
26
36
|
|
27
|
-
|
37
|
+
protected
|
28
38
|
|
29
|
-
def subscription(start, stop, channels, block)
|
39
|
+
def subscription(start, stop, channels, block, timeout = 0)
|
30
40
|
sub = Subscription.new(&block)
|
31
41
|
|
32
42
|
unsubscribed = false
|
33
43
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
break if unsubscribed
|
40
|
-
end
|
41
|
-
ensure
|
42
|
-
# No need to unsubscribe here. The real client closes the connection
|
43
|
-
# whenever an exception is raised (see #ensure_connected).
|
44
|
+
@client.call_loop([start, *channels], timeout) do |line|
|
45
|
+
type, *rest = line
|
46
|
+
sub.callbacks[type].call(*rest)
|
47
|
+
unsubscribed = type == stop && rest.last == 0
|
48
|
+
break if unsubscribed
|
44
49
|
end
|
50
|
+
# No need to unsubscribe here. The real client closes the connection
|
51
|
+
# whenever an exception is raised (see #ensure_connected).
|
45
52
|
end
|
46
53
|
end
|
47
54
|
|
@@ -50,7 +57,7 @@ class Redis
|
|
50
57
|
|
51
58
|
def initialize
|
52
59
|
@callbacks = Hash.new do |hash, key|
|
53
|
-
hash[key] =
|
60
|
+
hash[key] = ->(*_) {}
|
54
61
|
end
|
55
62
|
|
56
63
|
yield(self)
|
data/lib/redis/version.rb
CHANGED
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
|
+
version: 4.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ezra Zygmuntowicz
|
@@ -13,13 +13,13 @@ authors:
|
|
13
13
|
- Michel Martens
|
14
14
|
- Damian Janowski
|
15
15
|
- Pieter Noordhuis
|
16
|
-
autorequire:
|
16
|
+
autorequire:
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
|
-
date:
|
19
|
+
date: 2021-07-28 00:00:00.000000000 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: em-synchrony
|
23
23
|
requirement: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
@@ -33,7 +33,21 @@ dependencies:
|
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '0'
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: hiredis
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
type: :development
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: mocha
|
37
51
|
requirement: !ruby/object:Gem::Requirement
|
38
52
|
requirements:
|
39
53
|
- - ">="
|
@@ -48,42 +62,28 @@ dependencies:
|
|
48
62
|
version: '0'
|
49
63
|
description: |2
|
50
64
|
A Ruby client that tries to match Redis' API one-to-one, while still
|
51
|
-
providing an idiomatic interface.
|
52
|
-
client-side sharding, pipelining, and an obsession for performance.
|
65
|
+
providing an idiomatic interface.
|
53
66
|
email:
|
54
67
|
- redis-db@googlegroups.com
|
55
68
|
executables: []
|
56
69
|
extensions: []
|
57
70
|
extra_rdoc_files: []
|
58
71
|
files:
|
59
|
-
- ".gitignore"
|
60
|
-
- ".travis.yml"
|
61
|
-
- ".travis/Gemfile"
|
62
|
-
- ".yardopts"
|
63
72
|
- CHANGELOG.md
|
64
|
-
- Gemfile
|
65
73
|
- LICENSE
|
66
74
|
- README.md
|
67
|
-
- Rakefile
|
68
|
-
- benchmarking/logging.rb
|
69
|
-
- benchmarking/pipeline.rb
|
70
|
-
- benchmarking/speed.rb
|
71
|
-
- benchmarking/suite.rb
|
72
|
-
- benchmarking/worker.rb
|
73
|
-
- examples/basic.rb
|
74
|
-
- examples/consistency.rb
|
75
|
-
- examples/dist_redis.rb
|
76
|
-
- examples/incr-decr.rb
|
77
|
-
- examples/list.rb
|
78
|
-
- examples/pubsub.rb
|
79
|
-
- examples/sentinel.rb
|
80
|
-
- examples/sentinel/sentinel.conf
|
81
|
-
- examples/sentinel/start
|
82
|
-
- examples/sets.rb
|
83
|
-
- examples/unicorn/config.ru
|
84
|
-
- examples/unicorn/unicorn.rb
|
85
75
|
- lib/redis.rb
|
86
76
|
- lib/redis/client.rb
|
77
|
+
- lib/redis/cluster.rb
|
78
|
+
- lib/redis/cluster/command.rb
|
79
|
+
- lib/redis/cluster/command_loader.rb
|
80
|
+
- lib/redis/cluster/key_slot_converter.rb
|
81
|
+
- lib/redis/cluster/node.rb
|
82
|
+
- lib/redis/cluster/node_key.rb
|
83
|
+
- lib/redis/cluster/node_loader.rb
|
84
|
+
- lib/redis/cluster/option.rb
|
85
|
+
- lib/redis/cluster/slot.rb
|
86
|
+
- lib/redis/cluster/slot_loader.rb
|
87
87
|
- lib/redis/connection.rb
|
88
88
|
- lib/redis/connection/command_helper.rb
|
89
89
|
- lib/redis/connection/hiredis.rb
|
@@ -96,78 +96,16 @@ files:
|
|
96
96
|
- lib/redis/pipeline.rb
|
97
97
|
- lib/redis/subscribe.rb
|
98
98
|
- lib/redis/version.rb
|
99
|
-
- redis.gemspec
|
100
|
-
- test/bitpos_test.rb
|
101
|
-
- test/blocking_commands_test.rb
|
102
|
-
- test/command_map_test.rb
|
103
|
-
- test/commands_on_hashes_test.rb
|
104
|
-
- test/commands_on_hyper_log_log_test.rb
|
105
|
-
- test/commands_on_lists_test.rb
|
106
|
-
- test/commands_on_sets_test.rb
|
107
|
-
- test/commands_on_sorted_sets_test.rb
|
108
|
-
- test/commands_on_strings_test.rb
|
109
|
-
- test/commands_on_value_types_test.rb
|
110
|
-
- test/connection_handling_test.rb
|
111
|
-
- test/db/.gitkeep
|
112
|
-
- test/distributed_blocking_commands_test.rb
|
113
|
-
- test/distributed_commands_on_hashes_test.rb
|
114
|
-
- test/distributed_commands_on_hyper_log_log_test.rb
|
115
|
-
- test/distributed_commands_on_lists_test.rb
|
116
|
-
- test/distributed_commands_on_sets_test.rb
|
117
|
-
- test/distributed_commands_on_sorted_sets_test.rb
|
118
|
-
- test/distributed_commands_on_strings_test.rb
|
119
|
-
- test/distributed_commands_on_value_types_test.rb
|
120
|
-
- test/distributed_commands_requiring_clustering_test.rb
|
121
|
-
- test/distributed_connection_handling_test.rb
|
122
|
-
- test/distributed_internals_test.rb
|
123
|
-
- test/distributed_key_tags_test.rb
|
124
|
-
- test/distributed_persistence_control_commands_test.rb
|
125
|
-
- test/distributed_publish_subscribe_test.rb
|
126
|
-
- test/distributed_remote_server_control_commands_test.rb
|
127
|
-
- test/distributed_scripting_test.rb
|
128
|
-
- test/distributed_sorting_test.rb
|
129
|
-
- test/distributed_test.rb
|
130
|
-
- test/distributed_transactions_test.rb
|
131
|
-
- test/encoding_test.rb
|
132
|
-
- test/error_replies_test.rb
|
133
|
-
- test/fork_safety_test.rb
|
134
|
-
- test/helper.rb
|
135
|
-
- test/helper_test.rb
|
136
|
-
- test/internals_test.rb
|
137
|
-
- test/lint/blocking_commands.rb
|
138
|
-
- test/lint/hashes.rb
|
139
|
-
- test/lint/hyper_log_log.rb
|
140
|
-
- test/lint/lists.rb
|
141
|
-
- test/lint/sets.rb
|
142
|
-
- test/lint/sorted_sets.rb
|
143
|
-
- test/lint/strings.rb
|
144
|
-
- test/lint/value_types.rb
|
145
|
-
- test/persistence_control_commands_test.rb
|
146
|
-
- test/pipelining_commands_test.rb
|
147
|
-
- test/publish_subscribe_test.rb
|
148
|
-
- test/remote_server_control_commands_test.rb
|
149
|
-
- test/scanning_test.rb
|
150
|
-
- test/scripting_test.rb
|
151
|
-
- test/sentinel_command_test.rb
|
152
|
-
- test/sentinel_test.rb
|
153
|
-
- test/sorting_test.rb
|
154
|
-
- test/support/connection/hiredis.rb
|
155
|
-
- test/support/connection/ruby.rb
|
156
|
-
- test/support/connection/synchrony.rb
|
157
|
-
- test/support/redis_mock.rb
|
158
|
-
- test/support/wire/synchrony.rb
|
159
|
-
- test/support/wire/thread.rb
|
160
|
-
- test/synchrony_driver.rb
|
161
|
-
- test/test.conf.erb
|
162
|
-
- test/thread_safety_test.rb
|
163
|
-
- test/transactions_test.rb
|
164
|
-
- test/unknown_commands_test.rb
|
165
|
-
- test/url_param_test.rb
|
166
99
|
homepage: https://github.com/redis/redis-rb
|
167
100
|
licenses:
|
168
101
|
- MIT
|
169
|
-
metadata:
|
170
|
-
|
102
|
+
metadata:
|
103
|
+
bug_tracker_uri: https://github.com/redis/redis-rb/issues
|
104
|
+
changelog_uri: https://github.com/redis/redis-rb/blob/master/CHANGELOG.md
|
105
|
+
documentation_uri: https://www.rubydoc.info/gems/redis/4.4.0
|
106
|
+
homepage_uri: https://github.com/redis/redis-rb
|
107
|
+
source_code_uri: https://github.com/redis/redis-rb/tree/v4.4.0
|
108
|
+
post_install_message:
|
171
109
|
rdoc_options: []
|
172
110
|
require_paths:
|
173
111
|
- lib
|
@@ -175,82 +113,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
175
113
|
requirements:
|
176
114
|
- - ">="
|
177
115
|
- !ruby/object:Gem::Version
|
178
|
-
version:
|
116
|
+
version: 2.3.0
|
179
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
118
|
requirements:
|
181
119
|
- - ">="
|
182
120
|
- !ruby/object:Gem::Version
|
183
121
|
version: '0'
|
184
122
|
requirements: []
|
185
|
-
|
186
|
-
|
187
|
-
signing_key:
|
123
|
+
rubygems_version: 3.1.2
|
124
|
+
signing_key:
|
188
125
|
specification_version: 4
|
189
126
|
summary: A Ruby client library for Redis
|
190
|
-
test_files:
|
191
|
-
- test/bitpos_test.rb
|
192
|
-
- test/blocking_commands_test.rb
|
193
|
-
- test/command_map_test.rb
|
194
|
-
- test/commands_on_hashes_test.rb
|
195
|
-
- test/commands_on_hyper_log_log_test.rb
|
196
|
-
- test/commands_on_lists_test.rb
|
197
|
-
- test/commands_on_sets_test.rb
|
198
|
-
- test/commands_on_sorted_sets_test.rb
|
199
|
-
- test/commands_on_strings_test.rb
|
200
|
-
- test/commands_on_value_types_test.rb
|
201
|
-
- test/connection_handling_test.rb
|
202
|
-
- test/db/.gitkeep
|
203
|
-
- test/distributed_blocking_commands_test.rb
|
204
|
-
- test/distributed_commands_on_hashes_test.rb
|
205
|
-
- test/distributed_commands_on_hyper_log_log_test.rb
|
206
|
-
- test/distributed_commands_on_lists_test.rb
|
207
|
-
- test/distributed_commands_on_sets_test.rb
|
208
|
-
- test/distributed_commands_on_sorted_sets_test.rb
|
209
|
-
- test/distributed_commands_on_strings_test.rb
|
210
|
-
- test/distributed_commands_on_value_types_test.rb
|
211
|
-
- test/distributed_commands_requiring_clustering_test.rb
|
212
|
-
- test/distributed_connection_handling_test.rb
|
213
|
-
- test/distributed_internals_test.rb
|
214
|
-
- test/distributed_key_tags_test.rb
|
215
|
-
- test/distributed_persistence_control_commands_test.rb
|
216
|
-
- test/distributed_publish_subscribe_test.rb
|
217
|
-
- test/distributed_remote_server_control_commands_test.rb
|
218
|
-
- test/distributed_scripting_test.rb
|
219
|
-
- test/distributed_sorting_test.rb
|
220
|
-
- test/distributed_test.rb
|
221
|
-
- test/distributed_transactions_test.rb
|
222
|
-
- test/encoding_test.rb
|
223
|
-
- test/error_replies_test.rb
|
224
|
-
- test/fork_safety_test.rb
|
225
|
-
- test/helper.rb
|
226
|
-
- test/helper_test.rb
|
227
|
-
- test/internals_test.rb
|
228
|
-
- test/lint/blocking_commands.rb
|
229
|
-
- test/lint/hashes.rb
|
230
|
-
- test/lint/hyper_log_log.rb
|
231
|
-
- test/lint/lists.rb
|
232
|
-
- test/lint/sets.rb
|
233
|
-
- test/lint/sorted_sets.rb
|
234
|
-
- test/lint/strings.rb
|
235
|
-
- test/lint/value_types.rb
|
236
|
-
- test/persistence_control_commands_test.rb
|
237
|
-
- test/pipelining_commands_test.rb
|
238
|
-
- test/publish_subscribe_test.rb
|
239
|
-
- test/remote_server_control_commands_test.rb
|
240
|
-
- test/scanning_test.rb
|
241
|
-
- test/scripting_test.rb
|
242
|
-
- test/sentinel_command_test.rb
|
243
|
-
- test/sentinel_test.rb
|
244
|
-
- test/sorting_test.rb
|
245
|
-
- test/support/connection/hiredis.rb
|
246
|
-
- test/support/connection/ruby.rb
|
247
|
-
- test/support/connection/synchrony.rb
|
248
|
-
- test/support/redis_mock.rb
|
249
|
-
- test/support/wire/synchrony.rb
|
250
|
-
- test/support/wire/thread.rb
|
251
|
-
- test/synchrony_driver.rb
|
252
|
-
- test/test.conf.erb
|
253
|
-
- test/thread_safety_test.rb
|
254
|
-
- test/transactions_test.rb
|
255
|
-
- test/unknown_commands_test.rb
|
256
|
-
- test/url_param_test.rb
|
127
|
+
test_files: []
|