1. 获取/写入新闻分类缓存cache/news_cache.py
# 新闻相关的缓存方法:新闻分类的读取和写入
# key - value
from typing import List, Dict, Any, Optional
from config.cache_conf import get_json_cache, set_cache
CATEGORIES_KEY = "news:categories"
# 获取新闻分类缓存
async def get_cached_categories():
return await get_json_cache(CATEGORIES_KEY)
# 写入新闻分类缓存: 缓存的数据, 过期时间
# 分类、配置 7200;列表: 600; 详情: 1800;验证码:120 -- 数据越稳定,缓存越持久
# 避免所有key同时过期 引起缓存雪崩
async def set_cache_categories(data: List[Dict[str, Any]], expire: int = 7200):
return await set_cache(CATEGORIES_KEY, data, expire)
2. 改造crud/news.py
# 获取新闻分类
async def get_categories(db: AsyncSession, skip: int = 0, limit: int = 100):
# 先尝试从缓存中获取数据
cached_categories = await get_cached_categories()
if cached_categories:
return cached_categories
stmt = select(Category).offset(skip).limit(limit)
result = await db.execute(stmt)
categories = result.scalars().all() # ORM
# 写入缓存
if categories:
categories = jsonable_encoder(categories)
await set_cache_categories(categories)
# 返回数据
return categories
3. 运行结果