技术博客
免费档位限制下,如何设计缓存策略批量同步药品数据?

免费档位限制下,如何设计缓存策略批量同步药品数据?

作者: 万维易源
2026-09-03
缓存策略批量同步Redis免费档位
# 免费档位限制下,如何设计缓存策略批量同步药品数据? - **接口/接入点**:药品信息查询(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)