- 虚拟用户管理(昵称/头像/性别/简介/邮箱同步到目标平台) - AI互动调度(点赞/收藏/评论/转发) - 日志时间改为北京时间 - 评论达上限后继续执行点赞收藏转发 - 一键登出全部功能 - 浅色主题UI
82 lines
2.0 KiB
Python
82 lines
2.0 KiB
Python
"""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
|