File size: 1,720 Bytes
a6fd1a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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