async-redis 0.10.0 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 31704f6caaeffba85223e9917ac746128c05862b53738ab42d03f0c91bd808c3
4
- data.tar.gz: 72afd9739ce773d441870c238e9f2600a6ac3e3d46b13bb66c3a7f3febf3f4d6
3
+ metadata.gz: da847e343c291506a20337eec6170867a0e0bf295b713ece60fd7f48928d873f
4
+ data.tar.gz: 2ea6e2720f556084f57415501a1964c0bb2a93a411a9cb52138dbb8ed141c45b
5
5
  SHA512:
6
- metadata.gz: 5b12190eab39bba378d6ca1793abd3e56ab513a13af4bedfbb332d3d7e869d5b61c9d3958eaa96f22987e341e50b6acdc018c84c1d88effea3fee72fd132a7fe
7
- data.tar.gz: '086307e4ec9c27d407cce2e61e99c6b4712e1d1fb3b8bca660c7e1a4270a9aa9061c36dd5a801e3edfa42eb52a6f41a41c858830ccc7e673e38917d0a4f9e700'
6
+ metadata.gz: 9ac74325525a0dc00b06aaee1fa505566bce74f4806c07f26a8581ac7b20db79f11cbb052d6d598d02b7eec94aae6a142d88da00eb01e4b0a8d72e134ef5a798
7
+ data.tar.gz: 2b873fd8ee1cfffda74d301265ec9477a34dfe571d30d4c36d195cf39b089c22635bc74c07ade143ca46a5e169d0db226470a6149ce912be3b3da0db96e26b49
checksums.yaml.gz.sig CHANGED
Binary file
data/changes.md ADDED
@@ -0,0 +1,46 @@
1
+ # v0.10.0
2
+
3
+ ## Cluster Client
4
+
5
+ `Async::Redis::ClusterClient` is a new class that provides a high-level interface to a Redis Cluster. Due to the way clustering works, it does not provide the same interface as the `Async::Redis::Client` class. Instead, you must request an appropriate client for the key you are working with.
6
+
7
+ ```ruby
8
+ endpoints = [
9
+ Async::Redis::Endpoint.parse("redis://redis-a"),
10
+ Async::Redis::Endpoint.parse("redis://redis-b"),
11
+ Async::Redis::Endpoint.parse("redis://redis-c"),
12
+ ]
13
+
14
+ cluster_client = Async::Redis::ClusterClient.new(endpoints)
15
+
16
+ cluster_client.clients_for("key") do |client|
17
+ puts client.get("key")
18
+ end
19
+ ```
20
+
21
+ ## Sentinel Client
22
+
23
+ The previous implementation `Async::Redis::SentinelsClient` has been replaced with `Async::Redis::SentinelClient`. This new class uses `Async::Redis::Endpoint` objects to represent the sentinels and the master.
24
+
25
+ ```ruby
26
+ sentinels = [
27
+ Async::Redis::Endpoint.parse("redis://redis-sentinel-a"),
28
+ Async::Redis::Endpoint.parse("redis://redis-sentinel-b"),
29
+ Async::Redis::Endpoint.parse("redis://redis-sentinel-c"),
30
+ ]
31
+
32
+ master_client = Async::Redis::SentinelClient.new(sentinels)
33
+ slave_client = Async::Redis::SentinelClient.new(sentinels, role: :slave)
34
+
35
+ master_client.session do |session|
36
+ session.set("key", "value")
37
+ end
38
+
39
+ slave_client.session do |session|
40
+ puts session.get("key")
41
+ end
42
+ ```
43
+
44
+ ## Integration Tests
45
+
46
+ Integration tests for Redis Cluster and Sentinel have been added, using `docker-compose` to start the required services and run the tests. These tests are not part of the default test suite and must be run separately. See the documentation in the `sentinel/` and `cluster/` directories for more information.
@@ -13,6 +13,9 @@ module Async
13
13
  class ReloadError < StandardError
14
14
  end
15
15
 
