免费接口也要省:经典语句客户端缓存策略,别反复调同一条
# 免费接口也要省:经典语句客户端缓存策略,别反复调同一条
> 元信息:接口 1646-2 · 免费 · 请求方式 POST/GET · 返回 JSON · 适用人群 已接入中高级开发者 · 阅读时间 6 分钟
## 核心要点
- 名言类语料更新频率低(文档标注"持续更新中"),客户端缓存能减少无意义请求、提升响应速度。
- 缓存 key 建议用 `tag`(含"默认"占位),value 为去重语句集合;设置合理过期时间。
- 虽免费无费用压力,但缓存能避免"连续展示同一句"的体验问题,并降低对接口的依赖。
## Why:免费为什么还要缓存
免费不等于可以无脑高频调用。名言内容短期内不会大变,若每次页面渲染、每次用户刷新都打接口,既慢又浪费配额(若有隐性限流)。缓存让你"取一次、用多次",体验更顺、韧性更强。
## What:缓存设计要点
| 项 | 建议 |
|----|------|
| 缓存 key | `quote:{tag 或 default}` |
| value | 去重后的语句集合(含 body/author/name) |
| 过期 | 按更新频率设,如 1~24 小时 |
| 兜底 | 缓存为空/接口失败时回落到静态语料或上次结果 |
## How:Redis 缓存实现(Python)
```python
import redis
import requests
import json
r = redis.Redis(host="localhost", port=6379, decode_responses=True)
CACHE_TTL = 3600 # 1 小时
def get_quote_cached(tag=None):
key = f"quote:{tag or 'default'}"
cached = r.get(key)
if cached:
return json.loads(cached)
# 缓存未命中,调用接口
url = "https://route.showapi.com/1646-2"
params = {"appKey": "YOUR_APPKEY"}
data = {"tag": tag} if tag else {}
try:
js = requests.post(url, params=params, data=data, timeout=10).json()
except requests.RequestException:
return None # 回落兜底
if js.get("showapi_res_code") != 0 or js["showapi_res_body"].get("ret_code") != 0:
return None
b = js["showapi_res_body"]
result = {"body": b.get("body"), "author": b.get("author"), "name": b.get("name")}
r.setex(key, CACHE_TTL, json.dumps(result, ensure_ascii=False))
return result
```
**本地(无 Redis)兜底:内存 + 文件**
```python
import time, json
_cache = {}
def get_quote_local(tag=None, ttl=3600):
key = tag or "default"
item = _cache.get(key)
if item and time.time() - item["ts"] < ttl:
return item["data"]
# ...调用接口,写入 _cache[key] = {"ts": time.time(), "data": result}
```
cURL(验证单次返回,缓存逻辑在客户端):
```bash
curl -X POST "https://route.showapi.com/1646-2?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "tag=%E5%AD%A6%E4%B9%A0"
```
## 返回示例与解析
缓存的 value 即 `showapi_res_body` 中的 `body/author/name`;字段含义见 [返回字段全解](https://www.showapi.com/guides/classic-quotes-fields-1646)。
## 进阶 / 边界
- **去重集合**:要做"每日不重复",缓存 value 用集合而非单条,取数时随机挑未被近期用过的一条。
- **过期策略**:名言更新慢,TTL 可设较长(如数小时到一天);若你紧跟"每日一句"语义,按自然日刷新即可。
- **失败回落**:接口异常时返回缓存旧值或静态库,保证展示不空。
## FAQ
**Q:免费接口缓存在省什么?**
省的是响应延迟与对接口的依赖(含潜在限流),不是费用;体验与韧性收益明显。
**Q:缓存 key 要不要带 tag?**
要。`tag` 不同返回主题不同,缓存须按 tag 隔离,默认句用 `default` 占位,避免串主题。
**Q:TTL 设多长合适?**
文档未给精确更新频率,仅说"持续更新中";低频场景设 1~24 小时均合理,按你的新鲜度需求调。
**Q:缓存和"每日一句"去重怎么配合?**
缓存存去重集合,每日取句时从集合中挑未用的;集合按 TTL 或自然日重建。
**Q:接口返回变了缓存会脏吗?**
TTL 到期自动重建;对一致性敏感可在重大更新后主动清 key。
## 相关能力 / 下一步阅读
- [免费经典语句 API 标签筛选](https://www.showapi.com/guides/classic-quotes-tag-filter-1646) — tag 与缓存 key
- [每日一句场景全链路设计](https://www.showapi.com/guides/classic-quotes-daily-quote-1646) — 定时 + 去重
- [免费经典语句 API 错误处理](https://www.showapi.com/guides/classic-quotes-error-handling-1646) — 失败回落
- **本系列共 11 篇**:查看[免费经典语句 API 开发指南总目录](https://www.showapi.com/guides/classic-quotes-guides-1646)