文本关键词抽取:免费接口下的缓存与限流策略(节省调用档位)
# 文本关键词抽取:免费接口下的缓存与限流策略(节省调用档位)
- **接口 / 接入点**:文本关键词抽取(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)