redis 5.0.4 → 5.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f65967c3d313cca4af20076de88097790ae39dd7935cd9ef25f6ce4d6200c0a5
4
- data.tar.gz: f744db40e4de3794921aedd4d792eb7f275c24e4bd88e8954ce4b3b56a1b2d64
3
+ metadata.gz: 7b000349da8b2f7ae8ed14909175306d2c719a9873bf1dabe05c4719ae96d0da
4
+ data.tar.gz: fdcda2f50f9d33265f7ba24d3f29a2e078fabe5240e1eaf01efae51e0b83eb0b
5
5
  SHA512:
6
- metadata.gz: 1368bd997873d59bc5910ac1d1431a53ff2fde0179c4398e35c645d3a6b605695294ff959a79940a74d54b2fc3dd1dc75d6e70636d1cf611285c5c215e64aaa5
7
- data.tar.gz: cb1b07ce5cb323b92ad50846165350ed740729f00df50cdb6a8162e961fbf5c9bda2bf83db2eff0413416e8800c8510698d46b5678f0fe74f45f0935fc1b1fff
6
+ metadata.gz: 990972ebefe548f952cbf630708298f52c1856fa5a142a341f2548bd9173f03f0106d6b745c7e39cc5baa9f084d5fea5e4c0bf42cf1d42df94e404f3558d7816
7
+ data.tar.gz: e52615e0d5b7ca9d554ffc540fdfec524d2aed74ac1c7fc3c727d3096504aa81ff43a85b9e2ce7b21da87edf21ca5f92197171ff1b1c62fa85c7551839e9df83
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Unreleased
2
2
 
3
+ # 5.0.6
4
+
5
+ - Wait for an extra `config.read_timeout` in blocking commands rather than an arbitrary 100ms. See #1175.
6
+ - Treat ReadOnlyError as ConnectionError. See #1168.
7
+
8
+ # 5.0.5
9
+
10
+ - Fix automatic disconnection when the process was forked. See #1157.
11
+
3
12
  # 5.0.4
4
13
 
5
14
  - Cast `ttl` argument to integer in `expire`, `setex` and a few others.
@@ -27,6 +36,7 @@
27
36
  - Cluster support has been moved to a `redis-clustering` companion gem.
28
37
  - `select` no longer record the current database. If the client has to reconnect after `select` was used, it will reconnect to the original database.
29
38
  - Better support Float timeout in blocking commands. See #977.
39
+ - `Redis.new` will now raise an error if provided unknown options.
30
40
  - Removed positional timeout in blocking commands (`BLPOP`, etc). Timeout now must be passed as an option: `r.blpop("key", timeout: 2.5)`
31
41
  - Removed `logger` option.
32
42
  - Removed `reconnect_delay_max` and `reconnect_delay`, you can pass precise sleep durations to `reconnect_attempts` instead.
data/README.md CHANGED
@@ -273,8 +273,8 @@ of durations:
273
273
  ```ruby
274
274
  Redis.new(reconnect_attempts: [
275
275
  0, # retry immediately
276
- 0.25 # retry a second time after 250ms
277
- 1 # retry a third and final time after another 1s
276
+ 0.25, # retry a second time after 250ms
277
+ 1, # retry a third and final time after another 1s
278
278
  ])
279
279
  ```
280
280
 
data/lib/redis/client.rb CHANGED
@@ -28,13 +28,6 @@ class Redis
28
28
  end
29
29
  end
30
30
 
31
- def initialize(*)
32
- super
33
- @inherit_socket = false
34
- @pid = nil
35
- end
36
- ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true)
37
-
38
31
  def id
39
32
  config.id
40
33
  end
@@ -85,9 +78,9 @@ class Redis
85
78
  def blocking_call_v(timeout, command, &block)
86
79
  if timeout && timeout > 0
87
80
  # Can't use the command timeout argument as the connection timeout
88
- # otherwise it would be very racy. So we add an extra 100ms to account for
89
- # the network delay.
90
- timeout += 0.1
81
+ # otherwise it would be very racy. So we add the regular read_timeout on top
82
+ # to account for the network delay.
83
+ timeout += config.read_timeout
91
84
  end
92
85
 
93
86
  super(timeout, command, &block)
@@ -115,11 +108,6 @@ class Redis
115
108
  @inherit_socket = true
