【问题标题】:Make redis client wait when server is running a long lua script当服务器运行长lua脚本时使redis客户端等待
【发布时间】:2018-08-24 18:50:03
【问题描述】:

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

redis.exceptions.ResponseError: BUSY Redis 正忙于运行脚本。您只能调用 SCRIPT KILL 或 SHUTDOWN NOSAVE

是否有内置方法告诉客户端继续等待或重试此响应?
Redis(socket_timeout=9999) 似乎对此没有影响。

【问题讨论】:

  • 我会采取相反的方式 - 尝试短超时,然后在您身边重试...它可以让您更好地控制超时。另请注意,系统可能具有干扰您的设置 - 至少前一段时间在 Linux 下是这种情况......

标签: python redis


【解决方案1】:

我找不到合适的方法,所以我做了一些修改:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多