ShiErFeng/shierfeng-fastapi-backend/config/get_redis.py
2026-07-24 09:43:10 +08:00

108 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import FastAPI
from redis import asyncio as aioredis
from redis.exceptions import AuthenticationError, RedisError
from redis.exceptions import TimeoutError as RedisTimeoutError
from config.database import AsyncSessionLocal
from config.env import RedisConfig
from module_admin.service.config_service import ConfigService
from module_admin.service.dict_service import DictDataService
from utils.log_util import logger
class RedisUtil:
"""
Redis相关方法
"""
@classmethod
async def create_redis_pool(cls, log_enabled: bool = True, log_start_enabled: bool | None = None) -> aioredis.Redis:
"""
应用启动时初始化redis连接
:param log_enabled: 是否输出日志
:param log_start_enabled: 是否输出开始连接日志
:return: 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',
decode_responses=True,
)
if log_start_enabled is None:
log_start_enabled = log_enabled
if log_enabled or log_start_enabled:
await cls.check_redis_connection(redis, log_enabled=log_enabled, log_start_enabled=log_start_enabled)
return redis
@classmethod
async def check_redis_connection(
cls, redis: aioredis.Redis, log_enabled: bool = True, log_start_enabled: bool | None = None
) -> None:
"""
检查redis连接状态
:param redis: redis对象
:param log_enabled: 是否输出日志
:param log_start_enabled: 是否输出开始连接日志
:return: None
"""
if log_start_enabled is None:
log_start_enabled = log_enabled
if log_start_enabled:
logger.info('🔎 开始连接redis...')
try:
connection = await redis.ping()
if not log_enabled:
return
if connection:
logger.info('✅️ redis连接成功')
else:
logger.error('❌️ redis连接失败')
except AuthenticationError as e:
if log_enabled:
logger.error(f'❌️ redis用户名或密码错误详细错误信息{e}')
except RedisTimeoutError as e:
if log_enabled:
logger.error(f'❌️ redis连接超时详细错误信息{e}')
except RedisError as e:
if log_enabled:
logger.error(f'❌️ redis连接错误详细错误信息{e}')
@classmethod
async def close_redis_pool(cls, app: FastAPI) -> None:
"""
应用关闭时关闭redis连接
:param app: fastapi对象
:return:
"""
await app.state.redis.close()
logger.info('✅️ 关闭redis连接成功')
@classmethod
async def init_sys_dict(cls, redis: FastAPI) -> None:
"""
应用启动时缓存字典表
:param redis: redis对象
:return:
"""
async with AsyncSessionLocal() as session:
await DictDataService.init_cache_sys_dict_services(session, redis)
@classmethod
async def init_sys_config(cls, redis: aioredis.Redis) -> None:
"""
应用启动时缓存参数配置表
:param redis: redis对象
:return:
"""
async with AsyncSessionLocal() as session:
await ConfigService.init_cache_sys_config_services(session, redis)