# 免费脑筋急转弯接口的题库去重与本地缓存策略
> 接口/接入点:脑筋急转弯(1618,1618-2 / 1618-3) · 免费服务 · 返回 JSON · 适用人群:已接入、关注成本与体验的开发者 · 阅读时间约 6 分钟
## 核心要点
- 随机接口(1618-3)不保证去重,一次取多条或多次调用都可能出现重复题;本地用 `question` 做 Set 去重。
- 题库总量固定(实测约 11067),适合"一次性建本地索引 + 定期增量更新",大幅减少重复调用、守住免费档位。
- 缓存键设计:`question` 作唯一键;列表接口分页结果按 `page` 维度缓存。
## Why:为什么需要去重与缓存
免费接口有使用档次限制。每次出题都打接口,既浪费档位,又可能给用户重复题影响体验。去重解决"重复题",缓存解决"重复调用"——两者一起做,体验与成本双赢。
## What:接口与前置
| 项目 | 说明 |
|------|------|
| 用到接入点 | 1618-2(建索引)、1618-3(实时出题) |
| 前置 | 有效 AppKey;本地存储(文件/Redis 均可) |
## How:去重 + 缓存
本地去重(每次取题后过滤已出过的):
```python
import requests
seen = set() # 实际项目里持久化到 Redis/DB
def next_unique(n=1):
r = requests.get("https://route.showapi.com/1618-3",
params={"appKey": "YOUR_APPKEY", "len": str(n * 3)}, timeout=10) # 多取一些便于去重
body = r.json()["showapi_res_body"]
out = []
for it in body["list"]:
if it["question"] not in seen:
seen.add(it["question"]); out.append(it)
if len(out) >= n: break
return out
```
一次性建本地题库索引(用 1618-2 分页遍历,详见分页指南),之后随机出题从本地抽,只在本地库 depleted 时回源。
cURL(验证取题):
```bash
curl -s --max-time 10 "https://route.showapi.com/1618-3?appKey=YOUR_APPKEY&len=5"
```
## 返回示例与解析
返回 `list` 数组(见字段全解)。去重依据是 `question` 文本;`answer` 可能含标点/换行,比较时用 `question` 更稳定。
## 进阶 / 边界
- 缓存失效:题库由服务端维护,可能增删;建议本地索引带"最后更新时间",每日/每周增量同步一次,而非永久不回源。
- 档位保护:建索引是一次性的大请求量操作,请在档位内、控频执行;日常出题走本地,几乎不消耗接口档位。
- 不要缓存 `showapi_fee_num` 之类计数字段当业务数据。
## FAQ
**Q1:随机接口一定会重复吗?** 不保证不重复,多题/多次场景大概率遇到,需本地去重。
**Q2:本地题库和官方不同步怎么办?** 带更新时间戳,定期增量同步即可。
**Q3:缓存能省多少调用?** 日常出题若全部本地抽,几乎零接口消耗;仅建索引与同步时回源。
**Q4:`question` 能做唯一键吗?** 可以,作为去重与缓存键稳定可靠。
## 相关能力 / 下一步阅读
- [脑筋急转弯两个接入点返回结构差异:contentlist 与 list 别搞混](https://www.showapi.com/guides/brainteaser-return-diff-1618)
- [脑筋急转弯免费接口的档位与限流说明:免费不等于无限](https://www.showapi.com/guides/brainteaser-free-tier-1618)
- [用脑筋急转弯 API 做个随机出题+计分小游戏(H5/小程序)](https://www.showapi.com/guides/brainteaser-random-quiz-game-1618)
- **本系列共 12 篇**:查看[脑筋急转弯 API 指南总目录](https://www.showapi.com/guides/brainteaser-guides-1618)