redis 3.3.5 → 5.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +290 -2
  3. data/README.md +146 -146
  4. data/lib/redis/client.rb +79 -541
  5. data/lib/redis/commands/bitmaps.rb +66 -0
  6. data/lib/redis/commands/cluster.rb +28 -0
  7. data/lib/redis/commands/connection.rb +53 -0
  8. data/lib/redis/commands/geo.rb +84 -0
  9. data/lib/redis/commands/hashes.rb +254 -0
  10. data/lib/redis/commands/hyper_log_log.rb +37 -0
  11. data/lib/redis/commands/keys.rb +437 -0
  12. data/lib/redis/commands/lists.rb +339 -0
  13. data/lib/redis/commands/pubsub.rb +54 -0
  14. data/lib/redis/commands/scripting.rb +114 -0
  15. data/lib/redis/commands/server.rb +188 -0
  16. data/lib/redis/commands/sets.rb +214 -0
  17. data/lib/redis/commands/sorted_sets.rb +884 -0
  18. data/lib/redis/commands/streams.rb +402 -0
  19. data/lib/redis/commands/strings.rb +314 -0
  20. data/lib/redis/commands/transactions.rb +115 -0
  21. data/lib/redis/commands.rb +237 -0
  22. data/lib/redis/distributed.rb +328 -108
  23. data/lib/redis/errors.rb +23 -1
  24. data/lib/redis/hash_ring.rb +36 -79
  25. data/lib/redis/pipeline.rb +69 -83
  26. data/lib/redis/subscribe.rb +26 -19
  27. data/lib/redis/version.rb +3 -1
  28. data/lib/redis.rb +115 -2695
  29. metadata +38 -218
  30. data/.gitignore +0 -16
  31. data/.travis/Gemfile +0 -11
  32. data/.travis.yml +0 -89
  33. data/.yardopts +0 -3
  34. data/Gemfile +0 -4
  35. data/Rakefile +0 -87
  36. data/benchmarking/logging.rb +0 -71
  37. data/benchmarking/pipeline.rb +0 -51
  38. data/benchmarking/speed.rb +0 -21
  39. data/benchmarking/suite.rb +0 -24
  40. data/benchmarking/worker.rb +0 -71
  41. data/examples/basic.rb +0 -15
  42. data/examples/consistency.rb +0 -114
  43. data/examples/dist_redis.rb +0 -43
  44. data/examples/incr-decr.rb +0 -17
  45. data/examples/list.rb +0 -26
  46. data/examples/pubsub.rb +0 -37
  47. data/examples/sentinel/sentinel.conf +0 -9
  48. data/examples/sentinel/start +0 -49
  49. data/examples/sentinel.rb +0 -41
  50. data/examples/sets.rb +0 -36
  51. data/examples/unicorn/config.ru +0 -3
  52. data/examples/unicorn/unicorn.rb +0 -20
  53. data/lib/redis/connection/command_helper.rb +0 -44
  54. data/lib/redis/connection/hiredis.rb +0 -66
  55. data/lib/redis/connection/registry.rb +0 -12
  56. data/lib/redis/connection/ruby.rb +0 -429
  57. data/lib/redis/connection/synchrony.rb +0 -133
  58. data/lib/redis/connection.rb +0 -9
  59. data/redis.gemspec +0 -44
  60. data/test/bitpos_test.rb +0 -69
  61. data/test/blocking_commands_test.rb +0 -42
  62. data/test/client_test.rb +0 -59
  63. data/test/command_map_test.rb +0 -30
  64. data/test/commands_on_hashes_test.rb +0 -21
  65. data/test/commands_on_hyper_log_log_test.rb +0 -21
  66. data/test/commands_on_lists_test.rb +0 -20
  67. data/test/commands_on_sets_test.rb +0 -77
  68. data/test/commands_on_sorted_sets_test.rb +0 -137
  69. data/test/commands_on_strings_test.rb +0 -101
  70. data/test/commands_on_value_types_test.rb +0 -133
  71. data/test/connection_handling_test.rb +0 -277
  72. data/test/connection_test.rb +0 -57
  73. data/test/db/.gitkeep +0 -0
  74. data/test/distributed_blocking_commands_test.rb +0 -46
  75. data/test/distributed_commands_on_hashes_test.rb +0 -10
  76. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  77. data/test/distributed_commands_on_lists_test.rb +0 -22
  78. data/test/distributed_commands_on_sets_test.rb +0 -83
  79. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  80. data/test/distributed_commands_on_strings_test.rb +0 -59
  81. data/test/distributed_commands_on_value_types_test.rb +0 -95
  82. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  83. data/test/distributed_connection_handling_test.rb +0 -23
  84. data/test/distributed_internals_test.rb +0 -79
  85. data/test/distributed_key_tags_test.rb +0 -52
  86. data/test/distributed_persistence_control_commands_test.rb +0 -26
  87. data/test/distributed_publish_subscribe_test.rb +0 -92
  88. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  89. data/test/distributed_scripting_test.rb +0 -102
  90. data/test/distributed_sorting_test.rb +0 -20
  91. data/test/distributed_test.rb +0 -58
  92. data/test/distributed_transactions_test.rb +0 -32
  93. data/test/encoding_test.rb +0 -18
  94. data/test/error_replies_test.rb +0 -59
  95. data/test/fork_safety_test.rb +0 -65
  96. data/test/helper.rb +0 -232
  97. data/test/helper_test.rb +0 -24
  98. data/test/internals_test.rb +0 -417
  99. data/test/lint/blocking_commands.rb +0 -150
  100. data/test/lint/hashes.rb +0 -162
  101. data/test/lint/hyper_log_log.rb +0 -60
  102. data/test/lint/lists.rb +0 -143
  103. data/test/lint/sets.rb +0 -140
  104. data/test/lint/sorted_sets.rb +0 -316
  105. data/test/lint/strings.rb +0 -260
  106. data/test/lint/value_types.rb +0 -122
  107. data/test/persistence_control_commands_test.rb +0 -26
  108. data/test/pipelining_commands_test.rb +0 -242
  109. data/test/publish_subscribe_test.rb +0 -282
  110. data/test/remote_server_control_commands_test.rb +0 -118
  111. data/test/scanning_test.rb +0 -413
  112. data/test/scripting_test.rb +0 -78
  113. data/test/sentinel_command_test.rb +0 -80
  114. data/test/sentinel_test.rb +0 -255
  115. data/test/sorting_test.rb +0 -59
  116. data/test/ssl_test.rb +0 -73
  117. data/test/support/connection/hiredis.rb +0 -1
  118. data/test/support/connection/ruby.rb +0 -1
  119. data/test/support/connection/synchrony.rb +0 -17
  120. data/test/support/redis_mock.rb +0 -130
  121. data/test/support/ssl/gen_certs.sh +0 -31
  122. data/test/support/ssl/trusted-ca.crt +0 -25
  123. data/test/support/ssl/trusted-ca.key +0 -27
  124. data/test/support/ssl/trusted-cert.crt +0 -81
  125. data/test/support/ssl/trusted-cert.key +0 -28
  126. data/test/support/ssl/untrusted-ca.crt +0 -26
  127. data/test/support/ssl/untrusted-ca.key +0 -27
  128. data/test/support/ssl/untrusted-cert.crt +0 -82
  129. data/test/support/ssl/untrusted-cert.key +0 -28
  130. data/test/support/wire/synchrony.rb +0 -24
  131. data/test/support/wire/thread.rb +0 -5
  132. data/test/synchrony_driver.rb +0 -88
  133. data/test/test.conf.erb +0 -9
  134. data/test/thread_safety_test.rb +0 -62
  135. data/test/transactions_test.rb +0 -264
  136. data/test/unknown_commands_test.rb +0 -14
  137. data/test/url_param_test.rb +0 -138
