70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
|
|
"""
|
|||
|
|
Redis客户端
|
|||
|
|
"""
|
|||
|
|
import redis
|
|||
|
|
from app.core.config import settings
|
|||
|
|
import logging
|
|||
|
|
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
_redis_client = None
|
|||
|
|
|
|||
|
|
def get_redis_client():
|
|||
|
|
"""
|
|||
|
|
获取Redis客户端(单例模式)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
redis.Redis: Redis客户端实例,如果连接失败则返回None
|
|||
|
|
"""
|
|||
|
|
global _redis_client
|
|||
|
|
|
|||
|
|
if _redis_client is not None:
|
|||
|
|
try:
|
|||
|
|
# 测试连接
|
|||
|
|
_redis_client.ping()
|
|||
|
|
return _redis_client
|
|||
|
|
except:
|
|||
|
|
# 连接已断开,重新创建
|
|||
|
|
_redis_client = None
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
redis_url = getattr(settings, 'REDIS_URL', None)
|
|||
|
|
if not redis_url:
|
|||
|
|
logger.warning("REDIS_URL未配置,无法使用Redis缓存")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
# 解析Redis URL: redis://host:port/db
|
|||
|
|
if redis_url.startswith('redis://'):
|
|||
|
|
redis_url = redis_url.replace('redis://', '')
|
|||
|
|
|
|||
|
|
# 分离host:port和db
|
|||
|
|
parts = redis_url.split('/')
|
|||
|
|
host_port = parts[0]
|
|||
|
|
db = int(parts[1]) if len(parts) > 1 and parts[1].isdigit() else 0
|
|||
|
|
|
|||
|
|
# 分离host和port
|
|||
|
|
if ':' in host_port:
|
|||
|
|
host, port = host_port.split(':')
|
|||
|
|
port = int(port)
|
|||
|
|
else:
|
|||
|
|
host = host_port
|
|||
|
|
port = 6379
|
|||
|
|
|
|||
|
|
_redis_client = redis.Redis(
|
|||
|
|
host=host,
|
|||
|
|
port=port,
|
|||
|
|
db=db,
|
|||
|
|
decode_responses=True, # 自动解码为字符串
|
|||
|
|
socket_connect_timeout=2,
|
|||
|
|
socket_timeout=2
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 测试连接
|
|||
|
|
_redis_client.ping()
|
|||
|
|
logger.info(f"Redis连接成功: {host}:{port}/{db}")
|
|||
|
|
return _redis_client
|
|||
|
|
except Exception as e:
|
|||
|
|
logger.warning(f"Redis连接失败: {str(e)},将使用内存缓存")
|
|||
|
|
_redis_client = None
|
|||
|
|
return None
|