From 5d57ae7e3754a1503e2eec4a8ac2e694d017befe Mon Sep 17 00:00:00 2001 From: Taishi Kasuga Date: Sat, 7 Dec 2024 22:09:56 +0900 Subject: [PATCH 1/2] perf: lessen conditional branches --- lib/redis_client/cluster/command.rb | 41 +++++++++++------------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/lib/redis_client/cluster/command.rb b/lib/redis_client/cluster/command.rb index 3c315bd..dd984a6 100644 --- a/lib/redis_client/cluster/command.rb +++ b/lib/redis_client/cluster/command.rb @@ -46,12 +46,19 @@ def load(nodes, slow_command_timeout: -1) # rubocop:disable Metrics/AbcSize private - def parse_command_reply(rows) + def parse_command_reply(rows) # rubocop:disable Metrics/CyclomaticComplexity rows&.each_with_object({}) do |row, acc| - next if row[0].nil? + next if row.first.nil? + + pos = case row.first + when 'eval', 'evalsha', 'zinterstore', 'zunionstore' then 3 + when 'object' then 2 + when 'migrate' then 0 + else row[3] + end acc[row.first] = ::RedisClient::Cluster::Command::Detail.new( - first_key_position: row[3], + first_key_position: pos, key_step: row[5], write?: row[2].include?('write'), readonly?: row[2].include?('readonly') @@ -90,29 +97,11 @@ def find_command_info(name) end def determine_first_key_position(command) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity - cmd_name = command.first + i = find_command_info(command.first)&.first_key_position.to_i + return i if i > 0 - if cmd_name.casecmp('get').zero? - find_command_info(cmd_name)&.first_key_position.to_i - elsif cmd_name.casecmp('mget').zero? - find_command_info(cmd_name)&.first_key_position.to_i - elsif cmd_name.casecmp('set').zero? - find_command_info(cmd_name)&.first_key_position.to_i - elsif cmd_name.casecmp('mset').zero? - find_command_info(cmd_name)&.first_key_position.to_i - elsif cmd_name.casecmp('del').zero? - find_command_info(cmd_name)&.first_key_position.to_i - elsif cmd_name.casecmp('eval').zero? - 3 - elsif cmd_name.casecmp('evalsha').zero? - 3 - elsif cmd_name.casecmp('zinterstore').zero? - 3 - elsif cmd_name.casecmp('zunionstore').zero? - 3 - elsif cmd_name.casecmp('object').zero? - 2 - elsif cmd_name.casecmp('memory').zero? + cmd_name = command.first + if cmd_name.casecmp('memory').zero? command[1].to_s.casecmp('usage').zero? ? 2 : 0 elsif cmd_name.casecmp('migrate').zero? command[3].empty? ? determine_optional_key_position(command, 'keys') : 3 @@ -121,7 +110,7 @@ def determine_first_key_position(command) # rubocop:disable Metrics/CyclomaticCo elsif cmd_name.casecmp('xreadgroup').zero? determine_optional_key_position(command, 'streams') else - find_command_info(cmd_name)&.first_key_position.to_i + i end end From f49700fd429f057bf8ea596c7d824595d938e81a Mon Sep 17 00:00:00 2001 From: Taishi Kasuga Date: Sat, 7 Dec 2024 22:18:10 +0900 Subject: [PATCH 2/2] fix --- lib/redis_client/cluster/command.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/redis_client/cluster/command.rb b/lib/redis_client/cluster/command.rb index dd984a6..11bac8a 100644 --- a/lib/redis_client/cluster/command.rb +++ b/lib/redis_client/cluster/command.rb @@ -53,7 +53,7 @@ def parse_command_reply(rows) # rubocop:disable Metrics/CyclomaticComplexity pos = case row.first when 'eval', 'evalsha', 'zinterstore', 'zunionstore' then 3 when 'object' then 2 - when 'migrate' then 0 + when 'migrate', 'xread', 'xreadgroup' then 0 else row[3] end @@ -101,14 +101,14 @@ def determine_first_key_position(command) # rubocop:disable Metrics/CyclomaticCo return i if i > 0 cmd_name = command.first - if cmd_name.casecmp('memory').zero? - command[1].to_s.casecmp('usage').zero? ? 2 : 0 - elsif cmd_name.casecmp('migrate').zero? - command[3].empty? ? determine_optional_key_position(command, 'keys') : 3 - elsif cmd_name.casecmp('xread').zero? + if cmd_name.casecmp('xread').zero? determine_optional_key_position(command, 'streams') elsif cmd_name.casecmp('xreadgroup').zero? determine_optional_key_position(command, 'streams') + elsif cmd_name.casecmp('migrate').zero? + command[3].empty? ? determine_optional_key_position(command, 'keys') : 3 + elsif cmd_name.casecmp('memory').zero? + command[1].to_s.casecmp('usage').zero? ? 2 : 0 else i end