data/README.md CHANGED
@@ -1,46 +1,17 @@
1
- # redis-rb [![Build Status][travis-image]][travis-link] [![Inline docs][inchpages-image]][inchpages-link]
1
+ # redis-rb [![Build Status][gh-actions-image]][gh-actions-link] [![Inline docs][rdoc-master-image]][rdoc-master-link]
2
2
 
3
- [travis-image]: https://secure.travis-ci.org/redis/redis-rb.png?branch=master
4
- [travis-link]: http://travis-ci.org/redis/redis-rb
5
- [travis-home]: http://travis-ci.org/
6
- [inchpages-image]: http://inch-ci.org/github/redis/redis-rb.png
7
- [inchpages-link]: http://inch-ci.org/github/redis/redis-rb
3
+ A Ruby client that tries to match [Redis][redis-home]' API one-to-one, while still providing an idiomatic interface.
8
4
 
9
- A Ruby client library for [Redis][redis-home].
10
-
11
- [redis-home]: http://redis.io
12
-
13
- A Ruby client that tries to match Redis' API one-to-one, while still
14
- providing an idiomatic interface. It features thread-safety, client-side
15
- sharding, pipelining, and an obsession for performance.
16
-
17
- ## Upgrading from 2.x to 3.0
18
-
19
- Please refer to the [CHANGELOG][changelog-3.0.0] for a summary of the
20
- most important changes, as well as a full list of changes.
21
-
22
- [changelog-3.0.0]: https://github.com/redis/redis-rb/blob/master/CHANGELOG.md#300
5
+ See [RubyDoc.info][rubydoc] for the API docs of the latest published gem.
23
6
 
