免费额度怎么用不超:猜一猜谜语 API 的调用频控与缓存建议
# 免费额度怎么用不超:猜一猜谜语 API 的调用频控与缓存建议
> 接口/接入点:猜一猜谜语 API(全部) · 免费(设档位限制) · 适用人群:已接入用户、活动运营 · 阅读时间:约 5 分钟
## 核心要点
- 接口免费,但"为防止滥用设有使用档次限制",具体额度以官方 `/free-api` 为准,本文不编造数字。
- 核心策略:**服务端建题池 + 缓存 + 用户频控**,把实时调用降到最低,避免瞬时高频触发限流。
- 151-2 每次返回 20 条,足够撑起一段时间的前端随机抽题,不必每条都调接口。
## Why:这跟我有什么关系
免费接口一旦被前端疯狂刷新就容易触发档位限流,活动/小程序当场"没题了"。用缓存和频控,既省调用又保体验。
## What:约束与手段
| 约束 | 应对手段 |
|------|---------|
| 免费档位限制(额度以官方为准) | 服务端缓存题池,减少实时调用 |
| 前端高频刷新 | 用户级频控(如每分钟 1 次) |
| 题库重复 | 建池时按 `Title` 去重 |
## How:缓存与频控实现
### 服务端题池(Redis 示例)
```python
import requests, redis, json
rds = redis.Redis()
def get_riddle(type_id="gxmy"):
key = f"riddle_pool:{type_id}"
if rds.llen(key) == 0: # 池空才回源
items = build_from_api(type_id) # 调 151-2 取 20 条
rds.rpush(key, *[json.dumps(i) for i in items])
rds.expire(key, 3600) # 缓存 1 小时
raw = rds.lpop(key)
return json.loads(raw) if raw else None
```
### 用户频控
```python
def allow(uid):
k = f"riddle_rps:{uid}"
if rds.incr(k) == 1:
rds.expire(k, 60) # 60 秒窗口
return int(rds.get(k)) <= 10 # 每用户每分钟上限(按你的档位自定)
```
## 返回示例与解析
取题返回结构见 [返回字段全解](https://www.showapi.com/guides/riddle-response-fields-151)。题池去重用 `Title` 作唯一键。
## 进阶/边界
- **额度未知**:官方只说"设档位限制",未给具体数字。上线前按官方 `/free-api` 估峰值,必要时升级档位。
- **缓存有效期**:谜语内容稳定,缓存 1 小时~1 天都合理;活动期可更长。
- **分布式频控**:多实例部署用 Redis 统一计数,别用本地内存。
- **降级**:接口限流时返回缓存题或友好提示,别让用户看到报错。
## FAQ
**Q1:免费额度具体是多少次?**
文档未给具体数字,只说"防止滥用设档位限制",以官方 /free-api 为准。
**Q2:缓存谜语算违规吗?**
缓存用于减少自身调用、提升体验,属正常使用;注意内容授权与活动合规。
**Q3:151-2 一次 20 条够用吗?**
够撑一阵,池空再回源即可;高频活动建议预热更大题池。
**Q4:频控设多少合适?**
按你的实际档位与人均答题次数估算,先用保守值(如每用户每分钟 10 次)观察。
**Q5:限流了怎么排查?**
看 `showapi_res_code` 与 `showapi_res_error`,配合服务端调用日志定位是否超频。
## 相关能力 / 下一步阅读
- [拿到谜底后怎么校验用户答案?API 不代判,需自建比对逻辑](https://www.showapi.com/guides/riddle-answer-check-151)
- [营销裂变:用猜一猜谜语 API 做答题抽奖与互动游戏](https://www.showapi.com/guides/riddle-marketing-activity-151)
- [猜一猜谜语 API:5 分钟接入,调通你的第一条随机谜语](https://www.showapi.com/guides/riddle-quickstart-151)
- **本系列共 13 篇**:查看[猜一猜谜语 API 指南总目录](https://www.showapi.com/guides/riddle-guides-151)