import os import json import redis from config import logger _REDIS_CLIENT = None def get_redis(): global _REDIS_CLIENT if _REDIS_CLIENT is not None: return _REDIS_CLIENT redis_url = os.getenv("REDIS_URL", "redis://localhost:6379/0") try: _REDIS_CLIENT = redis.Redis.from_url(redis_url, decode_responses=True) # Test connection _REDIS_CLIENT.ping() logger.info("Successfully connected to Redis cache.") except Exception as e: logger.warning(f"Failed to connect to Redis at {redis_url}: {e}. Falling back to in-memory mock.") _REDIS_CLIENT = MockRedis() return _REDIS_CLIENT class MockRedis: """Fallback if Redis server is down""" def __init__(self): self._data = {} def get(self, key): return self._data.get(key) def setex(self, key, time, value): self._data[key] = value def delete(self, key): self._data.pop(key, None) def ping(self): return True def cache_get_json(key): client = get_redis() val = client.get(key) if val: return json.loads(val) return None def cache_set_json(key, value, ttl=300): client = get_redis() client.setex(key, ttl, json.dumps(value))