十万个为什么 API 免费档位下:用缓存策略节省调用次数
十万个为什么 API免费档位缓存策略Redis节省调用 # 十万个为什么 API 免费档位下:用缓存策略节省调用次数
> 接口:十万个为什么(apiCode=1706)· 接入点:列表(1706-1) + 详情(1706-2) · 免费(有档位限制)· 适用人群:中高级开发者 / 架构师 · 阅读时间:约 8 分钟
## 核心要点
- 接口免费但设有**调用档位限制**(档位细则见[官方档位说明](https://www.showapi.com/free-api),文档未给具体数字,本篇不编造)。
- 科普内容相对稳定,非常适合缓存:详情按 `id` 缓存、热门关键词列表按 `keyword+page` 缓存。
- 用 Redis 做带 TTL 的缓存,可把"重复查询"转化为"缓存命中",显著节省档位。
## Why:免费不代表可以随便打
免费接口的档位限制是按调用次数算的。如果你的小程序每次用户打开都重新调列表+详情,几天就可能触达上限,导致服务不可用。科普问答内容更新频率低,缓存是性价比最高的优化,直接帮你"省着用"。
## What:可缓存点
| 缓存对象 | 键设计 | 说明 |
|----------|--------|------|
| 详情内容 | `why:detail:{id}` | `id` 稳定,命中率最高 |
| 列表结果 | `why:list:{keyword}:{page}` | 热门词复用 |
| 总数/分页 | 内含于列表缓存 | 一并缓存 |
## How:Redis 缓存实现(Python)
```python
import redis, requests, json
APP_KEY = "YOUR_APPKEY"
r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)
BASE = "https://route.showapi.com"
def get_detail(qid: str, ttl: int = 86400) -> dict:
key = f"why:detail:{qid}"
cached = r.get(key)
if cached:
return json.loads(cached) # 缓存命中,不消耗档位
resp = requests.post(f"{BASE}/1706-2", data={"id": qid},
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=10).json()
body = resp["showapi_res_body"]
if body.get("ret_code") != "0":
raise RuntimeError(body.get("remark"))
data = {"title": body["title"], "content": body["content"]}
r.setex(key, ttl, json.dumps(data)) # 写缓存,TTL 1 天
return data
def get_list(keyword: str, page: str = "1", ttl: int = 3600) -> list:
key = f"why:list:{keyword}:{page}"
cached = r.get(key)
if cached:
return json.loads(cached)
resp = requests.post(f"{BASE}/1706-1", data={"keyword": keyword, "page": page},
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=10).json()
body = resp["showapi_res_body"]
if body.get("ret_code") != "0":
raise RuntimeError(body.get("remark"))
r.setex(key, ttl, json.dumps(body["contentlist"]))
return body["contentlist"]
```
**缓存策略建议**
- 详情 TTL 较长(如 1~7 天):科普内容几乎不变。
- 列表 TTL 中等(如 1 小时):热门词短期复用,低频词自然过期。
- 写穿透保护:缓存未命中才请求接口;请求失败不写缓存,避免雪崩。
## 返回示例与解析
首次 `get_detail("5bac6e8ec1b458bb0892f6ff")` 调用接口并写 Redis;同一 `id` 再次访问直接读缓存,不再消耗免费档位。
## 进阶 / 边界
- **档位数字未知**:本接口具体档位上限文档未公开,统一写"以[官方档位说明](https://www.showapi.com/free-api)为准",不要编造阈值。
- **失效与更新**:若内容需强制刷新,主动 `r.delete(key)` 或在 TTL 内忽略更新(科普内容容忍延迟)。
- **批量/订阅不存在**:文档未提供批量查询或订阅推送,缓存是应对档位的首选手段。
## FAQ
**Q1:免费档位具体是多少次?**
文档未公开具体数字,以[官方档位说明](https://www.showapi.com/free-api)为准,本篇不编造。
**Q2:缓存会不会拿到旧内容?**
科普内容更新极慢,TTL 内视为可接受;如需最新可主动删 key 刷新。
**Q3:列表和详情都该缓存吗?**
都该。详情命中率最高、收益最大;列表对热门词也很有效。
**Q4:有没有官方的批量接口省次数?**
文档未提供批量或订阅能力,缓存是目前最优解。
**Q5:Redis 不是必须的吧?**
不是。单机可用内存字典/文件缓存;多实例高并发才需要 Redis 这类共享缓存。
## 相关能力 / 下一步阅读
- [十万个为什么 API 分页查询:page / allPages / allNum / maxResult 详解](https://www.showapi.com/guides/why100k-pagination-1706)
- [十万个为什么 API 关键词检索技巧:keyword 命中规律与避坑](https://www.showapi.com/guides/why100k-keyword-strategy-1706)
- [十万个为什么 API 家长/教育类 App 方案:统一管理科普问答内容](https://www.showapi.com/guides/why100k-parent-app-plan-1706)
- **本系列共 11 篇**:查看[十万个为什么 API 指南总目录](https://www.showapi.com/guides/why100k-guides-1706)