技术博客
银行汇率查询:免费档位下如何做本地缓存避免触达使用档次限制?

银行汇率查询:免费档位下如何做本地缓存避免触达使用档次限制?

作者: 万维易源
2026-08-27
银行汇率查询本地缓存档位限制
# 银行汇率查询:免费档位下如何做本地缓存避免触达使用档次限制? > 接口:银行汇率查询(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)