# _*_ coding : UTF-8 _*_ # @Time : 2025/01/18 02:41 # @UpdateTime : 2025/01/18 02:41 # @Author : sonder # @File : get_redis.py # @Software : PyCharm # @Comment : 本程序 from redis import asyncio as aioredis from redis.exceptions import AuthenticationError, TimeoutError, RedisError from config.env import RedisConfig from utils.log import logger class Redis: """ Redis工具类 提供与 Redis 交互的常用方法,包括连接管理和缓存初始化。 """ @classmethod async def create_redis_pool(cls) -> aioredis.Redis: """ 应用启动时初始化 Redis 连接池。 该方法通过 `aioredis` 创建一个 Redis 连接池,并验证连接是否成功。 如果连接失败,会捕获异常并记录错误日志。 :return: Redis 连接对象 """ logger.info('开始连接 Redis...') redis = await aioredis.from_url( url=f'redis://{RedisConfig.redis_host}', port=RedisConfig.redis_port, username=RedisConfig.redis_username, password=RedisConfig.redis_password, db=RedisConfig.redis_database, encoding='utf-8', # 默认编码为 UTF-8 decode_responses=True, # 自动解码 Redis 响应 ) try: # 测试 Redis 连接 connection = await redis.ping() if connection: logger.info('Redis 连接成功') else: logger.error('Redis 连接失败') except AuthenticationError as e: logger.error(f'Redis 用户名或密码错误,详细错误信息:{e}') except TimeoutError as e: logger.error(f'Redis 连接超时,详细错误信息:{e}') except RedisError as e: logger.error(f'Redis 连接错误,详细错误信息:{e}') return redis @classmethod async def close_redis_pool(cls, app): """ 应用关闭时关闭 Redis 连接池。 在应用生命周期结束时,清理 Redis 连接池以释放资源。 :param app: FastAPI 应用对象,用于访问全局 Redis 连接池。 :return: None """ await app.state.redis.close() logger.info('关闭 Redis 连接成功')