AI-Life-Coach-Streamlit2 / core /redis_client.py
rdune71's picture
Implement efficiency improvements: HF endpoint monitoring optimization, Redis connection pooling, API request caching, session management optimization, async processing, model validation caching, and config singleton pattern
28471a4
import redis
import logging
from typing import Optional
from redis import ConnectionPool
logger = logging.getLogger(__name__)
class RedisClient:
"""Hardcoded Redis client with non-SSL configuration and connection pooling"""
_instance = None
_redis_client = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(RedisClient, cls).__new__(cls)
return cls._instance
def __init__(self):
if not hasattr(self, '_initialized'):
self._initialized = True
self.pool = None
self._connect()
def _connect(self):
"""Establish Redis connection without SSL using connection pooling"""
logger.info("=== Redis Connection (Non-SSL) ===")
host = 'redis-16717.c85.us-east-1-2.ec2.redns.redis-cloud.com'
port = 16717
username = "default"
password = "bNQGmfkB2fRo4KrT3UXwhAUEUmgDClx7"
logger.info(f"Host: {host}")
logger.info(f"Port: {port}")
logger.info(f"Username: {username}")
logger.info("Password: [REDACTED]")
logger.info("SSL: Disabled")
logger.info("==============================")
try:
logger.info("Creating Redis connection pool...")
self.pool = ConnectionPool(
host=host,
port=port,
username=username,
password=password,
decode_responses=True,
max_connections=20,
socket_connect_timeout=15,
socket_timeout=15,
health_check_interval=30,
retry_on_timeout=True
)
logger.info("Creating Redis client with connection pool...")
self._redis_client = redis.Redis(connection_pool=self.pool)
logger.info("Attempting to ping Redis...")
result = self._redis_client.ping()
logger.info(f"βœ… Ping successful: {result}")
# Test set/get to ensure full functionality
logger.info("Testing set/get operations...")
self._redis_client.set('connection_test_key', 'connection_test_value')
value = self._redis_client.get('connection_test_key')
self._redis_client.delete('connection_test_key')
if value == 'connection_test_value':
logger.info("βœ… Set/Get test successful!")
logger.info("πŸŽ‰ Redis connection established successfully without SSL!")
else:
logger.warning("❌ Set/Get test failed")
except Exception as e:
logger.error(f"❌ Redis connection failed: {e}")
logger.error(f"Error type: {type(e).__name__}")
import traceback
logger.error(f"Traceback: {traceback.format_exc()}")
self._redis_client = None
def get_client(self) -> Optional[redis.Redis]:
"""Get Redis client instance"""
return self._redis_client
def is_healthy(self) -> bool:
"""Check if Redis connection is healthy"""
if not self._redis_client:
return False
try:
self._redis_client.ping()
return True
except Exception as e:
logger.error(f"Redis health check failed: {e}")
return False
def reconnect(self):
"""Reconnect to Redis"""
self._connect()
# Global Redis client instance
redis_client = RedisClient()