地区新闻接口分页与缓存策略:每页 20 条、10 分钟更新怎么省调用
# 地区新闻接口分页与缓存策略:每页 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)