技术博客
文本关键词抽取:免费接口下的缓存与限流策略(节省调用档位)

文本关键词抽取:免费接口下的缓存与限流策略(节省调用档位)

作者: 万维易源
2026-08-31
文本关键词抽取缓存限流调用档位
# 文本关键词抽取:免费接口下的缓存与限流策略(节省调用档位) - **接口 / 接入点**:文本关键词抽取(apiCode 941)· 接入点 `941-1` - **是否免费**:是(有使用档次限制)| **请求方式**:POST / GET | **返回格式**:JSON - **适用人群**:已接入的开发者、架构师 - **阅读时间**:约 9 分钟 ## 核心要点 - 免费接口有「使用档次限制」,相同文本重复调用会白白消耗档位。 - 用「正文哈希」做缓存键,相同内容只调一次;生产用 Redis。 - 触发限流时退避重试,别硬刷。 ## Why:免费不是无限 注册后默认可免费调用,但平台为防止滥用设有使用档次限制。同一篇文章、同一条评论被反复抽取,每次都扣档位。做好缓存与限流,等于把免费额度花在刀刃上,也避免触发限流影响业务。 ## What:关键事实 - 计费:免费接口、统一计费、使用档次限制(详见 https://www.showapi.com/free-api)。 - 限额文档未给具体数字 → 以官方档位说明为准,不编造。 - 接口为同步请求-响应,无订阅推送,限流由网关按档位执行。 ## How:缓存 + 限流落地 ### 步骤 1 · 正文哈希缓存(Python + Redis) ```python import requests, hashlib, redis rds = redis.Redis(host="localhost", port=6379, db=0) def keywords(text, appkey, num=10, ttl=86400*7): key = "kw:" + hashlib.md5(text.encode("utf-8")).hexdigest() cached = rds.get(key) if cached: return cached.decode("utf-8").split("\n") if cached else [] resp = requests.post("https://route.showapi.com/941-1", data={"appKey": appkey, "text": text, "num": str(num)}, timeout=10) body = resp.json().get("showapi_res_body", {}) if str(body.get("ret_code")) != "0": return [] # 失败不写缓存,下次重试 kws = body.get("list", []) rds.set(key, "\n".join(kws), ex=ttl) return kws ``` ### 步骤 2 · 限流退避(指数退避) ```python import time def keywords_safe(text, appkey, num=10, retries=3): for i in range(retries): try: return keywords(text, appkey, num) except requests.exceptions.RequestException as e: wait = 2 ** i time.sleep(wait) # 1s, 2s, 4s 退避 return [] # 多次失败兜底 ``` ### 步骤 3 · 增量处理 只对新内容调用,已处理过的靠缓存命中: ```python def process_new(articles, appkey): for a in articles: if not already_indexed(a["id"]): a["tags"] = keywords_safe(a["body"], appkey) mark_indexed(a["id"]) ``` ## 返回示例与解析 正常返回 `list` 关键词数组即写入缓存;失败不缓存,便于重试。 ## 进阶 / 边界 - 缓存 TTL:内容不变可长期缓存(如 7 天);频繁变更的内容缩短 TTL。 - 限流信号:不同档位限流阈值不同,文档未给具体数值;触发后以退避重试应对,避免硬刷导致封禁。 - 批量场景:配合[批量处理与并发调用建议](https://www.showapi.com/guides/text-keyword-batch-941)做队列削峰。 ## FAQ **Q1:免费接口的限额是多少?** A1:文档未给出具体数字,以官方使用档次说明为准(https://www.showapi.com/free-api)。缓存能显著降低实际消耗。 **Q2:缓存键用什么?** A2:用正文文本的哈希(如 md5),相同文本命中同一缓存,避免重复调用。 **Q3:限流了会返回什么?** A3:由网关按档位返回系统级错误,具体看 `showapi_res_error`;用退避重试应对,必要时升级档位。 **Q4:缓存会不会把失败结果也存了?** A4:不应。只有 `ret_code == "0"` 才写缓存;失败返回空并留待重试。 **Q5:Redis 必须吗?** A5:单机可用内存字典;多机/生产用 Redis 等共享缓存,保证各实例命中一致。 ## 相关能力 / 下一步阅读 - [文本关键词抽取:返回结构与 ret_code 状态码全解](https://www.showapi.com/guides/text-keyword-response-codes-941) —— 限流报错怎么判 - [文本关键词抽取:批量文本处理与并发调用建议](https://www.showapi.com/guides/text-keyword-batch-941) —— 大批量怎么削峰 - **本系列共 10 篇**:查看[文本关键词抽取指南总目录](https://www.showapi.com/guides/text-keyword-guides-941)