# 免费地震信息:免费额度下的缓存与调用频率最佳实践
- **接口/接入点**:免费地震信息 · 2274-1
- **是否免费**:是(注册即免费额度,有档位限制)
- **请求方式**:POST / GET
- **返回格式**:JSON
- **适用人群**:已接入用户、生产环境开发者
- **阅读时间**:约 7 分钟
## 核心要点
- 接口免费但有档位限制(具体档位以 [免费 API 说明](https://www.showapi.com/free-api) 为准,本文不编数字),生产环境必须控制调用频率。
- 历史地震数据「当天基本不变」,非常适合按「日期(+地区)」做本地缓存,命中即返、未命中才调接口。
- 客户端做令牌桶/简单 sleep 限频 + 失败指数退避,是稳妥的生产写法。
## Why:免费不等于能随便刷
很多 demo 跑通后就直接上生产,结果用户每次刷新都打接口,几天把免费额度刷爆,接口开始限流。历史地震不是高频变化数据,合理的缓存与限频能让免费额度撑起一个不小的应用。
## What:接口速览
| 项 | 值 |
|----|----|
| 接口地址 | `https://route.showapi.com/2274-1?appKey={your_appKey}` |
| 计费 | 免费(档位限制见 [免费 API 说明](https://www.showapi.com/free-api)) |
| 数据特性 | 历史地震,当日数据基本稳定,适合缓存 |
## How:本地缓存 + 限频的 Python 示例
```python
import requests, time, json, os
from datetime import datetime, timedelta
APP_KEY = "YOUR_APPKEY"
URL = "https://route.showapi.com/2274-1"
CACHE_DIR = "cache"
os.makedirs(CACHE_DIR, exist_ok=True)
_last_call = 0
MIN_INTERVAL = 1.0 # 两次调用最小间隔(秒),按你的档位调整
def cached_day(date_str, ttl_hours=24):
path = f"{CACHE_DIR}/{date_str}.json"
if os.path.exists(path):
mtime = datetime.fromtimestamp(os.path.getmtime(path))
if datetime.now() - mtime < timedelta(hours=ttl_hours):
return json.load(open(path, encoding="utf-8")) # 命中缓存
return None
def fetch_day(date_str):
global _last_call
wait = MIN_INTERVAL - (time.time() - _last_call)
if wait > 0:
time.sleep(wait)
_last_call = time.time()
for attempt in range(3):
try:
r = requests.post(URL, params={"appKey": APP_KEY},
data={"date": date_str}, timeout=10)
body = r.json().get("showapi_res_body", {})
if body.get("ret_code") == 0:
json.dump(body, open(f"{CACHE_DIR}/{date_str}.json", "w", encoding="utf-8"))
return body
return body
except Exception as e:
time.sleep(2 ** attempt) # 指数退避
return None
# 使用:先查缓存,未命中再请求
day = "20250120"
data = cached_day(day) or fetch_day(day)
```
## 返回示例与解析
缓存命中时直接读本地 JSON,不再消耗接口额度;未命中才请求并落盘。返回结构同 [返回字段全解](https://www.showapi.com/guides/earthquake-info-response-fields-2274)。
## 进阶 / 边界
- **TTL 设定**:历史数据当日稳定,TTL 设 24 小时足够;「近期地震」(不传 date)更新更快,TTL 可缩短到 10~30 分钟。
- **缓存键设计**:以 `date` 为键;若做地区筛选,因 `area` 不可靠、`location` 是客户端过滤,缓存仍以 `date` 为键、过滤在读取后做。
- **限频参数**:`MIN_INTERVAL` 与重试次数按你的实际档位调整,本文不给出具体额度数字。
- **失败退避**:网络抖动时指数退避(1s→2s→4s)优于立即重试。
## FAQ
**Q1:免费额度到底能用多少次?**
具体档位限制以 [免费 API 说明](https://www.showapi.com/free-api) 为准,本文不编造数字;建议通过缓存把实际调用量降到最低。
**Q2:缓存会不会拿到过期数据?**
历史地震当日基本不变,24h TTL 风险极低。若你的场景要求「最新」,缩短 TTL 或不缓存「近期」查询即可。
**Q3:限频设多少合适?**
取决于你的档位。保守做法:单次循环请求间隔 ≥ 1 秒,并在服务端统一收敛多用户请求(如先查共享缓存),避免每个用户都直打接口。
**Q4:被限流了怎么办?**
先降低频率、加大缓存命中率;若仍不足,到控制台查看档位与升级选项。不要靠疯狂重试硬扛,会越限越狠。
## 相关能力 / 下一步阅读
- [免费地震信息:date 与 area 参数使用指南(含实测筛选坑)](https://www.showapi.com/guides/earthquake-info-params-guide-2274)
- [免费地震信息:科研取数——按日期批量导出震情做统计](https://www.showapi.com/guides/earthquake-info-research-dataset-2274)
- [免费地震信息:做一个「全球近期地震」查询页(前端实战)](https://www.showapi.com/guides/earthquake-info-recent-quakes-app-2274)
- **本系列共 14 篇**:查看[免费地震信息指南总目录](https://www.showapi.com/guides/earthquake-info-guides-2274)