当前位置: 首页 > news >正文

AI掘金头条新闻系统 (Toutiao News)-缓存新闻列表

1.cache/news_cache.py

NEWS_LIST_PREFIX = "news_list:" # 写入缓存-新闻列表 key = news_list:分类id:页码:每页数量 + 列表数据 + 过期时间 async def set_cache_news_list(category_id: Optional[int], page: int, size: int, news_list: List[Dict[str, Any]], expire: int = 1800): category_part = category_id if category_id is not None else "all" key = f"{NEWS_LIST_PREFIX}{category_part}:{page}:{size}" return await set_cache(key, news_list, expire) # 读取缓存-新闻列表 key = news_list:分类id:页码:每页数量 async def get_cache_news_list(category_id: Optional[int], page: int, size: int): category_part = category_id if category_id is not None else "all" key = f"{NEWS_LIST_PREFIX}{category_part}:{page}:{size}" return await get_json_cache(key)

2. 改造crud/news.py

# 获取新闻列表 async def get_news_list( db: AsyncSession, category_id: int, skip: int = 0, limit: int = 10 ): # 先尝试从缓存获取新闻列表 # 跳过的数量skip = (页码 - 1) * 每页数量 -> 页码 = 跳过的数量 // 每页数量 + 1 # await get_cache_news_list(分类id, 页码, 每页数量) page = skip // limit + 1 cached_list = await get_cache_news_list(category_id, page, limit) # 缓存数据 json if cached_list: # return cached_list # 要的是 ORM return [News(**item) for item in cached_list] # 查询的是指定分类下的所有新闻 stmt = select(News).where(News.category_id == category_id).offset(skip).limit(limit) result = await db.execute(stmt) news_list = result.scalars().all() # 写入缓存 if news_list: # 先把 ORM 数据 转换 字典才能写入缓存 # ORM 转成 Pydantic,再转为 字典 # by_alias=False 不适用别名,保存 Python 风格,因为 Redis 数据是给后端用的 news_data = [ NewsItemBase.model_validate(item).model_dump(mode="json", by_alias=False) for item in news_list ] await set_cache_news_list(category_id, page, limit, news_data) return news_list
http://www.jsqmd.com/news/1127083/

相关文章:

  • 如何在5分钟内通过手机号码实现精准地理位置定位的完整指南
  • 公司与美卫生基金会合作,为美制定电子产品可维修性自愿评分标准!
  • 3个关键步骤让Iwara视频下载变得前所未有的简单
  • 森亿智能赴港IPO:拿下800家医院,沙特开AI诊所,三年亏超7亿引资本青睐
  • 闪电云算力GPU直通技术:大模型训练性能零损耗解析
  • KPL-gmssl安装教程:5分钟在华为鲲鹏服务器上搭建加密环境
  • AdaRound 训练后量化实战:ResNet50 4-bit 权重量化,精度损失 <1%
  • 如何在Blender中完美导入导出3MF格式:3D打印工作流终极指南
  • 百考通AI开题报告给你写清楚“问题意识”“技术路线”“创新点”
  • 模组管理革命:Scarab如何让空洞骑士的模组世界不再破碎
  • 如何快速上手openeuler/security-facility?新手必备的安全工具配置教程
  • OpenEuler kata_integration 核心组件详解:Runtime、Proxy、Shim、Agent四大组件构建秘籍
  • 防静电皮革哪个靠谱
  • ## 新朝野
  • 中东液体粉末运输物流公司全解析
  • 直方图均衡化 5 大应用场景实战:医学影像、遥感与低光照图像增强
  • SillyTavern 1.18.0:5步构建企业级AI对话前端的完整技术指南
  • 硅基流动递表港交所冲击“Token工厂第一股”:高估值背后是AI水电煤还是资本泡沫?
  • 唤起 GBA 回忆!Key Boy Advance 键盘 2026 年四季度发货,起售价约 282 美元
  • 10分钟上手uos-tc-exporter:从安装到获取TC指标的快速教程
  • SoftBR配置文件转换全攻略:从perf_data.br到perf.data的完整流程
  • openEuler-lsb入门教程:10分钟快速搭建LSB兼容环境
  • 影刀RPA新手教程:1688批发网自动化找货询价与下单完全指南
  • 内容没流量?实战演示AI Agent如何构建“一人公司”内容自动化生产线
  • 携程酒店实时价格监控---接口逆向(token逆向)
  • ICM-42605 IMU与ARM Cortex-M4实现高精度运动追踪
  • 好用的郑州geo生产厂家
  • Mac安装IDA Pro全攻略:解决安全警告、架构兼容与Python配置
  • Wireshark网络流量分析实战:从TCP故障排查到安全威胁识别
  • 孤能子视角:三十六计之隔岸观火——时序相位选择