From 0ec625766e627fdc6a5926e623d34afabe885282 Mon Sep 17 00:00:00 2001 From: Lian Benchi Date: Mon, 15 Mar 2021 22:14:36 +0800 Subject: [PATCH 1/2] optimize: optimize cluster readonly mode by avoid moved in write commands --- aredis/client.py | 2 +- aredis/pool.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/aredis/client.py b/aredis/client.py index 91973db5..2b6a8efc 100644 --- a/aredis/client.py +++ b/aredis/client.py @@ -400,7 +400,7 @@ async def execute_command(self, *args, **kwargs): # MOVED node = self.connection_pool.get_master_node_by_slot(slot) else: - node = self.connection_pool.get_node_by_slot(slot) + node = self.connection_pool.get_node_by_slot(slot, command) r = self.connection_pool.get_connection_by_node(node) try: diff --git a/aredis/pool.py b/aredis/pool.py index 1fbb2cc7..8b5eff00 100644 --- a/aredis/pool.py +++ b/aredis/pool.py @@ -494,7 +494,8 @@ def get_connection_by_node(self, node): def get_master_node_by_slot(self, slot): return self.nodes.slots[slot][0] - def get_node_by_slot(self, slot): - if self.readonly: + def get_node_by_slot(self, slot, command): + #prevent movederr exception, optimized read lookup speed + if self.readonly and command in ["GET", "GETBIT", "HGETALL", "HMGET", "HLEN", "LLEN", "LINDEX", "MGET"]: return random.choice(self.nodes.slots[slot]) return self.get_master_node_by_slot(slot) From 6c00bc0b85325fce7f8c4e257e478e74c7946500 Mon Sep 17 00:00:00 2001 From: alexezio <35565813+alexezio@users.noreply.github.com> Date: Mon, 15 Mar 2021 22:38:11 +0800 Subject: [PATCH 2/2] Update pool.py set command default to None to compatible other part --- aredis/pool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aredis/pool.py b/aredis/pool.py index 8b5eff00..e56a57b0 100644 --- a/aredis/pool.py +++ b/aredis/pool.py @@ -494,7 +494,7 @@ def get_connection_by_node(self, node): def get_master_node_by_slot(self, slot): return self.nodes.slots[slot][0] - def get_node_by_slot(self, slot, command): + def get_node_by_slot(self, slot, command=None): #prevent movederr exception, optimized read lookup speed if self.readonly and command in ["GET", "GETBIT", "HGETALL", "HMGET", "HLEN", "LLEN", "LINDEX", "MGET"]: return random.choice(self.nodes.slots[slot])