16
+ class SlotError < StandardError
17
+ end
18
+
16
19
  Node = Struct.new(:id, :endpoint, :role, :health, :client)
17
20
 
18
21
  class RangeMap
@@ -84,9 +87,11 @@ module Async
84
87
  reload_cluster!
85
88
  end
86
89
 
87
- nodes = @shards.find(slot)
88
-
89
- nodes = nodes.select{|node| node.role == role}
90
+ if nodes = @shards.find(slot)
91
+ nodes = nodes.select{|node| node.role == role}
92
+ else
93
+ raise SlotError, "No nodes found for slot #{slot}"
94
+ end
90
95
 
91
96
  if node = nodes.sample
92
97
  return (node.client ||= Client.new(node.endpoint))
@@ -106,7 +111,7 @@ module Async
106
111
  shard = shard.each_slice(2).to_h
107
112
 
108
113
  slots = shard['slots']
109
- range = Range.new(*slots, exclude_end: false)
114
+ range = Range.new(*slots)
110
115
 
111
116
  nodes = shard['nodes'].map do |node|
112
117
  node = node.each_slice(2).to_h
@@ -179,10 +184,10 @@ module Async
179
184
  return sum
180
185
  end
181
186
 
182
- HASH_SLOTS = 16_384
183
-
184
187
  public
185
188
 
189
+ HASH_SLOTS = 16_384
190
+
186
191
  # Return Redis::Client for a given key.
187
192
  # Modified from https://github.com/antirez/redis-rb-cluster/blob/master/cluster.rb#L104-L117
188
193
  def slot_for(key)
@@ -44,7 +44,7 @@ module Async
44
44
  #
45
45
  # @parameter scheme [String] The scheme to use, e.g. "redis" or "rediss".
46
46
  # @parameter hostname [String] The hostname to connect to (or bind to).
47
- # @parameter *options [Hash] Additional options, passed to {#initialize}.
47
+ # @parameter options [Hash] Additional options, passed to {#initialize}.
48
48
  def self.for(scheme, hostname, credentials: nil, port: nil, database: nil, **options)
49
49
  uri_klass = SCHEMES.fetch(scheme.downcase) do
50
50
  raise ArgumentError, "Unsupported scheme: #{scheme.inspect}"
@@ -74,9 +74,10 @@ module Async
74
74
  #
75
75
  # @parameter url [URI] The URL to connect to.
76
76
  # @parameter endpoint [Endpoint] The underlying endpoint to use.
77
- # @parameter scheme [String] The scheme to use, e.g. "redis" or "rediss".
78
- # @parameter hostname [String] The hostname to connect to (or bind to), overrides the URL hostname (used for SNI).
79
- # @parameter port [Integer] The port to bind to, overrides the URL port.
77
+ # @option scheme [String] The scheme to use, e.g. "redis" or "rediss".
78
+ # @option hostname [String] The hostname to connect to (or bind to), overrides the URL hostname (used for SNI).
79
+ # @option port [Integer] The port to bind to, overrides the URL port.
80
+ # @option ssl_context [OpenSSL::SSL::SSLContext] The SSL context to use for secure connections.
80
81
  def initialize(url, endpoint = nil, **options)
81
82
  super(**options)
82
83
 
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module Redis
8
- VERSION = "0.10.0"
8
+ VERSION = "0.10.1"
9
9
  end
10
10
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -48,7 +48,7 @@ cert_chain:
48
48
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
49
49
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
50
50
  -----END CERTIFICATE-----
51
- date: 2024-08-16 00:00:00.000000000 Z
51
+ date: 2024-08-22 00:00:00.000000000 Z
52
52
  dependencies:
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: async
@@ -126,6 +126,7 @@ executables: []
126
126
  extensions: []
127
127
  extra_rdoc_files: []
128
128
  files:
129
+ - changes.md
129
130
  - lib/async/redis.rb
130
131
  - lib/async/redis/client.rb
131
132
  - lib/async/redis/cluster_client.rb
metadata.gz.sig CHANGED
Binary file