redis-cluster-client 0.0.12 → 0.1.0

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: 2aec24d7a41cc222cf5fdec13b063d0ce2a68df59c05049a4719f71b6ac07391
4
- data.tar.gz: 00b0eebd7da92305fbf2512f660721ad0976cfb1e33fb72037a673fe65899ce1
3
+ metadata.gz: 367df4e02bcd425f14da73b2ff243dfdb7fd44c6cb565bcc46952b939057904f
4
+ data.tar.gz: bfdb8033d0695fe0389563ad563c8445f9624e99ef6315e7374ee7f2e440fe40
5
5
  SHA512:
6
- metadata.gz: 28d31d104bd1f2100c0f61c765783e86fea745910c748510bdc7b4985f779df4e8d8240a38afc043504cc36ad33a00273288762defcdcd03e7486cece5351882
7
- data.tar.gz: 82a6c2b2e786f27183cc000ca202e4d6bf29b6260dc00a2659eb18660e6e4b3d60946d170606938242dc9340b4ae644aaa15de7369c23e2f9cda0c2bab604fe8
6
+ metadata.gz: 278740e8829a1def72a411552ed7c17d0d265930c81dfc2b967cfa325a74cdbdbd0adb832dacc77e4c86c8316648695b94044cb6fdf3dd3267617d5f18b95ec1
7
+ data.tar.gz: 007bf587198b7575dabee128c0500700ef0d10c7b699a632023ce4d80fa788d2a88e851748f041ab5f6453350d7de6f9d8c96bcbc798deec7acbf37b2700ea6a
@@ -55,6 +55,10 @@ class RedisClient
55
55
  dig_details(command, :readonly)
56
56
  end
57
57
 
58
+ def exists?(name)
59
+ @details.key?(name.to_s.downcase)
60
+ end
61
+
58
62
  private
59
63
 
60
64
  def pick_details(details)
@@ -15,19 +15,19 @@ class RedisClient
15
15
  end
16
16
 
17
17
  def call(*command, **kwargs)
18
- node_key = @router.find_node_key(*command, primary_only: true)
18
+ node_key = @router.find_node_key(*command, primary_only: true, **kwargs)
19
19
  @grouped[node_key] += [[@size, :call, command, kwargs]]
20
20
  @size += 1
21
21
  end
22
22
 
23
23
  def call_once(*command, **kwargs)
24
- node_key = @router.find_node_key(*command, primary_only: true)
24
+ node_key = @router.find_node_key(*command, primary_only: true, **kwargs)
25
25
  @grouped[node_key] += [[@size, :call_once, command, kwargs]]
26
26
  @size += 1
27
27
  end
28
28
 
29
29
  def blocking_call(timeout, *command, **kwargs)
30
- node_key = @router.find_node_key(*command, primary_only: true)
30
+ node_key = @router.find_node_key(*command, primary_only: true, **kwargs)
31
31
  @grouped[node_key] += [[@size, :blocking_call, timeout, command, kwargs]]
32
32
  @size += 1
33
33
  end
@@ -10,7 +10,7 @@ class RedisClient
10
10
 
11
11
  def call(*command, **kwargs)
12
12
  close
13
- @pubsub = @router.assign_node(*command).pubsub
13
+ @pubsub = @router.assign_node(*command, **kwargs).pubsub
14
14
  @pubsub.call(*command, **kwargs)
15
15
  end
16
16
 
@@ -20,11 +20,13 @@ class RedisClient
20
20
  @client_kwargs = kwargs
21
21
  @node = fetch_cluster_info(@config, pool: @pool, **@client_kwargs)
22
22
  @command = ::RedisClient::Cluster::Command.load(@node)
23
+ @command_builder = @config.command_builder
23
24
  @mutex = Mutex.new
24
25
  end
25
26
 
