我有一个Redis服务器为多个客户端提供服务。有时服务器需要运行大约一分钟才能完成的lua脚本。但是在此期间,其他客户端会收到响应错误:
redis.exceptions.ResponseError:繁忙Redis正在忙于运行脚本。您只能致电SCRIPT KILL或SHUTDOWN NOSAVE
是否以内置的方式告诉客户仅等待或重试此响应?
Redis(socket_timeout=9999)
似乎对此没有影响。
答案 0 :(得分:0)
我找不到合适的方法,所以我有点a:
from redis import Redis
class MyRedis(Redis):
lua_retry_time = 120
# override execute to retry busy errors
def execute_command(self, *args, **options):
wait_time = 0
if not self.lua_retry_time:
return super().execute_command(*args, **options)
while wait_time < self.lua_retry_time:
try:
return super().execute_command(*args, **options)
except ResponseError as e:
if 'busy redis is busy' not in ''.join(e.args).lower():
raise e
if wait_time == 0: # only print once
print('Redis is busy, waiting up to 120 seconds...')
time.sleep(2)
wait_time += 2
return super().execute_command(*args, **options)
redis-py
包中的每个命令都通过execute_command
方法,这将覆盖所有内容。
每2秒将重试120秒。