24
7
  ## Getting started
25
8
 
26
- To install **redis-rb**, run the following command:
27
-
28
- ```
29
- gem install redis
30
- ```
31
-
32
- Or if you are using **bundler**, add
9
+ Install with:
33
10
 
34
11
  ```
35
- gem 'redis', '~>3.2'
12
+ $ gem install redis
36
13
  ```
37
14
 
38
- to your `Gemfile`, and run `bundle install`
39
-
40
- As of version 2.0 this client only targets Redis version 2.0 and higher.
41
- You can use an older version of this client if you need to interface
42
- with a Redis instance older than 2.0, but this is no longer supported.
43
-
44
15
  You can connect to Redis by instantiating the `Redis` class:
45
16
 
46
17
  ```ruby
@@ -54,31 +25,34 @@ listening on `localhost`, port 6379. If you need to connect to a remote
54
25
  server or a different port, try:
55
26
 
56
27
  ```ruby
57
- redis = Redis.new(:host => "10.0.1.1", :port => 6380, :db => 15)
28
+ redis = Redis.new(host: "10.0.1.1", port: 6380, db: 15)
58
29
  ```
59
30
 
60
31
  You can also specify connection options as a [`redis://` URL][redis-url]:
61
32
 
62
33
  ```ruby
63
- redis = Redis.new(:url => "redis://:p4ssw0rd@10.0.1.1:6380/15")
34
+ redis = Redis.new(url: "redis://:p4ssw0rd@10.0.1.1:6380/15")
64
35
  ```
65
36
 
66
- [redis-url]: http://www.iana.org/assignments/uri-schemes/prov/redis
67
-
68
- By default, the client will try to read the `REDIS_URL` environment variable
69
- and use that as URL to connect to. The above statement is therefore equivalent
70
- to setting this environment variable and calling `Redis.new` without arguments.
37
+ The client expects passwords with special chracters to be URL-encoded (i.e.
38
+ `CGI.escape(password)`).
71
39
 
72
40
  To connect to Redis listening on a Unix socket, try:
73
41
 
74
42
  ```ruby
75
- redis = Redis.new(:path => "/tmp/redis.sock")
43
+ redis = Redis.new(path: "/tmp/redis.sock")
76
44
  ```
77
45
 
78
46
  To connect to a password protected Redis instance, use:
79
47
 