116
109
  end
117
110
 
118
- def close
119
- super
120
- @pid = nil
121
- end
122
-
123
111
  private
124
112
 
125
113
  def translate_error!(error)
@@ -136,16 +124,5 @@ class Redis
136
124
  raise
137
125
  end
138
126
  end
139
-
140
- def ensure_connected(retryable: true)
141
- unless @inherit_socket || (@pid ||= Process.pid) == Process.pid
142
- raise InheritedError,
143
- "Tried to use a connection from a child process without reconnecting. " \
144
- "You need to reconnect to Redis after forking " \
145
- "or set :inherit_socket to true."
146
- end
147
-
148
- super
149
- end
150
127
  end
151
128
  end
@@ -63,7 +63,7 @@ class Redis
63
63
  #
64
64
  # @see #hmset
65
65
  def mapped_hmset(key, hash)
66
- hmset(key, hash.to_a.flatten)
66
+ hmset(key, hash.flatten)
67
67
  end
68
68
 
69
69
  # Get the value of a hash field.
@@ -34,7 +34,7 @@ class Redis
34
34
  # @example Without options
35
35
  # redis.xadd('mystream', f1: 'v1', f2: 'v2')
36
36
  # @example With options
37
- # redis.xadd('mystream', { f1: 'v1', f2: 'v2' }, id: '0-0', maxlen: 1000, approximate: true)
37
+ # redis.xadd('mystream', { f1: 'v1', f2: 'v2' }, id: '0-0', maxlen: 1000, approximate: true, nomkstream: true)
38
38
  #
39
39
  # @param key [String] the stream key
40
40
  # @param entry [Hash] one or multiple field-value pairs
@@ -43,17 +43,19 @@ class Redis
43
43
  # @option opts [String] :id the entry id, default value is `*`, it means auto generation
44
44
  # @option opts [Integer] :maxlen max length of entries
45
45
  # @option opts [Boolean] :approximate whether to add `~` modifier of maxlen or not
46
+ # @option opts [Boolean] :nomkstream whether to add NOMKSTREAM, default is not to add
46
47
  #
47
48
  # @return [String] the entry id
48
- def xadd(key, entry, approximate: nil, maxlen: nil, id: '*')
49
+ def xadd(key, entry, approximate: nil, maxlen: nil, nomkstream: nil, id: '*')
49
50
  args = [:xadd, key]
51
+ args << 'NOMKSTREAM' if nomkstream
50
52
  if maxlen
51
53
  args << "MAXLEN"
52
54
  args << "~" if approximate
53
55
  args << maxlen
54
56
  end
55
57
  args << id
56
- args.concat(entry.to_a.flatten)
58
+ args.concat(entry.flatten)
57
59
  send_command(args)
58
60
  end
59
61
 
@@ -63,14 +65,30 @@ class Redis
63
65
  # redis.xtrim('mystream', 1000)
64
66
  # @example With options
65
67
  # redis.xtrim('mystream', 1000, approximate: true)
66
- #
67
- # @param key [String] the stream key
68
- # @param mexlen [Integer] max length of entries
69
- # @param approximate [Boolean] whether to add `~` modifier of maxlen or not
68
+ # @example With strategy
69
+ # redis.xtrim('mystream', '1-0', strategy: 'MINID')
70
+ #
71
+ # @overload xtrim(key, maxlen, strategy: 'MAXLEN', approximate: true)
72
+ # @param key [String] the stream key
73
+ # @param maxlen [Integer] max length of entries
74
+ # @param strategy [String] the limit strategy, must be MAXLEN
75
+ # @param approximate [Boolean] whether to add `~` modifier of maxlen or not
76
+ # @param limit [Integer] maximum count of entries to be evicted
77
+ # @overload xtrim(key, minid, strategy: 'MINID', approximate: true)
78
+ # @param key [String] the stream key
79
+ # @param minid [String] minimum id of entries
80
+ # @param strategy [String] the limit strategy, must be MINID
81
+ # @param approximate [Boolean] whether to add `~` modifier of minid or not
82
+ # @param limit [Integer] maximum count of entries to be evicted
70
83
  #
71
84
  # @return [Integer] the number of entries actually deleted
