"""Redis缓存客户端""" import json import redis.asyncio as aioredis from app.core.config import settings from app.core.logger import logger _redis_client = None async def get_redis() -> aioredis.Redis: global _redis_client if _redis_client is None: _redis_client = aioredis.from_url( f"redis://{settings.REDIS_HOST}:{settings.REDIS_PORT}", encoding="utf-8", decode_responses=True, ) return _redis_client # Session键前缀 SESSION_PREFIX = "session:" LOCK_PREFIX = "lock:" RATE_PREFIX = "rate:" async def set_session(user_id: int, session_data: dict, expire: int = 86400): """存储用户会话""" r = await get_redis() key = f"{SESSION_PREFIX}{user_id}" await r.setex(key, expire, json.dumps(session_data, ensure_ascii=False)) async def get_session(user_id: int) -> dict | None: """获取用户会话""" r = await get_redis() key = f"{SESSION_PREFIX}{user_id}" data = await r.get(key) if data: return json.loads(data) return None async def delete_session(user_id: int): """删除用户会话""" r = await get_redis() key = f"{SESSION_PREFIX}{user_id}" await r.delete(key) async def acquire_lock(name: str, expire: int = 60) -> bool: """获取分布式锁""" r = await get_redis() key = f"{LOCK_PREFIX}{name}" result = await r.set(key, "1", nx=True, ex=expire) return result is True async def release_lock(name: str): """释放分布式锁""" r = await get_redis() key = f"{LOCK_PREFIX}{name}" await r.delete(key) async def incr_rate(key: str, expire: int = 86400) -> int: """限流计数""" r = await get_redis() rate_key = f"{RATE_PREFIX}{key}" count = await r.incr(rate_key) if count == 1: await r.expire(rate_key, expire) return count async def get_counter(key: str) -> int: """获取计数""" r = await get_redis() rate_key = f"{RATE_PREFIX}{key}" val = await r.get(rate_key) return int(val) if val else 0