免费档位限制下,如何设计缓存策略批量同步药品数据?
# 免费档位限制下,如何设计缓存策略批量同步药品数据?
- **接口/接入点**:药品信息查询(apiCode=1468)· 全部接入点
- **是否免费**:免费(有档位限制)
- **请求方式**:POST / GET
- **返回格式**:JSON
- **适用人群**:已接入用户、后端工程师
- **阅读时间**:约 6 分钟
## 核心要点
- 药品数据是**低频变更**的基准数据,非常适合缓存:首拉后落地本地库,日常读缓存,定期增量刷新。
- 免费接口有档位限制,批量同步要**分批 + 限速 + 重试**,避免触发限流。
- 用分类树(`classifyId`)做同步主键,按分类循环拉取 1468-2,再按需补 1468-3 详情。
## Why:为什么必须缓存
免费档位下每次实时调用都消耗额度,且药品数据相对稳定。把分类树和常用药品缓存到本地,既能省额度、提速,也能在接口偶发不可用时兜底展示。
## What:缓存方案速览
| 层 | 缓存什么 | key 设计 |
|------|------|------|
| 分类树 | 1468-1 全量 | `drug:cats`(整体一份,带版本时间戳) |
| 药品列表 | 1468-2 按分类 | `drug:list:{classifyId}:{page}` |
| 药品详情 | 1468-3/1468-4 | `drug:detail:{drugId}` |
## How:Redis 缓存 + 分批同步示例
```python
import requests, time, redis
APPKEY = "YOUR_APPKEY"
rds = redis.Redis(host="localhost", port=6379, db=0)
CACHE_TTL = 60 * 60 * 24 * 7 # 分类树缓存 7 天
def sync_categories():
body = requests.get(f"https://route.showapi.com/1468-1?appKey={APPKEY}", timeout=10) \
.json()["showapi_res_body"]
rds.set("drug:cats", str(body["data"]), ex=CACHE_TTL)
return body["data"]
def sync_list_by_cat(classify_id, max_pages=20, sleep=0.3):
"""按分类分批拉取药品列表,带限速与指数退避重试。"""
for page in range(1, max_pages + 1):
for attempt in range(3):
try:
r = requests.post("https://route.showapi.com/1468-2",
data={"appKey": APPKEY, "classifyId": classify_id, "page": str(page)},
timeout=10)
b = r.json()["showapi_res_body"]
if b.get("ret_code") != "0":
raise RuntimeError(b.get("msg"))
rds.set(f"drug:list:{classify_id}:{page}", str(b["data"]), ex=CACHE_TTL)
if page * b["maxResult"] >= b["count"]:
return
time.sleep(sleep) # 限速,保护免费档位
break
except Exception as e:
wait = 2 ** attempt
time.sleep(wait) # 指数退避
if attempt == 2:
print(f"分类 {classify_id} 第 {page} 页同步失败:{e}")
```
## 返回示例与解析
同步后读取走缓存,不再打接口:
```python
raw = rds.get("drug:list:599ad2a0600b2149d689b75a:1")
# 反序列化为本地药品列表,前端直接消费
```
## 进阶 / 边界
- **限速**:免费档位下每批之间加 `sleep`,失败用指数退避,不要并发猛打。
- **增量刷新**:监听本地「某分类药品为空/过期」再回源;不要全量每日重拉。
- **详情按需**:`drugList` 已含主要字段,仅在需要完整说明书时才调 1468-3,进一步省额度。
- 档位具体数值以[官方说明](https://www.showapi.com/free-api)为准,本文不编造。
## FAQ
**Q1:药品数据多久变一次,缓存多久合适?**
A:药品基准数据变更低频,分类树缓存数天、药品列表/详情缓存数小时到数天均可;以你业务对时效的要求定,过期再回源。
**Q2:免费档位被限流了怎么办?**
A:降低并发与频率,加指数退避重试;必要时评估升级档位或只缓存高频分类。
**Q3:缓存和实时查询怎么取舍?**
A:列表/分类走缓存,详情类低频请求可实时;把 1468-3 当成「点开详情才查」而非「列表预取」。
## 相关能力 / 下一步阅读
- [药品分类查询实战:用 classifyId 层层下钻到具体药品](https://www.showapi.com/guides/drug-info-classification-1468)
- [药品信息查询:5 分钟快速接入指南](https://www.showapi.com/guides/drug-info-quickstart-1468)
- [健康管理平台集成药品信息查询:从用药提醒到说明书展示](https://www.showapi.com/guides/drug-info-health-platform-1468)
- **本系列共 11 篇**:查看[药品信息查询指南总目录](https://www.showapi.com/guides/drug-info-guides-1468)