ホーム>source

単一のredisサーバーが複数のクライアントにサービスを提供しています。サーバーが完了するまでに約1分かかるluaスクリプトを実行する必要がある場合があります。ただし、その間、他のクライアントは応答エラーを受け取ります。

redis.exceptions.ResponseError: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE

この応答を待機または再試行し続けるようにクライアントに指示する組み込みの方法はありますか?
  Redis(socket_timeout=9999)  これには影響がないようです。

あなたの答え
  • 解決した方法 # 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秒間再試行を続けます。

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ Biztalk送信ポートサービスインスタンスの「アクティブ状態」を監視する