import redis r = redis.Redis(host='localhost', port=6379, db=0) r.set('mykey', 'Hello, Redis!') value = r.get('mykey') print(value.decode('utf-8')) # 出力: Hello, Redis!
何もしないとこんな感じのコードになる。exponential_backoff_retryを仕込む。
import redis import time import random def exponential_backoff_retry(func, max_retries=5, base_delay=1.0): """ 指数バックオフを使用してRedis操作を再試行するヘルパー関数 :param func: 実行する関数(通常、redisコマンド) :param max_retries: 最大リトライ回数 :param base_delay: 最初の遅延時間(秒) """ retries = 0 while retries < max_retries: try: return func() # Redisの操作を実行 except redis.exceptions.ConnectionError as e: retries += 1 wait_time = base_delay * (2 ** retries) + random.uniform(0, 1) print(f"Connection failed, retrying in {wait_time:.2f} seconds...") time.sleep(wait_time) raise Exception("Maximum retries reached. Could not connect to Redis.") r = redis.Redis(host='localhost', port=6379, db=0) def set_key(): r.set('mykey', 'Hello with Exponential Backoff!') exponential_backoff_retry(set_key)
そしてこんなことしなくても公式で実装されていることに気づいた。これで良いですね。
import os from redis import Redis from redis.backoff import ExponentialBackoff from redis.retry import Retry from redis.exceptions import ConnectionError, ReadOnlyError retry = Retry(ExponentialBackoff(), 3) redis_client = Redis( host=os.environ["REDIS_HOST"], port=int(os.environ["REDIS_PORT"]), retry=retry, retry_on_error=[ConnectionError, ReadOnlyError], )