80
48
  ```ruby
81
- redis = Redis.new(:password => "mysecret")
49
+ redis = Redis.new(password: "mysecret")
50
+ ```
51
+
52
+ To connect a Redis instance using [ACL](https://redis.io/topics/acl), use:
53
+
54
+ ```ruby
55
+ redis = Redis.new(username: 'myname', password: 'mysecret')
82
56
  ```
83
57
 
84
58
  The Redis class exports methods that are named identical to the commands
@@ -86,8 +60,6 @@ they execute. The arguments these methods accept are often identical to
86
60
  the arguments specified on the [Redis website][redis-commands]. For
87
61
  instance, the `SET` and `GET` commands can be called like this:
88
62
 
89
- [redis-commands]: http://redis.io/commands
90
-
91
63
  ```ruby
92
64
  redis.set("mykey", "hello world")
93
65
  # => "OK"
@@ -96,24 +68,42 @@ redis.get("mykey")
96
68
  # => "hello world"
97
69
  ```
98
70
 
99
- All commands, their arguments and return values are documented, and
100
- available on [rdoc.info][rdoc].
71
+ All commands, their arguments, and return values are documented and
72
+ available on [RubyDoc.info][rubydoc].
73
+
74
+ ## Connection Pooling and Thread safety
75
+
76
+ The client does not provide connection pooling. Each `Redis` instance
77
+ has one and only one connection to the server, and use of this connection
78
+ is protected by a mutex.
79
+
80
+ As such it is heavilly recommended to use the [`connection_pool` gem](https://github.com/mperham/connection_pool), e.g.:
81
+
82
+ ```ruby
83
+ module MyApp
84
+ def self.redis
85
+ @redis ||= ConnectionPool::Wrapper.new do
86
+ Redis.new(url: ENV["REDIS_URL"])
87
+ end
88
+ end
89
+ end
101
90
 
102
- [rdoc]: http://rdoc.info/github/redis/redis-rb/
91
+ MyApp.redis.incr("some-counter")
92
+ ```
103
93
 
104
94
  ## Sentinel support
105
95
 
106
- The client is able to perform automatic failovers by using [Redis
96
+ The client is able to perform automatic failover by using [Redis
107
97
  Sentinel](http://redis.io/topics/sentinel). Make sure to run Redis 2.8+
108
98
  if you want to use this feature.
109
99
 
110
100
  To connect using Sentinel, use:
111
101
 
112
102
  ```ruby
113
- SENTINELS = [{:host => "127.0.0.1", :port => 26380},
114
- {:host => "127.0.0.1", :port => 26381}]
103
+ SENTINELS = [{ host: "127.0.0.1", port: 26380 },
104
+ { host: "127.0.0.1", port: 26381 }]
115
105
 
116
- redis = Redis.new(:url => "redis://mymaster", :sentinels => SENTINELS, :role => :master)
106
+ redis = Redis.new(name: "mymaster", sentinels: SENTINELS, role: :master)
117
107
  ```
118
108
 
119
109
  * The master name identifies a group of Redis instances composed of a master
@@ -130,21 +120,25 @@ but a few so that if one is down the client will try the next one. The client
130
120
  is able to remember the last Sentinel that was able to reply correctly and will
131
121
  use it for the next requests.
132
122
 
133
- ## Storing objects
134
-
135
- Redis only stores strings as values. If you want to store an object, you
136
- can use a serialization mechanism such as JSON:
123
+ If you want to [authenticate](https://redis.io/topics/sentinel#configuring-sentinel-instances-with-authentication) Sentinel itself, you must specify the `password` option per instance.
137
124
 
138
125
  ```ruby
139
- require "json"
126
+ SENTINELS = [{ host: '127.0.0.1', port: 26380, password: 'mysecret' },
127
+ { host: '127.0.0.1', port: 26381, password: 'mysecret' }]
128
+
129
+ redis = Redis.new(name: 'mymaster', sentinels: SENTINELS, role: :master)
130
+ ```
140
131
 
141
- redis.set "foo", [1, 2, 3].to_json
142
- # => OK
132
+ Also the name can be passed as an url:
143
133
 
144
- JSON.parse(redis.get("foo"))
145
- # => [1, 2, 3]
134
+ ```ruby
135
+ redis = Redis.new(name: "redis://mymaster", sentinels: SENTINELS, role: :master)
146
136
  ```
147
137
 
138
+ ## Cluster support
139
+
140
+ [Clustering](https://redis.io/topics/cluster-spec). is supported via the [`redis-clustering` gem](cluster/).
141
+
148
142
  ## Pipelining
149
143
 
150
144
  When multiple commands are executed sequentially, but are not dependent,
@@ -159,13 +153,24 @@ commands to Redis and gathers their replies. These replies are returned
159
153
  by the `#pipelined` method.
160
154
 
161
155
  ```ruby
162
- redis.pipelined do
163
- redis.set "foo", "bar"
164
- redis.incr "baz"
156
+ redis.pipelined do |pipeline|
157
+ pipeline.set "foo", "bar"
158
+ pipeline.incr "baz"
165
159
  end
166
160
  # => ["OK", 1]
167
161
  ```
168
162
 
163
+ Commands must be called on the yielded objects. If you call methods
164
+ on the original client objects from inside a pipeline, they will be sent immediately:
165
+
166
+ ```ruby
167
+ redis.pipelined do |pipeline|
168
+ pipeline.set "foo", "bar"
169
+ redis.incr "baz" # => 1
170
+ end
171
+ # => ["OK"]
172
+ ```
173
+
169
174
  ### Executing commands atomically
170
175
 
171
176
  You can use `MULTI/EXEC` to run a number of commands in an atomic
@@ -175,9 +180,9 @@ the regular pipeline, the replies to the commands are returned by the
175
180
  `#multi` method.
176
181
 
177
182
  ```ruby
178
- redis.multi do
179
- redis.set "foo", "bar"
180
- redis.incr "baz"
183
+ redis.multi do |transaction|
184
+ transaction.set "foo", "bar"
185
+ transaction.incr "baz"
181
186
  end
182
187
  # => ["OK", 1]
183
188
  ```
@@ -185,21 +190,22 @@ end
185
190
  ### Futures
186
191
 
187
192
  Replies to commands in a pipeline can be accessed via the *futures* they
188
- emit (since redis-rb 3.0). All calls inside a pipeline block return a
193
+ emit. All calls on the pipeline object return a
189
194
  `Future` object, which responds to the `#value` method. When the
190
195
  pipeline has successfully executed, all futures are assigned their
191
196
  respective replies and can be used.
192
197
 
193
198
  ```ruby
194
- redis.pipelined do
195
- @set = redis.set "foo", "bar"
196
- @incr = redis.incr "baz"
199
+ set = incr = nil
200
+ redis.pipelined do |pipeline|
201
+ set = pipeline.set "foo", "bar"
202
+ incr = pipeline.incr "baz"
197
203
  end
198
204
 
199
- @set.value
205
+ set.value
200
206
  # => "OK"
201
207
 
202
- @incr.value
208
+ incr.value
203
209
  # => 1
204
210
  ```
205
211
 
@@ -211,7 +217,7 @@ it can't connect to the server a `Redis::CannotConnectError` error will be raise
211
217
  ```ruby
212
218
  begin
213
219
  redis.ping
214
- rescue Exception => e
220
+ rescue Redis::BaseError => e
215
221
  e.inspect
216
222
  # => #<Redis::CannotConnectError: Timed out connecting to Redis on 10.0.1.1:6380>
217
223
 
@@ -246,6 +252,7 @@ All timeout values are specified in seconds.
246
252
  When using pub/sub, you can subscribe to a channel using a timeout as well:
247
253
 
248
254
  ```ruby
255
+ redis = Redis.new(reconnect_attempts: 0)
249
256
  redis.subscribe_with_timeout(5, "news") do |on|
250
257
  on.message do |channel, message|
251
258
  # ...
@@ -255,14 +262,41 @@ end
255
262
 
256
263
  If no message is received after 5 seconds, the client will unsubscribe.
257
264
 
265
+ ## Reconnections
258
266
 
259
- ## SSL/TLS Support
267
+ **By default**, this gem will only **retry a connection once** and then fail, but
268
+ the client allows you to configure how many `reconnect_attempts` it should
269
+ complete before declaring a connection as failed.
270
+
271
+ ```ruby
272
+ Redis.new(reconnect_attempts: 0)
273
+ Redis.new(reconnect_attempts: 3)
274
+ ```
275
+
276
+ If you wish to wait between reconnection attempts, you can instead pass a list
277
+ of durations:
278
+
279
+ ```ruby
280
+ Redis.new(reconnect_attempts: [
281
+ 0, # retry immediately
282
+ 0.25, # retry a second time after 250ms
283
+ 1, # retry a third and final time after another 1s
284
+ ])
285
+ ```
286
+
287
+ If you wish to disable reconnection only for some commands, you can use
288
+ `disable_reconnection`:
289
+
290
+ ```ruby
291
+ redis.get("some-key") # this may be retried
292
+ redis.disable_reconnection do
293
+ redis.incr("some-counter") # this won't be retried.
294
+ end
295
+ ```
260
296
 
261
- This library supports natively terminating client side SSL/TLS connections
262
- when talking to Redis via a server-side proxy such as [stunnel], [hitch],
263
- or [ghostunnel].
297
+ ## SSL/TLS Support
264
298
 
265
- To enable SSL support, pass the `:ssl => :true` option when configuring the
299
+ To enable SSL support, pass the `:ssl => true` option when configuring the
266
300
  Redis client, or pass in `:url => "rediss://..."` (like HTTPS for Redis).
267
301
  You will also need to pass in an `:ssl_params => { ... }` hash used to
268
302
  configure the `OpenSSL::SSL::SSLContext` object used for the connection:
@@ -295,13 +329,7 @@ redis = Redis.new(
295
329
  )
296
330
  ```
297
331
 
298
- [stunnel]: https://www.stunnel.org/
299
- [hitch]: https://hitch-tls.org/
300
- [ghostunnel]: https://github.com/square/ghostunnel
301
- [OpenSSL::SSL::SSLContext documentation]: http://ruby-doc.org/stdlib-2.3.0/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html
302
-
303
- *NOTE:* SSL is only supported by the default "Ruby" driver
304
-
332
+ [OpenSSL::SSL::SSLContext documentation]: http://ruby-doc.org/stdlib-2.5.0/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html
305
333
 
306
334
  ## Expert-Mode Options
307
335
 
@@ -315,17 +343,9 @@ redis = Redis.new(
315
343
  Improper use of `inherit_socket` will result in corrupted and/or incorrect
316
344
  responses.
317
345
 
318
- ## Alternate drivers
346
+ ## hiredis binding
319
347
 
320
348
  By default, redis-rb uses Ruby's socket library to talk with Redis.
321
- To use an alternative connection driver it should be specified as option
322
- when instantiating the client object. These instructions are only valid
323
- for **redis-rb 3.0**. For instructions on how to use alternate drivers from
324
- **redis-rb 2.2**, please refer to an [older README][readme-2.2.2].
325
-
326
- [readme-2.2.2]: https://github.com/redis/redis-rb/blob/v2.2.2/README.md
327
-
328
- ### hiredis
329
349
 
330
350
  The hiredis driver uses the connection facility of hiredis-rb. In turn,
331
351
  hiredis-rb is a binding to the official hiredis client library. It
@@ -335,76 +355,56 @@ extension, JRuby is not supported (by default).
335
355
  It is best to use hiredis when you have large replies (for example:
336
356
  `LRANGE`, `SMEMBERS`, `ZRANGE`, etc.) and/or use big pipelines.
337
357
 
338
- In your Gemfile, include hiredis:
358
+ In your Gemfile, include `hiredis-client`:
339
359
 
340
360
  ```ruby
341
- gem "redis", "~> 3.0.1"
342
- gem "hiredis", "~> 0.4.5"
361
+ gem "redis"
362
+ gem "hiredis-client"
343
363
  ```
344
364
 
345
- When instantiating the client object, specify hiredis:
365
+ If your application doesn't call `Bundler.require`, you may have
366
+ to require it explictly:
346
367
 
347
368
  ```ruby
348
- redis = Redis.new(:driver => :hiredis)
349
- ```
350
-
351
- ### synchrony
369
+ require "hiredis-client"
370
+ ````
352
371
 
353
- The synchrony driver adds support for [em-synchrony][em-synchrony].
354
- This makes redis-rb work with EventMachine's asynchronous I/O, while not
355
- changing the exposed API. The hiredis gem needs to be available as
356
- well, because the synchrony driver uses hiredis for parsing the Redis
357
- protocol.
372
+ This makes the hiredis driver the default.
358
373
 
359
- [em-synchrony]: https://github.com/igrigorik/em-synchrony
360
-
361
- In your Gemfile, include em-synchrony and hiredis:
362
-
363
- ```ruby
364
- gem "redis", "~> 3.0.1"
365
- gem "hiredis", "~> 0.4.5"
366
- gem "em-synchrony"
367
- ```
368
-
369
- When instantiating the client object, specify synchrony:
374
+ If you want to be certain hiredis is being used, when instantiating
375
+ the client object, specify hiredis:
370
376
 
371
377
  ```ruby
372
- redis = Redis.new(:driver => :synchrony)
378
+ redis = Redis.new(driver: :hiredis)
373
379
  ```
374
380
 
375
381
  ## Testing
376
382
 
377
- This library is tested using [Travis][travis-home], where it is tested
378
- against the following interpreters and drivers:
383
+ This library is tested against recent Ruby and Redis versions.
384
+ Check [Github Actions][gh-actions-link] for the exact versions supported.
385
+
386
+ ## See Also
379
387
 
380
- * MRI 1.8.7 (drivers: ruby, hiredis)
381
- * MRI 1.9.3 (drivers: ruby, hiredis, synchrony)
382
- * MRI 2.0 (drivers: ruby, hiredis, synchrony)
383
- * MRI 2.1 (drivers: ruby, hiredis, synchrony)
384
- * MRI 2.2 (drivers: ruby, hiredis, synchrony)
385
- * MRI 2.3 (drivers: ruby, hiredis, synchrony)
386
- * JRuby 1.7 (1.8 mode) (drivers: ruby)
387
- * JRuby 1.7 (1.9 mode) (drivers: ruby)
388
+ - [async-redis](https://github.com/socketry/async-redis) — An [async](https://github.com/socketry/async) compatible Redis client.
388
389
 
389
390
  ## Contributors
390
391
 
391
- (ordered chronologically with more than 5 commits, see `git shortlog -sn` for
392
- all contributors)
393
-
394
- * Ezra Zygmuntowicz
395
- * Taylor Weibley
396
- * Matthew Clark
397
- * Brian McKinney
398
- * Luca Guidi
399
- * Salvatore Sanfilippo
400
- * Chris Wanstrath
401
- * Damian Janowski
402
- * Michel Martens
403
- * Nick Quaranto
404
- * Pieter Noordhuis
405
- * Ilya Grigorik
392
+ Several people contributed to redis-rb, but we would like to especially
393
+ mention Ezra Zygmuntowicz. Ezra introduced the Ruby community to many
394
+ new cool technologies, like Redis. He wrote the first version of this
395
+ client and evangelized Redis in Rubyland. Thank you, Ezra.
406
396
 
407
397
  ## Contributing
408
398
 
409
399
  [Fork the project](https://github.com/redis/redis-rb) and send pull
410
- requests. You can also ask for help at `#redis-rb` on Freenode.
400
+ requests.
401
+
402
+
403
+ [rdoc-master-image]: https://img.shields.io/badge/docs-rdoc.info-blue.svg
404
+ [rdoc-master-link]: https://rubydoc.info/github/redis/redis-rb
405
+ [redis-commands]: https://redis.io/commands
406
+ [redis-home]: https://redis.io
407
+ [redis-url]: https://www.iana.org/assignments/uri-schemes/prov/redis
408
+ [gh-actions-image]: https://github.com/redis/redis-rb/workflows/Test/badge.svg
409
+ [gh-actions-link]: https://github.com/redis/redis-rb/actions
410
+ [rubydoc]: https://rubydoc.info/gems/redis