技术博客
身份证归属地查询:用 Redis 缓存降低重复查询与频率限制风险

身份证归属地查询:用 Redis 缓存降低重复查询与频率限制风险

作者: 万维易源
2026-08-27
身份证归属地查询Redis缓存频率限制性能优化
# 身份证归属地查询:用 Redis 缓存降低重复查询与频率限制风险 > 接口:身份证归属地查询(apiCode=25,接入点 25-3) · 免费 · POST/GET · JSON · 适用人群:中高级开发者、架构师 · 阅读时间:约 6 分钟 ## TL;DR - 同一个身份证号,户籍地区/生日/性别**不会变**,结果天然可缓存。 - 以 `idcard:25:<身份证号>` 为 key 缓存,可省重复调用、降频率、提性能。 - 注意缓存穿透/雪崩的基本防护。 ## Why 在实名核验、批量导入等场景里,同一批用户会被反复查询,或同一身份证在多次业务流程中被多次调取。每查一次就发一次请求,既浪费调用额度、又可能触发平台频率限制。由于身份证的户籍信息长期稳定,把结果缓存起来是收益最高的优化。 ## What | 项 | 说明 | |----|------| | 缓存 key | `idcard:25:<身份证号>` | | value | `retData`(address/birthday/sex)或整段业务返回 | | 适用前提 | 结果稳定、幂等;免费接口仍受频率约束 | ## How ### 步骤 1:先查缓存,未命中再调接口 ```python import json import redis import requests r = redis.Redis(host="localhost", port=6379, db=0) APP_KEY = "YOUR_APPKEY" URL = "https://route.showapi.com/25-3" def get_idcard(id_number: str) -> dict: key = f"idcard:25:{id_number}" cached = r.get(key) if cached: return json.loads(cached) resp = requests.post(URL, params={"appKey": APP_KEY}, data={"id": id_number}, timeout=10) data = resp.json() if data.get("showapi_res_code") != 0 or data["showapi_res_body"].get("ret_code") != 0: raise RuntimeError("查询失败") rd = data["showapi_res_body"]["retData"] # TTL 设为较长(如 30 天);户籍信息极难变动 r.set(key, json.dumps(rd, ensure_ascii=False), ex=30 * 86400) return rd ``` ### 步骤 2:防穿透 对非法/不存在的号码,也缓存一个"空结果"短 TTL,避免恶意或异常号码反复击穿到接口。 ## 返回示例 缓存的 value 即 [返回字段全解](https://www.showapi.com/guides/idcard-attribution-fields-25) 中的 `retData`:`{"address": "...", "birthday": "...", "sex": "..."}`。 ## 进阶 / 边界 - **TTL 选择**:户籍地区/生日/性别基本不变,可设较长 TTL(如 30 天~1 年);若你业务要求"每次以接口为准",则缩短或加主动失效。 - **雪崩防护**:批量预热时给 TTL 加随机抖动,避免同一时刻集中过期。 - **缓存与源一致性**:本接口结果稳定,一致性风险低;若未来接口逻辑变化,按 key 前缀批量清缓存即可。 - **仍要限速**:缓存未命中时的突发并发,参考 [批量核验](https://www.showapi.com/guides/idcard-attribution-batch-25) 的限速写法。 ## FAQ **Q:缓存多久合适?** 户籍信息(籍贯/生日/性别)几乎不变,可设较长 TTL(如 30 天以上);若需"每次以接口为准"则缩短。本文不规定固定值,按你的业务容忍度定。 **Q:缓存会把错误结果也存进去吗?** 不应。只在 `ret_code == 0` 成功时才写入缓存;失败走重试/降级,不缓存。 **Q:免费接口为什么还要缓存?** 免费不等于无限频。缓存能降低请求频次、规避平台频率限制,同时提升响应速度。 **Q:key 里放身份证号会不会泄露?** Redis 属内部存储,应做好访问控制与加密;也可对号码做哈希后再作为 key,降低明文暴露。 **Q:批量导入时怎么用缓存?** 先查缓存,命中直接用;未命中再调接口并回写。配合 [批量核验](https://www.showapi.com/guides/idcard-attribution-batch-25) 效果最佳。 ## 相关能力 / 下一步阅读 - [身份证归属地查询:批量核验(Excel/CSV 导入)的循环调用设计](https://www.showapi.com/guides/idcard-attribution-batch-25) - [身份证归属地查询:返回字段全解(retData / address / birthday / sex 与系统级结构)](https://www.showapi.com/guides/idcard-attribution-fields-25) - [身份证归属地查询:错误处理与排错(showapi_res_code / ret_code 通用处理)](https://www.showapi.com/guides/idcard-attribution-errors-25) - **本系列共 12 篇**:查看[身份证归属地查询指南总目录](https://www.showapi.com/guides/idcard-attribution-guides-25)