Files
huihuiSquare/backend/app/core/redis_client.py
stefanfeng cd07776914 feat: 多项功能更新
- 日志时间改为北京时间(TZ=Asia/Shanghai)
- 评论达上限后继续执行点赞/收藏/转发
- 用户信息同步改用 PATCH /v2/users/current
- 一键登出全部功能
- 一键登出全部前端按钮
- update.sh 一键更新脚本
2026-03-31 10:29:26 +08:00

82 lines
2.0 KiB
Python
Executable File

"""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