技术博客
十万个为什么 API 免费档位下:用缓存策略节省调用次数

十万个为什么 API 免费档位下:用缓存策略节省调用次数

作者: 万维易源
2026-09-02
十万个为什么 API免费档位缓存策略Redis节省调用
# 十万个为什么 API 免费档位下:用缓存策略节省调用次数 > 接口:十万个为什么(apiCode=1706)· 接入点:列表(1706-1) + 详情(1706-2) · 免费(有档位限制)· 适用人群:中高级开发者 / 架构师 · 阅读时间:约 8 分钟 ## 核心要点 - 接口免费但设有**调用档位限制**(档位细则见[官方档位说明](https://www.showapi.com/free-api),文档未给具体数字,本篇不编造)。 - 科普内容相对稳定,非常适合缓存:详情按 `id` 缓存、热门关键词列表按 `keyword+page` 缓存。 - 用 Redis 做带 TTL 的缓存,可把"重复查询"转化为"缓存命中",显著节省档位。 ## Why:免费不代表可以随便打 免费接口的档位限制是按调用次数算的。如果你的小程序每次用户打开都重新调列表+详情,几天就可能触达上限,导致服务不可用。科普问答内容更新频率低,缓存是性价比最高的优化,直接帮你"省着用"。 ## What:可缓存点 | 缓存对象 | 键设计 | 说明 | |----------|--------|------| | 详情内容 | `why:detail:{id}` | `id` 稳定,命中率最高 | | 列表结果 | `why:list:{keyword}:{page}` | 热门词复用 | | 总数/分页 | 内含于列表缓存 | 一并缓存 | ## How:Redis 缓存实现(Python) ```python import redis, requests, json APP_KEY = "YOUR_APPKEY" r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True) BASE = "https://route.showapi.com" def get_detail(qid: str, ttl: int = 86400) -> dict: key = f"why:detail:{qid}" cached = r.get(key) if cached: return json.loads(cached) # 缓存命中,不消耗档位 resp = requests.post(f"{BASE}/1706-2", data={"id": qid}, params={"appKey": APP_KEY}, headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10).json() body = resp["showapi_res_body"] if body.get("ret_code") != "0": raise RuntimeError(body.get("remark")) data = {"title": body["title"], "content": body["content"]} r.setex(key, ttl, json.dumps(data)) # 写缓存,TTL 1 天 return data def get_list(keyword: str, page: str = "1", ttl: int = 3600) -> list: key = f"why:list:{keyword}:{page}" cached = r.get(key) if cached: return json.loads(cached) resp = requests.post(f"{BASE}/1706-1", data={"keyword": keyword, "page": page}, params={"appKey": APP_KEY}, headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10).json() body = resp["showapi_res_body"] if body.get("ret_code") != "0": raise RuntimeError(body.get("remark")) r.setex(key, ttl, json.dumps(body["contentlist"])) return body["contentlist"] ``` **缓存策略建议** - 详情 TTL 较长(如 1~7 天):科普内容几乎不变。 - 列表 TTL 中等(如 1 小时):热门词短期复用,低频词自然过期。 - 写穿透保护:缓存未命中才请求接口;请求失败不写缓存,避免雪崩。 ## 返回示例与解析 首次 `get_detail("5bac6e8ec1b458bb0892f6ff")` 调用接口并写 Redis;同一 `id` 再次访问直接读缓存,不再消耗免费档位。 ## 进阶 / 边界 - **档位数字未知**:本接口具体档位上限文档未公开,统一写"以[官方档位说明](https://www.showapi.com/free-api)为准",不要编造阈值。 - **失效与更新**:若内容需强制刷新,主动 `r.delete(key)` 或在 TTL 内忽略更新(科普内容容忍延迟)。 - **批量/订阅不存在**:文档未提供批量查询或订阅推送,缓存是应对档位的首选手段。 ## FAQ **Q1:免费档位具体是多少次?** 文档未公开具体数字,以[官方档位说明](https://www.showapi.com/free-api)为准,本篇不编造。 **Q2:缓存会不会拿到旧内容?** 科普内容更新极慢,TTL 内视为可接受;如需最新可主动删 key 刷新。 **Q3:列表和详情都该缓存吗?** 都该。详情命中率最高、收益最大;列表对热门词也很有效。 **Q4:有没有官方的批量接口省次数?** 文档未提供批量或订阅能力,缓存是目前最优解。 **Q5:Redis 不是必须的吧?** 不是。单机可用内存字典/文件缓存;多实例高并发才需要 Redis 这类共享缓存。 ## 相关能力 / 下一步阅读 - [十万个为什么 API 分页查询:page / allPages / allNum / maxResult 详解](https://www.showapi.com/guides/why100k-pagination-1706) - [十万个为什么 API 关键词检索技巧:keyword 命中规律与避坑](https://www.showapi.com/guides/why100k-keyword-strategy-1706) - [十万个为什么 API 家长/教育类 App 方案:统一管理科普问答内容](https://www.showapi.com/guides/why100k-parent-app-plan-1706) - **本系列共 11 篇**:查看[十万个为什么 API 指南总目录](https://www.showapi.com/guides/why100k-guides-1706)