地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Python】ElastiCache for RedisのFOに対応する

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)

そしてこんなことしなくても公式で実装されていることに気づいた。これで良いですね。

github.com

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],
)