MukeshKapoor25's picture
fix(redis): Update Redis client initialization to validate REDIS_URL scheme and log warnings for invalid formats
334a825
"""
Redis connection and cache instance.
Provides Redis client for OTP storage and rate limiting.
"""
import redis.asyncio as redis
from insightfy_utils.logging import get_logger
from app.core.config import settings
logger = get_logger(__name__)
# Redis client instance
redis_client: redis.Redis = None
# Insightfy-style settings mapping
CACHE_URL = settings.REDIS_URL
CACHE_URI = f"{settings.REDIS_HOST}:{settings.REDIS_PORT}"
CACHE_K = settings.REDIS_PASSWORD
CACHE_DB = settings.REDIS_DB
def create_redis_connection(**kwargs) -> redis.Redis:
"""Create a Redis client with the provided kwargs."""
return redis.Redis(**kwargs)
# -----------------------------------------------------------------------------
# Redis client initialization with insightfy patterns
# -----------------------------------------------------------------------------
def _redis_from_settings() -> redis.Redis:
"""Create Redis client from settings using insightfy patterns."""
cache_url = (CACHE_URL or "").strip()
if cache_url:
if cache_url.startswith(("redis://", "rediss://", "unix://")):
return redis.from_url(
cache_url,
decode_responses=True,
socket_timeout=5,
socket_connect_timeout=5,
retry_on_timeout=True,
health_check_interval=30,
)
logger.warning(
"Invalid REDIS_URL scheme; falling back to REDIS_HOST/REDIS_PORT",
extra={"redis_url": cache_url},
)
try:
host, port_str = CACHE_URI.split(":")
port = int(port_str)
except Exception:
raise ValueError("Invalid CACHE_URI format. Expected 'host:port'.")
return create_redis_connection(
host=host,
port=port,
password=CACHE_K or None,
db=CACHE_DB,
decode_responses=True,
socket_timeout=5,
socket_connect_timeout=5,
retry_on_timeout=True,
health_check_interval=30,
)
async def connect_to_redis():
"""
Establish connection to Redis.
Called during application startup.
"""
global redis_client
try:
redis_client = _redis_from_settings()
logger.info("Redis client initialized with insightfy patterns", extra={
"service": "insightfy-bms-ms-mhs"
})
# Test the connection
await redis_client.ping()
logger.info("Successfully connected to Redis")
except Exception as e:
logger.error("Failed to initialize Redis client", exc_info=e)
raise
async def close_redis_connection():
"""
Close Redis connection.
Called during application shutdown.
"""
global redis_client
if redis_client:
logger.info("Closing Redis connection")
await redis_client.close()
logger.info("Redis connection closed")
def get_redis() -> redis.Redis:
"""
Get Redis client instance.
Returns:
redis.Redis: Redis client instance
"""
return redis_client