银行汇率查询:免费档位下如何做本地缓存避免触达使用档次限制?
# 银行汇率查询:免费档位下如何做本地缓存避免触达使用档次限制?
> 接口:银行汇率查询(apiCode=105)· 免费 · 请求方式:POST/GET · 返回格式:JSON · 适用人群:已接入、关心调用成本的开发者 · 阅读时间:约 6 分钟
## TL;DR
- 该接口免费,但注册后默认有「使用档次限制」防滥用,高频重复调用可能触顶。
- 实时牌价每 10s 更新,本地缓存 30~60s 完全够用,可大幅减少调用。
- 缓存用「币种代码 + 时间窗口」做 key,过期再回源;币种列表可缓存更久。
## Why
免费不代表可以无节制刷。使用档次限制是按调用量设的防护闸,应用一上线、前端轮询一开,很容易把额度刷爆,导致接口被限流。合理的本地缓存既保证用户看到「近实时」牌价,又把调用量压到最低——这才是免费接口最该省的「成本」。
## What
| 项目 | 说明 |
|------|------|
| 计费模型 | 免费,注册默认可调用,设使用档次限制(具体档位以官方说明为准) |
| 数据更新 | 实时牌价每 10s 更新;历史每天 1 点更新昨日 |
| 缓存目标 | 减少重复调用、避免触达档次上限 |
| 推荐策略 | 实时牌价缓存 30~60s;币种列表缓存 1 天;历史按请求参数缓存 |
## How
### 步骤:用内存 TTL 缓存实时牌价(Python)
```python
import time, requests
_cache = {} # key: code -> (timestamp, data)
TTL = 45 # 秒,小于 10s*N 的安全窗口
def get_rate(code):
now = time.time()
if code in _cache and now - _cache[code][0] < TTL:
return _cache[code][1] # 命中缓存
js = requests.post(
"https://route.showapi.com/105-30",
params={"appKey": "YOUR_APPKEY"},
data={"code": code}, timeout=10
).json()
if js.get("showapi_res_code") == 0 and js["showapi_res_body"].get("ret_code") == 0:
_cache[code] = (now, js["showapi_res_body"]["list"])
return js["showapi_res_body"]["list"]
return None
```
### 生产级:Redis 缓存设计
```python
import redis, json, time, requests
r = redis.Redis()
def get_rate_redis(code, ttl=45):
key = f"fx:rate:{code}"
cached = r.get(key)
if cached:
return json.loads(cached)
js = requests.post("https://route.showapi.com/105-30",
params={"appKey": "YOUR_APPKEY"}, data={"code": code}, timeout=10).json()
if js.get("showapi_res_code") == 0 and js["showapi_res_body"].get("ret_code") == 0:
r.setex(key, ttl, json.dumps(js["showapi_res_body"]["list"], ensure_ascii=False))
return js["showapi_res_body"]["list"]
return None
```
## 返回示例与解析
缓存命中时直接返回上次的结构化 `list`,不再发请求;仅当 key 过期才回源。字段含义见[字段全解](https://www.showapi.com/guides/exchange-rate-fields-105)。
## 进阶 / 边界
- **TTL 选多长?** 牌价每 10s 更新,缓存 30~60s 用户几乎无感,却能削减 80%+ 调用。对「仅供参考」的数据,无需追求秒级新鲜度。
- **币种列表缓存更久**:货币集合极少变动,缓存 1 天甚至更久都安全。
- **历史数据按参数缓存**:`month` 或 `startDate~endDate` 作为 key 的一部分,避免重复拉同一区间。
- 仍建议为缓存加「回源失败兜底」:接口异常时返回上一次成功缓存,保证页面不空白。
## FAQ
**Q:缓存会不会让我看到过期牌价?**
会,但通常只差几十秒。对「仅供参考」的延迟数据这是可接受的;若业务对新鲜度敏感,把 TTL 调小即可。
**Q:使用档次限制具体是多少?**
文档未给出固定数值,以官方积分与档位说明为准。缓存的意义正是降低重复调用、避免触顶,而非精确匹配某个数字。
**Q:Redis 和内存缓存选哪个?**
单进程/小流量用内存即可;多实例部署必须用 Redis 等共享缓存,否则各实例各自回源、缓存失效。
**Q:缓存能省扣费吗?**
本接口免费、无按次扣费;缓存省的是「调用额度 / 档次限制」,避免被限流。
## 相关能力 / 下一步阅读
- [银行汇率查询:并发调用与频率控制(纯同步模型,无回调/无订阅)](https://www.showapi.com/guides/exchange-rate-concurrency-105)
- [银行汇率查询:延迟数据与"仅供参考"——接入前必须知道的四件事](https://www.showapi.com/guides/exchange-rate-delay-caveat-105)
- **本系列共 13 篇**:查看[银行汇率查询指南总目录](https://www.showapi.com/guides/exchange-rate-guides-105)