当服务器运行长Lua脚本时,使Redis客户端等待

时间:2018-08-20 10:58:52

标签: python redis

我有一个Redis服务器为多个客户端提供服务。有时服务器需要运行大约一分钟才能完成的lua脚本。但是在此期间,其他客户端会收到响应错误:

  

redis.exceptions.ResponseError:繁忙Redis正在忙于运行脚本。您只能致电SCRIPT KILL或SHUTDOWN NOSAVE

是否以内置的方式告诉客户仅等待或重试此响应?
 Redis(socket_timeout=9999)似乎对此没有影响。

1 个答案:

答案 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秒。