技术博客
地区新闻接口分页与缓存策略:每页 20 条、10 分钟更新怎么省调用

地区新闻接口分页与缓存策略:每页 20 条、10 分钟更新怎么省调用

作者: 万维易源
2026-09-01
地区新闻接口缓存策略分页
# 地区新闻接口分页与缓存策略:每页 20 条、10 分钟更新怎么省调用 > 接口/接入点:地区新闻接口(apiCode 170)· 根据地区查询新闻(170-47)|免费 · 返回 JSON · 适用人群:中高级开发者、架构师 · 阅读时间:约 7 分钟 ## 核心要点 - 新闻最快每 10 分钟更新,意味着 10 分钟内的重复请求结果基本一致,天然适合短期缓存。 - 每页固定 `maxResult=20` 条,靠 `page` 翻页;翻页请求也应进缓存,避免短时重复拉取。 - 免费接口有使用档位限制(见 https://www.showapi.com/free-api),缓存是"省调用、稳服务"的关键。 ## Why:为什么要专门设计缓存 免费不等于可以随便打。地区新闻更新慢(10 分钟级),但你的页面可能被大量用户反复访问;不缓存就把每一次浏览都变成一次接口调用,很快触达档位上限。合理的缓存既能省钱(免费用得更久),又能让前端响应更快。 ## What:缓存决策依据 | 数据特征 | 缓存建议 | |----------|----------| | 新闻列表(按地区+页) | 缓存约 10 分钟(与更新频率对齐) | | 区域查询 cityList | 缓存数天(数据基本不变) | | 已是历史页(非最新页) | 可长期缓存 | | 失败/空结果 | 短缓存(如 1 分钟)防止雪崩重试 | ## How:生产级缓存写法(Redis 示例) ```python import requests, redis, hashlib, json, time rds = redis.Redis(host="localhost", port=6379, db=0) CACHE_TTL = 600 # 10 分钟 def get_news(area_id, page=1): key = f"news:{area_id}:{page}" cached = rds.get(key) if cached: return json.loads(cached) r = requests.post("https://route.showapi.com/170-47", params={"appKey":"YOUR_APPKEY"}, data={"areaId": area_id, "page": page}, headers={"content-type":"application/x-www-form-urlencoded"}, timeout=10) body = r.json()["showapi_res_body"] if body.get("ret_code") != "0": # 失败短缓存,避免雪崩式重试 rds.setex(key, 60, json.dumps({"error": True})) raise RuntimeError("查询失败") payload = body["pagebean"]["contentlist"] rds.setex(key, CACHE_TTL, json.dumps(payload, ensure_ascii=False)) return payload ``` **Node.js(fetch + 内存缓存示意)** ```js const cache = new Map(); // key -> {exp, data} async function getNews(areaId, page=1){ const key = `${areaId}:${page}`; const hit = cache.get(key); if(hit && hit.exp > Date.now()) return hit.data; const r = await fetch("https://route.showapi.com/170-47?appKey=YOUR_APPKEY",{ method:"POST", headers:{"content-type":"application/x-www-form-urlencoded"}, body:new URLSearchParams({areaId, page}) }); const d = await r.json(); const list = d.showapi_res_body.pagebean.contentlist; cache.set(key, {exp: Date.now()+600_000, data: list}); // 10 分钟 return list; } ``` ## 返回示例与解析 缓存键设计示例:`news:55818af8085b7bc0c73836c4:1`(江西第 1 页),TTL 600 秒。命中时直接返回,跳过网络请求。 ## 进阶 / 边界 - **TTL 与更新频率对齐**:设 10 分钟,既保证"够新鲜",又把调用量降到约 1/600。若业务对时效不敏感,可适度拉长。 - **区域查询结果单独长缓存**:cityList 几乎不变,缓存数天即可,启动加载一次。 - **批量预热**:若要做全量聚合看板,用后台任务按地区错峰拉取并写入缓存,前端只读数,详见本地资讯聚合篇。 ## FAQ **Q:缓存 10 分钟,用户会看到旧新闻吗?** A:会延迟最多约 10 分钟,与接口本身"最快每 10 分钟更新"的节奏一致,对新闻聚合场景通常可接受;对强时效需求可缩短 TTL。 **Q:缓存和免费档位限制有什么关系?** A:缓存直接减少实际调用次数,等于把有限的免费额度用在刀刃上,是稳定服役的关键手段。 **Q:page 翻到很后面还要缓存吗?** A:要。历史页内容不会变,缓存收益更高;只有"最新页"对时效更敏感。 ## 相关能力与下一步阅读 - [地区新闻接口免费档位限制:限流、重试与退避策略](https://www.showapi.com/guides/region-news-free-tier-170) - [地区新闻接口 imageurls 字段处理:空数组与展示避坑](https://www.showapi.com/guides/region-news-imageurls-170) - **本系列共 12 篇**:查看[地区新闻接口(apiCode 170)官方指南总目录](https://www.showapi.com/guides/region-news-guides-170)