mirror of
https://github.com/stardrophere/InsightRadar.git
synced 2026-06-05 23:56:36 +08:00
缓存优化
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from typing import List
|
||||
import time
|
||||
from typing import Any, Dict, List, Tuple
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
@@ -16,6 +17,16 @@ from app.services.matching_service import recommend_events_for_user
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
# --- 轻量级接口缓存配置 ---
|
||||
_RECOMMEND_CACHE: Dict[str, Tuple[float, Any]] = {}
|
||||
CACHE_TTL_SECONDS = 60
|
||||
|
||||
def _invalidate_user_cache(user_id: int):
|
||||
"""清除某个用户的推荐结果缓存(当用户新增或删除关键词时调用)"""
|
||||
keys_to_delete = [k for k in _RECOMMEND_CACHE.keys() if k.startswith(f"{user_id}:")]
|
||||
for k in keys_to_delete:
|
||||
_RECOMMEND_CACHE.pop(k, None)
|
||||
# ---------------------------
|
||||
|
||||
def _ensure_self_access(path_user_id: int, current_user: AppUser) -> None:
|
||||
"""校验路径 user_id 是否为当前登录用户本人。"""
|
||||
@@ -79,6 +90,7 @@ def create_user_preference(
|
||||
)
|
||||
|
||||
db.refresh(db_obj)
|
||||
_invalidate_user_cache(user_id) # 失效推荐缓存
|
||||
return db_obj
|
||||
|
||||
|
||||
@@ -107,6 +119,7 @@ def delete_user_preference(
|
||||
|
||||
db.delete(preference)
|
||||
db.commit()
|
||||
_invalidate_user_cache(user_id) # 失效推荐缓存
|
||||
return None
|
||||
|
||||
|
||||
@@ -127,6 +140,16 @@ def recommend_events(
|
||||
"""基于用户兴趣词推荐事件(精确匹配 + 语义匹配)。"""
|
||||
_ensure_self_access(user_id, current_user)
|
||||
|
||||
# --- 1. 尝试从缓存读取 ---
|
||||
cache_key = f"{user_id}:{min_hot}:{hours}:{limit}:{semantic_threshold}:{sort_by}"
|
||||
current_time = time.time()
|
||||
|
||||
if cache_key in _RECOMMEND_CACHE:
|
||||
expire_time, cached_data = _RECOMMEND_CACHE[cache_key]
|
||||
if current_time < expire_time:
|
||||
return cached_data
|
||||
# -----------------------
|
||||
|
||||
matched = recommend_events_for_user(
|
||||
db,
|
||||
user_id=user_id,
|
||||
@@ -155,8 +178,18 @@ def recommend_events(
|
||||
)
|
||||
)
|
||||
|
||||
return UserPreferenceRecommendationResponse(
|
||||
response = UserPreferenceRecommendationResponse(
|
||||
user_id=user_id,
|
||||
total=len(result_data),
|
||||
data=result_data,
|
||||
)
|
||||
|
||||
# --- 2. 写入缓存 ---
|
||||
if len(_RECOMMEND_CACHE) > 2000:
|
||||
# 防止内存无限增长
|
||||
_RECOMMEND_CACHE.clear()
|
||||
|
||||
_RECOMMEND_CACHE[cache_key] = (current_time + CACHE_TTL_SECONDS, response)
|
||||
# ------------------
|
||||
|
||||
return response
|
||||
|
||||
Reference in New Issue
Block a user