# 免费档位限制下:如何设计缓存策略节省调用次数?
> 接口级 · 免费(有档位限制) · 返回 JSON · 适用:已接入、关注成本的用户 · 阅读时间:8 分钟
## TL;DR
- 外汇数据查询是**免费**接口,但默认档位对调用频次/总量有限制(积分可兑换更高档位)。
- 日线(1683-2)数据每天才更新一次,**最适合长缓存**;分钟 K(1683-3)有 5 分钟延迟,可缓存 5 分钟。
- 用「按 code+区间 做 key + TTL」的缓存,能把重复查询的调用量降到极低。
## Why:免费不等于可以无限刷
免费接口的「限制」往往体现在调用频次或日总量上。如果你的应用每次页面刷新都去调一次接口,很容易触达上限。合理缓存能让你既省钱(调用次数)又提速(本地命中)。
## What:各接入点的缓存 TTL 建议
| 接入点 | 更新节奏 | 建议缓存 TTL | 理由 |
|--------|---------|--------------|------|
| 热门列表 1683-1 | 结构稳定 | 1 天 | 可查范围很少变 |
| 日线 1683-2 | 每天 4 点更新昨天 | 1 天 | 历史数据不变,今天查昨天的结果当天有效 |
| 分钟K 1683-3 | 每 5 分钟更新一批 | 5 分钟 | 数据本身有 5 分钟以上延迟 |
| 海外列表 1683-4 | 品种清单稳定 | 1 天 | 元数据很少变 |
## How:带 TTL 的内存缓存(Python)
```python
import requests, time
_cache = {}
def cached_call(point, payload, appkey, ttl=86400):
key = (point, tuple(sorted(payload.items())))
now = time.time()
if key in _cache and now - _cache[key][0] < ttl:
return _cache[key][1]
r = requests.post(f"https://route.showapi.com/1683-{point}",
data={**payload, "appKey": appkey}, timeout=10)
data = r.json()
_cache[key] = (now, data)
return data
# 日线缓存 1 天,分钟K 缓存 5 分钟
daily = cached_call("2", {"code":"USDCNY","begin":"20250120","end":"20250201"},
"YOUR_APPKEY", ttl=86400)
minute = cached_call("3", {"code":"CADCNY","hour":"2025020610"},
"YOUR_APPKEY", ttl=300)
```
> 生产环境建议用 Redis 替代内存字典,key 设计同上文(`point + 排序后的参数`),并设置对应 TTL。
## 进阶 / 边界
- **不要缓存失败的返回**:仅当 `ret_code==0` 时写入缓存,失败应重试而非缓存错误。
- **TTL 略短于更新周期**:例如日线 TTL 设 23 小时而非 24,避免跨更新点的边界问题。
- **档位以官方为准**:具体限制数值文档未给,请按官方档位说明配置,缓存是「省调用」而非「绕过限制」。
## FAQ
**Q1:缓存会不会拿到过期行情?**
A:会,但本接口本就是延迟数据、仅供学习分析,缓存一天对历史日线完全合理;分钟 K 设 5 分钟 TTL 与数据延迟匹配。
**Q2:Redis key 怎么设计?**
A:用 `forex:{point}:{sorted_params_hash}`,TTL 按上表设置。
**Q3:缓存能突破档位限制吗?**
A:不能也不应试图突破;缓存只是消除重复查询,合法降低调用量。
**Q4:并发写缓存会乱吗?**
A:内存字典非线程安全,生产请用 Redis 或加锁。
## 下一步阅读
- [汇率监控与异常波动告警:批量查询接入指南](https://www.showapi.com/guides/forex-monitor-alert-1683)
- [外汇数据查询:日线历史查询接入点实战](https://www.showapi.com/guides/forex-daily-history-1683)
- [外汇数据查询:历史分钟K线查询接入点实战](https://www.showapi.com/guides/forex-minute-kline-1683)
- **本系列共 13 篇**:查看[外汇数据查询指南总目录](https://www.showapi.com/guides/forex-guides-1683)