juribot-backend / db /redis.py
entidi2608's picture
Initial backend deployment
a6fd1a3
import redis.asyncio as aioredis # Sử dụng redis-py cho async
import config
import logging
logger = logging.getLogger(__name__)
# redis_url = os.environ.get("REDIS_URL")
# r = redis.Redis.from_url(redis_url)
# try:
# r = redis.Redis.from_url(redis_url)
# r.ping() # Kiểm tra kết nối
# logger.info("🔸[Redis] Connected successfully.")
# except redis.RedisError as e:
# logger.error(f"🔸[Redis] Connection failed: {e}")
# r = None
async def get_redis_client():
"""
Tạo và trả về một client Redis kết nối đến URL trong config.
Hỗ trợ cả Redis local và các dịch vụ cloud như Upstash.
"""
redis_url = config.REDIS_URL
if not redis_url:
logger.error("❌ REDIS_URL not found in configuration.")
raise ValueError("REDIS_URL is not set.")
logger.info(f"🔸 Connecting to Redis at: ...{redis_url[-20:]}") # Log một phần URL để bảo mật
try:
# redis.asyncio.from_url sẽ tự động xử lý tất cả các thành phần:
# - Giao thức (redis:// hoặc rediss://)
# - Tên người dùng và mật khẩu
# - Host và Port
# - Bật SSL/TLS nếu URL là rediss:// (Upstash mặc định dùng)
redis_client = aioredis.from_url(
redis_url,
encoding="utf-8",
decode_responses=True # Tự động decode kết quả thành string
)
# Kiểm tra kết nối
await redis_client.ping()
logger.info("✅ Redis connection successful.")
return redis_client
except Exception as e:
logger.error(f"❌ Failed to connect to Redis: {e}", exc_info=True)
return None