redis-cluster-client 0.0.2 → 0.0.3

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: 374dde2480377552fd2178d4940d0f9f9b4473c4308c89fa210e2b0ac8f36d6d
4
- data.tar.gz: 5b22559b68cd287904a17f853a4cfd6a0fc0bf53418eeca3988987a585a55b71
3
+ metadata.gz: 7a4668f3eaba9c3053d1464bdf1dc85524e2ba43fdbb2ffbbadc46fb4759d5e6
4
+ data.tar.gz: eba5280f698fe559a69cdeba28cef2c0fff87023fa78e7d098042d9cc6c036ac
5
5
  SHA512:
6
- metadata.gz: da95dc7179899376c736d6e5b75a04b9f8d91d0b97095b2478c9b96879f0f4ff01d75ffe86bf3efdebb2af0e13b6397a3afd41a1e6857fc41097f53ac8cdacf2
7
- data.tar.gz: 6759c62ea25c92e8160540b5edb354a03253d7d43199ccbf0479d1b19070b90cb17877b376012186ff063316f28f16157d8fbd1e0bb3b67c3168ed92d6afa31a
6
+ metadata.gz: 989fd1b82d429ae6450a8c9e1555fc3635c1592c4d68744ad33df9cb26f5d222666fbeb077af99757c6305956936f44b8e38aef405c1a275c10e501559337934
7
+ data.tar.gz: c0e88ca74a4d0ff70116969ea0722d1659858587c1cfe8a404edf41658c0b9a87e0f3651db02fe88ad6d099b2948814fcc9415aa793394fb4e75ebc5eef0acec
@@ -12,6 +12,8 @@ class RedisClient
12
12
  SLOT_SIZE = 16_384
13
13
  MIN_SLOT = 0
14
14
  MAX_SLOT = SLOT_SIZE - 1
15
+ IGNORE_GENERIC_CONFIG_KEYS = %i[url host port path].freeze
16
+
15
17
  ReloadNeeded = Class.new(::RedisClient::Error)
16
18
 
17
19
  class Config < ::RedisClient::Config
@@ -127,11 +129,6 @@ class RedisClient
127
129
  end.values
128
130
  end
129
131
 
130
- # TODO: impl
131
- def process_all(commands, &block)
132
- try_map { |_, client| client.process(commands, &block) }.values
133
- end
134
-
135
132
  def scale_reading_clients
136
133
  clients = @clients.select do |node_key, _|
137
134
  replica_disabled? ? primary?(node_key) : replica?(node_key)
@@ -207,7 +204,10 @@ class RedisClient
207
204
  options.filter_map do |node_key, option|
208
205
  next if replica_disabled? && replica?(node_key)
209
206
 
210
- config = ::RedisClient::Cluster::Node::Config.new(scale_read: replica?(node_key), **option.merge(kwargs))
207
+ config = ::RedisClient::Cluster::Node::Config.new(
208
+ scale_read: replica?(node_key),
209
+ **option.merge(kwargs.reject { |k, _| IGNORE_GENERIC_CONFIG_KEYS.include?(k) })
210
+ )
211
211
  client = pool.nil? ? config.new_client : config.new_pool(**pool)
212
212
 
213
213
  [node_key, client]
@@ -19,7 +19,7 @@ class RedisClient
19
19
  pos = node_key&.rindex(DELIMITER, -1)
20
20
  return [node_key, nil] if pos.nil?
21
21
 
22
- [node_key[0, pos], node_key[pos + 1, node_key.size - pos - 1]]
22
+ [node_key[0, pos], node_key[(pos + 1)..]]
23
23
  end
24
24
 
25
25
  def build_from_uri(uri)
@@ -20,19 +20,19 @@ class RedisClient
20
20
  end
21
21
 
22
22
  def call(*command, **kwargs)
23
- node_key = @client.send(:find_node_key, command, primary_only: true)
23
+ node_key = @client.send(:find_node_key, *command, primary_only: true)
24
24
  @grouped[node_key] += [[@size, :call, command, kwargs]]
25
25
  @size += 1
26
26
  end
27
27
 
28
28
  def call_once(*command, **kwargs)
29
- node_key = @client.send(:find_node_key, command, primary_only: true)
29
+ node_key = @client.send(:find_node_key, *command, primary_only: true)
30
30
  @grouped[node_key] += [[@size, :call_once, command, kwargs]]
31
31
  @size += 1
32
32
  end
33
33
 
34
34
  def blocking_call(timeout, *command, **kwargs)
35
- node_key = @client.send(:find_node_key, command, primary_only: true)
35
+ node_key = @client.send(:find_node_key, *command, primary_only: true)
36
36
  @grouped[node_key] += [[@size, :blocking_call, timeout, command, kwargs]]
37
37
  @size += 1
38
38
  end
@@ -65,7 +65,37 @@ class RedisClient
65
65
  end