72
- def xtrim(key, maxlen, approximate: false)
73
- args = [:xtrim, key, 'MAXLEN', (approximate ? '~' : nil), maxlen].compact
85
+ def xtrim(key, len_or_id, strategy: 'MAXLEN', approximate: false, limit: nil)
86
+ strategy = strategy.to_s.upcase
87
+
88
+ args = [:xtrim, key, strategy]
89
+ args << '~' if approximate
90
+ args << len_or_id
91
+ args.concat(['LIMIT', limit]) if limit
74
92
  send_command(args)
75
93
  end
76
94
 
@@ -152,7 +152,7 @@ class Redis
152
152
  #
153
153
  # @see #mset
154
154
  def mapped_mset(hash)
155
- mset(hash.to_a.flatten)
155
+ mset(hash.flatten)
156
156
  end
157
157
 
158
158
  # Set one or more values, only if none of the keys exist.
@@ -180,7 +180,7 @@ class Redis
180
180
  #
181
181
  # @see #msetnx
182
182
  def mapped_msetnx(hash)
183
- msetnx(hash.to_a.flatten)
183
+ msetnx(hash.flatten)
184
184
  end
185
185
 
186
186
  # Get the value of a key.
@@ -119,7 +119,9 @@ class Redis
119
119
  HashifyStreamAutoclaim = lambda { |reply|
120
120
  {
121
121
  'next' => reply[0],
122
- 'entries' => reply[1].map { |entry| [entry[0], entry[1].each_slice(2).to_h] }
122
+ 'entries' => reply[1].compact.map do |entry, values|
123
+ [entry, values.each_slice(2)&.to_h]
124
+ end
123
125
  }
124
126
  }
125
127
 
data/lib/redis/errors.rb CHANGED
@@ -26,9 +26,6 @@ class Redis
26
26
  class WrongTypeError < CommandError
27
27
  end
28
28
 
29
- class ReadOnlyError < CommandError
30
- end
31
-
32
29
  class OutOfMemoryError < CommandError
33
30
  end
34
31
 
@@ -52,6 +49,10 @@ class Redis
52
49
  class InheritedError < BaseConnectionError
53
50
  end
54
51
 
52
+ # Generally raised during Redis failover scenarios
53
+ class ReadOnlyError < BaseConnectionError
54
+ end
55
+
55
56
  # Raised when client options are invalid.
56
57
  class InvalidClientOptionError < BaseError
57
58
  end
data/lib/redis/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Redis
4
- VERSION = '5.0.4'
4
+ VERSION = '5.0.6'
5
5
  end
data/lib/redis.rb CHANGED
@@ -133,7 +133,7 @@ class Redis
133
133
 
134
134
  def initialize_client(options)
135
135
  if options.key?(:cluster)
136
- raise "Redis Cluster support was moved to the `redis_cluster` gem."
136
+ raise "Redis Cluster support was moved to the `redis-clustering` gem."
137
137
  end
138
138
 
139
139
  if options.key?(:sentinels)
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: 5.0.4
4
+ version: 5.0.6
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: 2022-09-09 00:00:00.000000000 Z
19
+ date: 2023-01-16 00:00:00.000000000 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: redis-client
@@ -24,14 +24,14 @@ dependencies:
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: 0.7.4
27
+ version: 0.9.0
28
28
  type: :runtime
29
29
  prerelease: false
30
30
  version_requirements: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: 0.7.4
34
+ version: 0.9.0
35
35
  description: |2
36
36
  A Ruby client that tries to match Redis' API one-to-one, while still
37
37
  providing an idiomatic interface.
@@ -75,9 +75,9 @@ licenses:
75
75
  metadata:
76
76
  bug_tracker_uri: https://github.com/redis/redis-rb/issues
77
77
  changelog_uri: https://github.com/redis/redis-rb/blob/master/CHANGELOG.md
78
- documentation_uri: https://www.rubydoc.info/gems/redis/5.0.4
78
+ documentation_uri: https://www.rubydoc.info/gems/redis/5.0.6
79
79
  homepage_uri: https://github.com/redis/redis-rb
80
- source_code_uri: https://github.com/redis/redis-rb/tree/v5.0.4
80
+ source_code_uri: https://github.com/redis/redis-rb/tree/v5.0.6
81
81
  post_install_message:
82
82
  rdoc_options: []
83
83
  require_paths: