图书ISBN查询免费档位下如何设计缓存策略省调用额度
# 图书ISBN查询免费档位下如何设计缓存策略省调用额度
> 接口/接入点:图书ISBN查询(1626-1) · 是否免费:免费(有使用档次限制) · 请求方式:POST / GET · 返回格式:JSON · 适用人群:中高级开发者、架构师 · 阅读时间:约 7 分钟
## TL;DR
- 图书信息变化慢,"同一 ISBN 短期内重复查"完全可避免:以 `isbn` 为缓存 key,命中即不调接口。
- 推荐 Redis 缓存,key=`isbn:{isbn}`,value=整条 `data`(JSON),TTL 建议 24 小时(结合"每天多次更新"的时效)。
- 缓存命中率越高,免费额度消耗越少、响应越快。
## Why
接口免费但有使用档次限制。图书元数据(书名/作者/出版社/定价)相对稳定,同一本书一天内被查几十次很常见。不加缓存,每一查都吃额度、还更慢。加一层缓存,几乎零成本把重复查询降为零,既省额度又提速。
## What
| 维度 | 建议 |
|------|------|
| 缓存 key | `isbn:{isbn}`(归一化后的纯数字/字母号) |
| 缓存 value | 整条 `data` 对象(JSON 序列化) |
| 存储 | Redis(分布式)或本地内存(单机) |
| TTL | 24 小时起;结合"每天不定时更新多次"的时效,可按业务容忍度调整 |
| 失效 | 主动更新书目时 `DEL` 对应 key |
## How
### 步骤 1:带缓存的查询(Redis)
```python
import requests, redis, json
APP_KEY = "YOUR_APPKEY"
r = redis.Redis(host="localhost", port=6379, db=0)
TTL = 86400 # 24h
def lookup_book(isbn: str) -> dict | None:
key = f"isbn:{isbn}"
cached = r.get(key)
if cached:
return json.loads(cached)
resp = requests.post(
"https://route.showapi.com/1626-1",
params={"appKey": APP_KEY},
data={"isbn": isbn},
timeout=10,
).json()
body = resp.get("showapi_res_body", {})
if body.get("ret_code") != 0:
return None
book = body["data"]
r.setex(key, TTL, json.dumps(book, ensure_ascii=False))
return book
```
### 步骤 2:本地内存兜底(单机小流量)
```python
from functools import lru_cache
@lru_cache(maxsize=5000)
def lookup_book_local(isbn: str):
# 同上调用逻辑;注意 lru_cache 不自动过期,适合短期进程
...
```
### 步骤 3:缓存未命中才计为一次真实调用
把"查缓存 → 未命中才请求"写进统一封装,业务层无感知。配合错误码排查篇处理"查不到"的缓存策略(查不到不建议长期缓存,避免脏数据)。
## 返回示例与解析
命中缓存时直接返回 `data` JSON,不再消耗接口额度;未命中才发起真实请求并写回缓存。
## 进阶 / 边界
- **TTL 取值**:文档说"每天不定时更新多次",24h TTL 在多数场景足够;对时效极敏感的可缩短,但会多耗额度。
- **"查不到"不要长缓存**:`ret_code` 非 0 时建议不缓存或只缓存极短时间,避免错号污染缓存。
- **主动失效**:书目人工修订后 `DEL isbn:{isbn}`,下次查询拉取最新。
- **额度监控**:关注免费档位剩余,接近上限时优先保障缓存命中。
## FAQ
**Q1:缓存 TTL 设多长合适?**
结合"每天多次更新",24 小时是稳妥起点;更在意时效可缩短,但额度消耗上升。
**Q2:查不到的书要不要缓存?**
不建议长缓存,否则错误号会一直命中;可设很短 TTL 或不缓存。
**Q3:Redis 挂了怎么办?**
降级为"跳过缓存直接请求",保证可用;恢复后自动重新写入。
**Q4:缓存能省多少额度?**
取决于重复查询比例;同一批书反复展示的场景,命中率可达很高,额度消耗接近降为零。
## 相关能力 / 下一步阅读
- [图书ISBN查询:5 分钟接入,从注册到第一条图书信息](https://www.showapi.com/guides/isbn-book-quickstart-1626)
- [图书ISBN查询错误码排查:ret_code 非 0 与"查不到"怎么办](https://www.showapi.com/guides/isbn-book-error-handling-1626)
- [图书ISBN查询避坑指南:字段缺失、更新频率与免费档位限制](https://www.showapi.com/guides/isbn-book-best-practice-1626)
- **本系列共 12 篇**:查看[图书ISBN查询(apiCode=1626)官方指南总目录](https://www.showapi.com/guides/isbn-book-guides-1626)