66
66
  end
67
67
 
68
+ class PubSub
69
+ def initialize(client)
70
+ @client = client
71
+ @pubsub = nil
72
+ end
73
+
74
+ def call(*command, **kwargs)
75
+ close
76
+ @pubsub = @client.send(:assign_node, *command).pubsub
77
+ @pubsub.call(*command, **kwargs)
78
+ end
79
+
80
+ def close
81
+ @pubsub&.close
82
+ @pubsub = nil
83
+ end
84
+
85
+ def next_event(timeout = nil)
86
+ @pubsub&.next_event(timeout)
87
+ end
88
+ end
89
+
68
90
  ZERO_CURSOR_FOR_SCAN = '0'
91
+ CMD_SCAN = 'SCAN'
92
+ CMD_SSCAN = 'SSCAN'
93
+ CMD_HSCAN = 'HSCAN'
94
+ CMD_ZSCAN = 'ZSCAN'
95
+ CMD_ASKING = 'ASKING'
96
+ REPLY_OK = 'OK'
97
+ REPLY_MOVED = 'MOVED'
98
+ REPLY_ASK = 'ASK'
69
99
 
70
100
  def initialize(config, pool: nil, **kwargs)
71
101
  @config = config.dup
@@ -97,35 +127,27 @@ class RedisClient
97
127
 
98
128
  cursor = ZERO_CURSOR_FOR_SCAN
99
129
  loop do
100
- cursor, keys = _scan('SCAN', cursor, *args, **kwargs)
130
+ cursor, keys = _scan(CMD_SCAN, cursor, *args, **kwargs)
101
131
  keys.each(&block)
102
132
  break if cursor == ZERO_CURSOR_FOR_SCAN
103
133
  end
104
134
  end
105
135
 
106
136
  def sscan(key, *args, **kwargs, &block)
107
- node = assign_node('SSCAN', key)
137
+ node = assign_node(CMD_SSCAN, key)
108
138
  try_send(node, :sscan, key, *args, **kwargs, &block)
109
139
  end
110
140
 
111
141
  def hscan(key, *args, **kwargs, &block)
112
- node = assign_node('HSCAN', key)
142
+ node = assign_node(CMD_HSCAN, key)
113
143
  try_send(node, :hscan, key, *args, **kwargs, &block)
114
144
  end
115
145
 
116
146
  def zscan(key, *args, **kwargs, &block)
117
- node = assign_node('ZSCAN', key)
147
+ node = assign_node(CMD_ZSCAN, key)
118
148
  try_send(node, :zscan, key, *args, **kwargs, &block)
119
149
  end
120
150
 
121
- def mset
122
- # TODO: impl
123
- end
124
-
125
- def mget
126
- # TODO: impl
127
- end
128
-
129
151
  def pipelined
130
152
  pipeline = ::RedisClient::Cluster::Pipeline.new(self)
131
153
  yield pipeline
@@ -135,17 +157,8 @@ class RedisClient
135
157
  end
136
158
 
137
159
  def pubsub
138
- # TODO: impl
139
- end
140
-
141
- def size
142
- # TODO: impl
143
- end
144
-
145
- def with(options = {})
146
- # TODO: impl
160
+ ::RedisClient::Cluster::PubSub.new(self)
147
161
  end
148
- alias then with
149
162
 
150
163
  def close
151
164
  @node.each(&:close)
@@ -253,17 +266,17 @@ class RedisClient
253
266
  def try_send(node, method, *args, retry_count: 3, **kwargs, &block) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
254
267
  node.send(method, *args, **kwargs, &block)
255
268
  rescue ::RedisClient::CommandError => e
256
- if e.message.start_with?('MOVED')
269
+ if e.message.start_with?(REPLY_MOVED)
257
270
  raise if retry_count <= 0
258
271
 
259
272
  node = assign_redirection_node(e.message)
260
273
  retry_count -= 1
261
274
  retry
262
- elsif e.message.start_with?('ASK')
275
+ elsif e.message.start_with?(REPLY_ASK)
263
276
  raise if retry_count <= 0
264
277
 
265
278
  node = assign_asking_node(e.message)
266
- node.call('ASKING')
279
+ node.call(CMD_ASKING)
267
280
  retry_count -= 1
268
281
  retry
269
282
  else
@@ -309,11 +322,11 @@ class RedisClient
309
322
  end
310
323
 
311
324
  def assign_node(*command)
312
- node_key = find_node_key(command)
325
+ node_key = find_node_key(*command)
313
326
  find_node(node_key)
314
327
  end
315
328
 
316
- def find_node_key(command, primary_only: false)
329
+ def find_node_key(*command, primary_only: false)
317
330
  key = @command.extract_first_key(command)
318
331
  return if key.empty?
319
332
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-cluster-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taishi Kasuga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-16 00:00:00.000000000 Z
11
+ date: 2022-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis-client