From cc49daf9e36ab6ad941aa7f84245a71413e36232 Mon Sep 17 00:00:00 2001 From: sharath <29162020+tnfssc@users.noreply.github.com> Date: Fri, 27 Jun 2025 21:33:46 +0000 Subject: [PATCH] feat(redis): implement connection pool for Redis client initialization and closure --- backend/services/redis.py | 41 +++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/backend/services/redis.py b/backend/services/redis.py index 12598790..511d279a 100644 --- a/backend/services/redis.py +++ b/backend/services/redis.py @@ -6,8 +6,9 @@ from utils.logger import logger from typing import List, Any from utils.retry import retry -# Redis client +# Redis client and connection pool client: redis.Redis | None = None +pool: redis.ConnectionPool | None = None _initialized = False _init_lock = asyncio.Lock() @@ -16,8 +17,8 @@ REDIS_KEY_TTL = 3600 * 24 # 24 hour TTL as safety mechanism def initialize(): - """Initialize Redis connection using environment variables.""" - global client + """Initialize Redis connection pool and client using environment variables.""" + global client, pool # Load environment variables if not already loaded load_dotenv() @@ -26,25 +27,29 @@ def initialize(): redis_host = os.getenv("REDIS_HOST", "redis") redis_port = int(os.getenv("REDIS_PORT", 6379)) redis_password = os.getenv("REDIS_PASSWORD", "") - # Convert string 'True'/'False' to boolean - redis_ssl_str = os.getenv("REDIS_SSL", "False") - redis_ssl = redis_ssl_str.lower() == "true" + + # Connection pool configuration + max_connections = int(os.getenv("REDIS_MAX_CONNECTIONS", 1024)) + retry_on_timeout = not (os.getenv("REDIS_RETRY_ON_TIMEOUT", "True").lower() != "true") - logger.info(f"Initializing Redis connection to {redis_host}:{redis_port}") + logger.info(f"Initializing Redis connection pool to {redis_host}:{redis_port} with max {max_connections} connections") - # Create Redis client with basic configuration - client = redis.Redis( + # Create connection pool + pool = redis.ConnectionPool( host=redis_host, port=redis_port, password=redis_password, - ssl=redis_ssl, decode_responses=True, socket_timeout=5.0, socket_connect_timeout=5.0, - retry_on_timeout=True, + retry_on_timeout=retry_on_timeout, health_check_interval=30, + max_connections=max_connections, ) + # Create Redis client from connection pool + client = redis.Redis(connection_pool=pool) + return client @@ -71,14 +76,20 @@ async def initialize_async(): async def close(): - """Close Redis connection.""" - global client, _initialized + """Close Redis connection and connection pool.""" + global client, pool, _initialized if client: logger.info("Closing Redis connection") await client.aclose() client = None - _initialized = False - logger.info("Redis connection closed") + + if pool: + logger.info("Closing Redis connection pool") + await pool.aclose() + pool = None + + _initialized = False + logger.info("Redis connection and pool closed") async def get_client():