26
27
  def send_command(method, *args, **kwargs, &block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
27
28
  command = method == :blocking_call && args.size > 1 ? args[1..] : args
29
+ command = @command_builder.generate!(command, kwargs)
28
30
 
29
31
  cmd = command.first.to_s.downcase
30
32
  case cmd
@@ -95,6 +97,8 @@ class RedisClient
95
97
  end
96
98
 
97
99
  def scan(*command, **kwargs) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
100
+ command = @command_builder.generate!(command, kwargs)
101
+
98
102
  command[1] = ZERO_CURSOR_FOR_SCAN if command.size == 1
99
103
  input_cursor = Integer(command[1])
100
104
 
@@ -116,12 +120,14 @@ class RedisClient
116
120
  [((result_cursor << 8) + client_index).to_s, result_keys]
117
121
  end
118
122
 
119
- def assign_node(*command)
120
- node_key = find_node_key(*command)
123
+ def assign_node(*command, **kwargs)
124
+ node_key = find_node_key(*command, **kwargs)
121
125
  find_node(node_key)
122
126
  end
123
127
 
124
- def find_node_key(*command, primary_only: false)
128
+ def find_node_key(*command, primary_only: false, **kwargs)
129
+ command = @command_builder.generate!(command, kwargs)
130
+
125
131
  key = @command.extract_first_key(command)
126
132
  slot = key.empty? ? nil : ::RedisClient::Cluster::KeySlotConverter.convert(key)
127
133
 
@@ -142,6 +148,10 @@ class RedisClient
142
148
  retry
143
149
  end
144
150
 
151
+ def command_exists?(name)
152
+ @command.exists?(name)
153
+ end
154
+
145
155
  private
146
156
 
147
157
  def send_wait_command(method, *args, retry_count: 3, **kwargs, &block)
@@ -159,6 +169,7 @@ class RedisClient
159
169
 
160
170
  def send_config_command(method, *args, **kwargs, &block)
161
171
  command = method == :blocking_call && args.size > 1 ? args[1..] : args
172
+ command = @command_builder.generate!(command, kwargs)
162
173
 
163
174
  case command[1].to_s.downcase
164
175
  when 'resetstat', 'rewrite', 'set'
@@ -169,6 +180,7 @@ class RedisClient
169
180
 
170
181
  def send_memory_command(method, *args, **kwargs, &block)
171
182
  command = method == :blocking_call && args.size > 1 ? args[1..] : args
183
+ command = @command_builder.generate!(command, kwargs)
172
184
 
173
185
  case command[1].to_s.downcase
174
186
  when 'stats' then @node.call_all(method, *args, **kwargs, &block)
@@ -179,6 +191,7 @@ class RedisClient
179
191
 
180
192
  def send_client_command(method, *args, **kwargs, &block)
181
193
  command = method == :blocking_call && args.size > 1 ? args[1..] : args
194
+ command = @command_builder.generate!(command, kwargs)
182
195
 
183
196
  case command[1].to_s.downcase
184
197
  when 'list' then @node.call_all(method, *args, **kwargs, &block).flatten
@@ -190,6 +203,7 @@ class RedisClient
190
203
 
191
204
  def send_cluster_command(method, *args, **kwargs, &block) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
192
205
  command = method == :blocking_call && args.size > 1 ? args[1..] : args
206
+ command = @command_builder.generate!(command, kwargs)
193
207
  subcommand = command[1].to_s.downcase
194
208
 
195
209
  case subcommand
@@ -207,6 +221,7 @@ class RedisClient
207
221
 
208
222
  def send_script_command(method, *args, **kwargs, &block)
209
223
  command = method == :blocking_call && args.size > 1 ? args[1..] : args
224
+ command = @command_builder.generate!(command, kwargs)
210
225
 
211
226
  case command[1].to_s.downcase
212
227
  when 'debug', 'kill'
@@ -219,6 +234,7 @@ class RedisClient
219
234
 
220
235
  def send_pubsub_command(method, *args, **kwargs, &block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
221
236
  command = method == :blocking_call && args.size > 1 ? args[1..] : args
237
+ command = @command_builder.generate!(command, kwargs)
222
238
 
223
239
  case command[1].to_s.downcase
224
240
  when 'channels' then @node.call_all(method, *args, **kwargs, &block).flatten.uniq.sort_by(&:to_s)
@@ -17,16 +17,16 @@ class RedisClient
17
17
  "#<#{self.class.name} #{@router.node.node_keys.join(', ')}>"
18
18
  end
19
19
 
20
- def call(*command, **kwargs)
21
- @router.send_command(:call, *command, **kwargs)
20
+ def call(*command, **kwargs, &block)
21
+ @router.send_command(:call, *command, **kwargs, &block)
22
22
  end
23
23
 
24
- def call_once(*command, **kwargs)
25
- @router.send_command(:call_once, *command, **kwargs)
24
+ def call_once(*command, **kwargs, &block)
25
+ @router.send_command(:call_once, *command, **kwargs, &block)
26
26
  end
27
27
 
28
- def blocking_call(timeout, *command, **kwargs)
29
- @router.send_command(:blocking_call, timeout, *command, **kwargs)
28
+ def blocking_call(timeout, *command, **kwargs, &block)
29
+ @router.send_command(:blocking_call, timeout, *command, **kwargs, &block)
30
30
  end
31
31
 
32
32
  def scan(*args, **kwargs, &block)
@@ -71,5 +71,22 @@ class RedisClient
71
71
  @router.node.call_all(:close)
72
72
  nil
73
73
  end
74
+
75
+ private
76
+
77
+ def method_missing(name, *args, **kwargs, &block)
78
+ if @router.command_exists?(name)
79
+ args.unshift(name)
80
+ return @router.send_command(:call, *args, **kwargs, &block)
81
+ end
82
+
83
+ super
84
+ end
85
+
86
+ def respond_to_missing?(name, include_private = false)
87
+ return true if @router.command_exists?(name)
88
+
89
+ super
90
+ end
74
91
  end
75
92
  end
@@ -4,6 +4,7 @@ require 'uri'
4
4
  require 'redis_client'
5
5
  require 'redis_client/cluster'
6
6
  require 'redis_client/cluster/node_key'
7
+ require 'redis_client/command_builder'
7
8
 
8
9
  class RedisClient
9
10
  class ClusterConfig
@@ -19,11 +20,14 @@ class RedisClient
19
20
 
20
21
  InvalidClientConfigError = Class.new(::RedisClient::Error)
21
22
 
23
+ attr_reader :command_builder
24
+
22
25
  def initialize(nodes: DEFAULT_NODES, replica: false, fixed_hostname: '', **client_config)
23
26
  @replica = true & replica
24
27
  @fixed_hostname = fixed_hostname.to_s
25
28
  @node_configs = build_node_configs(nodes.dup)
26
29
  client_config = client_config.reject { |k, _| IGNORE_GENERIC_CONFIG_KEYS.include?(k) }
30
+ @command_builder = client_config.fetch(:command_builder, ::RedisClient::CommandBuilder)
27
31
  @client_config = merge_generic_config(client_config, @node_configs)
28
32
  @mutex = Mutex.new
29
33
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-cluster-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taishi Kasuga