redis 4.2.5 → 4.3.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 +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +16 -11
- data/lib/redis.rb +17 -5
- data/lib/redis/client.rb +11 -4
- data/lib/redis/cluster.rb +1 -1
- data/lib/redis/cluster/option.rb +5 -2
- data/lib/redis/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d173abb7a6c08e1feb87c9fd5ba33a2a0d907c6d045f6959d55f3234e56ceeb
|
4
|
+
data.tar.gz: 7463d58522a3db5262eeea4b95834d82ede95cf102d2375e051cf4ada1b235c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b34ab14e41e1bd63a99319f3ee5e1e7ea0c1e89581e525dfd82b77968a834525807b025f02d8ff5df4e7a994f19cc7ee4098103c70abd78ab6c22ec435a055c
|
7
|
+
data.tar.gz: 84da776467bebb7fd59333084787e484203e55b81be5031c78b44741f2b79342cc1f6f48c1f9663b15f360a3af590783ee2f403da07a3e04486e35ba70e49e01
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# redis-rb [![Build Status][
|
1
|
+
# redis-rb [![Build Status][gh-actions-image]][gh-actions-link] [![Inline docs][inchpages-image]][inchpages-link]
|
2
2
|
|
3
3
|
A Ruby client that tries to match [Redis][redis-home]' API one-to-one, while still
|
4
4
|
providing an idiomatic interface.
|
@@ -54,6 +54,12 @@ To connect to a password protected Redis instance, use:
|
|
54
54
|
redis = Redis.new(password: "mysecret")
|
55
55
|
```
|
56
56
|
|
57
|
+
To connect a Redis instance using [ACL](https://redis.io/topics/acl), use:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
redis = Redis.new(username: 'myname', password: 'mysecret')
|
61
|
+
```
|
62
|
+
|
57
63
|
The Redis class exports methods that are named identical to the commands
|
58
64
|
they execute. The arguments these methods accept are often identical to
|
59
65
|
the arguments specified on the [Redis website][redis-commands]. For
|
@@ -440,7 +446,7 @@ redis = Redis.new(:driver => :synchrony)
|
|
440
446
|
## Testing
|
441
447
|
|
442
448
|
This library is tested against recent Ruby and Redis versions.
|
443
|
-
Check [
|
449
|
+
Check [Github Actions][gh-actions-link] for the exact versions supported.
|
444
450
|
|
445
451
|
## See Also
|
446
452
|
|
@@ -459,12 +465,11 @@ client and evangelized Redis in Rubyland. Thank you, Ezra.
|
|
459
465
|
requests.
|
460
466
|
|
461
467
|
|
462
|
-
[inchpages-image]:
|
463
|
-
[inchpages-link]:
|
464
|
-
[redis-commands]:
|
465
|
-
[redis-home]:
|
466
|
-
[redis-url]:
|
467
|
-
[
|
468
|
-
[
|
469
|
-
[
|
470
|
-
[rubydoc]: http://www.rubydoc.info/gems/redis
|
468
|
+
[inchpages-image]: https://inch-ci.org/github/redis/redis-rb.svg
|
469
|
+
[inchpages-link]: https://inch-ci.org/github/redis/redis-rb
|
470
|
+
[redis-commands]: https://redis.io/commands
|
471
|
+
[redis-home]: https://redis.io
|
472
|
+
[redis-url]: http://www.iana.org/assignments/uri-schemes/prov/redis
|
473
|
+
[gh-actions-image]: https://github.com/redis/redis-rb/workflows/Test/badge.svg
|
474
|
+
[gh-actions-link]: https://github.com/redis/redis-rb/actions
|
475
|
+
[rubydoc]: http://www.rubydoc.info/gems/redis
|
data/lib/redis.rb
CHANGED
@@ -39,6 +39,7 @@ class Redis
|
|
39
39
|
# @option options [String] :path path to server socket (overrides host and port)
|
40
40
|
# @option options [Float] :timeout (5.0) timeout in seconds
|
41
41
|
# @option options [Float] :connect_timeout (same as timeout) timeout for initial connect in seconds
|
42
|
+
# @option options [String] :username Username to authenticate against server
|
42
43
|
# @option options [String] :password Password to authenticate against server
|
43
44
|
# @option options [Integer] :db (0) Database to select after initial connect
|
44
45
|
# @option options [Symbol] :driver Driver to use, currently supported: `:ruby`, `:hiredis`, `:synchrony`
|
@@ -143,12 +144,13 @@ class Redis
|
|
143
144
|
|
144
145
|
# Authenticate to the server.
|
145
146
|
#
|
146
|
-
# @param [String]
|
147
|
-
#
|
147
|
+
# @param [Array<String>] args includes both username and password
|
148
|
+
# or only password
|
148
149
|
# @return [String] `OK`
|
149
|
-
|
150
|
+
# @see https://redis.io/commands/auth AUTH command
|
151
|
+
def auth(*args)
|
150
152
|
synchronize do |client|
|
151
|
-
client.call([:auth,
|
153
|
+
client.call([:auth, *args])
|
152
154
|
end
|
153
155
|
end
|
154
156
|
|
@@ -2636,12 +2638,13 @@ class Redis
|
|
2636
2638
|
_eval(:evalsha, args)
|
2637
2639
|
end
|
2638
2640
|
|
2639
|
-
def _scan(command, cursor, args, match: nil, count: nil, &block)
|
2641
|
+
def _scan(command, cursor, args, match: nil, count: nil, type: nil, &block)
|
2640
2642
|
# SSCAN/ZSCAN/HSCAN already prepend the key to +args+.
|
2641
2643
|
|
2642
2644
|
args << cursor
|
2643
2645
|
args << "MATCH" << match if match
|
2644
2646
|
args << "COUNT" << count if count
|
2647
|
+
args << "TYPE" << type if type
|
2645
2648
|
|
2646
2649
|
synchronize do |client|
|
2647
2650
|
client.call([command] + args, &block)
|
@@ -2656,11 +2659,15 @@ class Redis
|
|
2656
2659
|
# @example Retrieve a batch of keys matching a pattern
|
2657
2660
|
# redis.scan(4, :match => "key:1?")
|
2658
2661
|
# # => ["92", ["key:13", "key:18"]]
|
2662
|
+
# @example Retrieve a batch of keys of a certain type
|
2663
|
+
# redis.scan(92, :type => "zset")
|
2664
|
+
# # => ["173", ["sortedset:14", "sortedset:78"]]
|
2659
2665
|
#
|
2660
2666
|
# @param [String, Integer] cursor the cursor of the iteration
|
2661
2667
|
# @param [Hash] options
|
2662
2668
|
# - `:match => String`: only return keys matching the pattern
|
2663
2669
|
# - `:count => Integer`: return count keys at most per iteration
|
2670
|
+
# - `:type => String`: return keys only of the given type
|
2664
2671
|
#
|
2665
2672
|
# @return [String, Array<String>] the next cursor and all found keys
|
2666
2673
|
def scan(cursor, **options)
|
@@ -2676,10 +2683,15 @@ class Redis
|
|
2676
2683
|
# redis.scan_each(:match => "key:1?") {|key| puts key}
|
2677
2684
|
# # => key:13
|
2678
2685
|
# # => key:18
|
2686
|
+
# @example Execute block for each key of a type
|
2687
|
+
# redis.scan_each(:type => "hash") {|key| puts redis.type(key)}
|
2688
|
+
# # => "hash"
|
2689
|
+
# # => "hash"
|
2679
2690
|
#
|
2680
2691
|
# @param [Hash] options
|
2681
2692
|
# - `:match => String`: only return keys matching the pattern
|
2682
2693
|
# - `:count => Integer`: return count keys at most per iteration
|
2694
|
+
# - `:type => String`: return keys only of the given type
|
2683
2695
|
#
|
2684
2696
|
# @return [Enumerator] an enumerator for all found keys
|
2685
2697
|
def scan_each(**options, &block)
|
data/lib/redis/client.rb
CHANGED
@@ -17,6 +17,7 @@ class Redis
|
|
17
17
|
write_timeout: nil,
|
18
18
|
connect_timeout: nil,
|
19
19
|
timeout: 5.0,
|
20
|
+
username: nil,
|
20
21
|
password: nil,
|
21
22
|
db: 0,
|
22
23
|
driver: nil,
|
@@ -61,6 +62,10 @@ class Redis
|
|
61
62
|
@options[:read_timeout]
|
62
63
|
end
|
63
64
|
|
65
|
+
def username
|
66
|
+
@options[:username]
|
67
|
+
end
|
68
|
+
|
64
69
|
def password
|
65
70
|
@options[:password]
|
66
71
|
end
|
@@ -110,7 +115,7 @@ class Redis
|
|
110
115
|
# Don't try to reconnect when the connection is fresh
|
111
116
|
with_reconnect(false) do
|
112
117
|
establish_connection
|
113
|
-
call [:auth, password] if password
|
118
|
+
call [:auth, username, password].compact if username || password
|
114
119
|
call [:select, db] if db != 0
|
115
120
|
call [:client, :setname, @options[:id]] if @options[:id]
|
116
121
|
@connector.check(self)
|
@@ -131,7 +136,7 @@ class Redis
|
|
131
136
|
reply = process([command]) { read }
|
132
137
|
raise reply if reply.is_a?(CommandError)
|
133
138
|
|
134
|
-
if block_given?
|
139
|
+
if block_given? && reply != 'QUEUED'
|
135
140
|
yield reply
|
136
141
|
else
|
137
142
|
reply
|
@@ -434,7 +439,8 @@ class Redis
|
|
434
439
|
defaults[:scheme] = uri.scheme
|
435
440
|
defaults[:host] = uri.host if uri.host
|
436
441
|
defaults[:port] = uri.port if uri.port
|
437
|
-
defaults[:
|
442
|
+
defaults[:username] = CGI.unescape(uri.user) if uri.user && !uri.user.empty?
|
443
|
+
defaults[:password] = CGI.unescape(uri.password) if uri.password && !uri.password.empty?
|
438
444
|
defaults[:db] = uri.path[1..-1].to_i if uri.path
|
439
445
|
defaults[:role] = :master
|
440
446
|
else
|
@@ -510,7 +516,7 @@ class Redis
|
|
510
516
|
require_relative "connection/#{driver}"
|
511
517
|
rescue LoadError, NameError
|
512
518
|
begin
|
513
|
-
require "connection/#{driver}"
|
519
|
+
require "redis/connection/#{driver}"
|
514
520
|
rescue LoadError, NameError => error
|
515
521
|
raise "Cannot load driver #{driver.inspect}: #{error.message}"
|
516
522
|
end
|
@@ -579,6 +585,7 @@ class Redis
|
|
579
585
|
client = Client.new(@options.merge({
|
580
586
|
host: sentinel[:host] || sentinel["host"],
|
581
587
|
port: sentinel[:port] || sentinel["port"],
|
588
|
+
username: sentinel[:username] || sentinel["username"],
|
582
589
|
password: sentinel[:password] || sentinel["password"],
|
583
590
|
reconnect_attempts: 0
|
584
591
|
}))
|
data/lib/redis/cluster.rb
CHANGED
@@ -128,7 +128,7 @@ class Redis
|
|
128
128
|
def send_command(command, &block)
|
129
129
|
cmd = command.first.to_s.downcase
|
130
130
|
case cmd
|
131
|
-
when 'auth', 'bgrewriteaof', 'bgsave', 'quit', 'save'
|
131
|
+
when 'acl', 'auth', 'bgrewriteaof', 'bgsave', 'quit', 'save'
|
132
132
|
@node.call_all(command, &block).first
|
133
133
|
when 'flushall', 'flushdb'
|
134
134
|
@node.call_master(command, &block).first
|
data/lib/redis/cluster/option.rb
CHANGED
@@ -18,6 +18,7 @@ class Redis
|
|
18
18
|
@node_opts = build_node_options(node_addrs)
|
19
19
|
@replica = options.delete(:replica) == true
|
20
20
|
add_common_node_option_if_needed(options, @node_opts, :scheme)
|
21
|
+
add_common_node_option_if_needed(options, @node_opts, :username)
|
21
22
|
add_common_node_option_if_needed(options, @node_opts, :password)
|
22
23
|
@options = options
|
23
24
|
end
|
@@ -63,7 +64,9 @@ class Redis
|
|
63
64
|
raise InvalidClientOptionError, "Invalid uri scheme #{addr}" unless VALID_SCHEMES.include?(uri.scheme)
|
64
65
|
|
65
66
|
db = uri.path.split('/')[1]&.to_i
|
66
|
-
|
67
|
+
|
68
|
+
{ scheme: uri.scheme, username: uri.user, password: uri.password, host: uri.host, port: uri.port, db: db }
|
69
|
+
.reject { |_, v| v.nil? || v == '' }
|
67
70
|
rescue URI::InvalidURIError => err
|
68
71
|
raise InvalidClientOptionError, err.message
|
69
72
|
end
|
@@ -79,7 +82,7 @@ class Redis
|
|
79
82
|
|
80
83
|
# Redis cluster node returns only host and port information.
|
81
84
|
# So we should complement additional information such as:
|
82
|
-
# scheme, password and so on.
|
85
|
+
# scheme, username, password and so on.
|
83
86
|
def add_common_node_option_if_needed(options, node_opts, key)
|
84
87
|
return options if options[key].nil? && node_opts.first[key].nil?
|
85
88
|
|
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.
|
4
|
+
version: 4.3.0
|
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:
|
19
|
+
date: 2021-06-11 00:00:00.000000000 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: em-synchrony
|
@@ -102,9 +102,9 @@ licenses:
|
|
102
102
|
metadata:
|
103
103
|
bug_tracker_uri: https://github.com/redis/redis-rb/issues
|
104
104
|
changelog_uri: https://github.com/redis/redis-rb/blob/master/CHANGELOG.md
|
105
|
-
documentation_uri: https://www.rubydoc.info/gems/redis/4.
|
105
|
+
documentation_uri: https://www.rubydoc.info/gems/redis/4.3.0
|
106
106
|
homepage_uri: https://github.com/redis/redis-rb
|
107
|
-
source_code_uri: https://github.com/redis/redis-rb/tree/v4.
|
107
|
+
source_code_uri: https://github.com/redis/redis-rb/tree/v4.3.0
|
108
108
|
post_install_message:
|
109
109
|
rdoc_options: []
|
110
110
|
require_paths:
|