1. cache/news_cache.py
python
RELATED_NEWS_PREFIX = "news:related:"
# 写入缓存-相关新闻 key = news:related:新闻id:分类id + 相关新闻列表 + 过期时间
async def cache_related_news(news_id: int, category_id: int, related_list: List[Dict[str, Any]], expire: int = 1800) -> bool:
key = f"{RELATED_NEWS_PREFIX}{news_id}:{category_id}"
return await set_cache(key, related_list, expire)
# 读取缓存-相关新闻 key = news:related:新闻id:分类id
async def get_cached_related_news(news_id: int, category_id: int) -> Optional[List[Dict[str, Any]]]:
key = f"{RELATED_NEWS_PREFIX}{news_id}:{category_id}"
return await get_json_cache(key)
2. 改造crud/news.py
python
# 获取相关推荐新闻
async def get_related_news(db: AsyncSession, news_id: int, category_id: int, limit: int = 5):
# 先尝试从缓存获取相关新闻
cached_related = await get_cached_related_news(news_id, category_id)
if cached_related:
return cached_related
# 查询数据库
stmt = (
select(News)
.where(
News.id != news_id,
News.category_id == category_id
)
.order_by(
News.views.desc(),
News.publish_time.desc()
)
.limit(limit)
)
result = await db.execute(stmt)
related_news = result.scalars().all()
related_list = [
{
"id": item.id,
"title": item.title,
"content": item.content,
"image": item.image,
"author": item.author,
"publishTime": item.publish_time,
"categoryId": item.category_id,
"views": item.views
}
for item in related_news
]
# 写入缓存
if related_list:
await cache_related_news(news_id, category_id, related_list)
return related_list