免费档位下如何设计缓存节省调用?L0~L4 档位与 QPS 限制下的优化
# 免费档位下如何设计缓存节省调用?L0~L4 档位与 QPS 限制下的优化
> 元信息:接口/接入点 中文文本相似度检测接口(294/1、294/2)· 免费 · 返回格式 JSON · 适用人群 已接入、关心成本与稳定性的开发者 · 阅读时间 约 8 分钟
## 核心要点
- 本接口是**免费接口**,但平台设统一档位限流:L0 100 次/天·1 QPS,最高 L4 50,000 次/天·50 QPS。优化目标是"在额度内办更多事"。
- 三大杠杆:**结果缓存**(相同文本对不重复调用)、**请求合并/限流**(令牌桶控 QPS)、**前置粗筛**(先用廉价方式过滤明显不相似的 pair)。
- 缓存 key 用文本内容的稳定指纹(如哈希),而不是原始文本串。
## Why:免费不等于无限
注册即免费很友好,但 L0 只有 100 次/天、1 QPS。如果你的去重逻辑对每条新内容都和全库逐条比,很快触顶,用户体验变成"接口频繁限流"。用缓存 + 限流 + 粗筛三件套,能把有效调用量压到原来的零头。
## What:档位与限制
| 档位 | 每日调用 | QPS | 获取方式 |
|------|---------|-----|---------|
| L0 基础版 | 100 次/天 | 1 | 注册即享(免费) |
| L1 进阶版 | 500 次/天 | 5 | 5,000 积分/年 |
| L2 高级版 | 2,000 次/天 | 10 | 15,000 积分/年 |
| L3 专业版 | 10,000 次/天 | 30 | 50,000 积分/年 |
| L4 旗舰版 | 50,000 次/天 | 50 | 100,000 积分/年 |
> 这是免费接口平台的通用档位,非本接口独有;具体以[官方档位说明](https://www.showapi.com/free-api)为准。
## How:缓存 + 限流 + 粗筛
### 步骤 1:结果缓存(相同文本对只算一次)
```python
import hashlib, requests, redis
rds = redis.Redis()
def fingerprint(a, b):
pair = "\u0001".join(sorted([a, b])) # 无序对,A-B 与 B-A 同 key
return hashlib.sha256(pair.encode("utf-8")).hexdigest()
def sim_cached(a, b):
key = "sim:" + fingerprint(a, b)
cached = rds.get(key)
if cached is not None:
return float(cached)
resp = requests.post("https://route.showapi.com/294-1",
params={"appKey": "YOUR_APPKEY"},
data={"t1": a, "t2": b}, timeout=10).json()
val = resp["showapi_res_body"].get("like")
rds.setex(key, 86400 * 7, val) # 缓存 7 天
return val
```
### 步骤 2:令牌桶控 QPS(避免触发限流)
```python
import time
class TokenBucket:
def __init__(self, rate, capacity):
self.rate, self.capacity = rate, capacity
self.tokens, self.ts = capacity, time.time()
def acquire(self):
now = time.time()
self.tokens = min(self.capacity, self.tokens + (now - self.ts) * self.rate)
self.ts = now
if self.tokens >= 1:
self.tokens -= 1
return True
return False
bucket = TokenBucket(rate=1, capacity=1) # L0: 1 QPS
def sim_throttled(a, b):
while not bucket.acquire():
time.sleep(0.1)
return sim_cached(a, b)
```
### 步骤 3:前置粗筛(廉价过滤明显不相似)
先用关键词交集 / SimHash 等低成本方式判断"大概率不相似"的 pair 直接跳过,只对疑似 pair 调用接口。
## 返回示例与解析
缓存命中时直接返回 Redis 中存储的 `like`,不再消耗免费额度;限流保证不突破档位 QPS。
## 进阶 / 边界
- **缓存失效策略**:文本库更新、接口算法升级时,旧相似度可能失真,建议带 TTL(如 7 天)并支持手动失效。
- **无序对归一**:比较是对称的,缓存 key 应对 `a,b` 与 `b,a` 归一,避免重复计算。
- **档位升级是兜底不是解药**:先优化调用效率,真放量再升档,成本更可控。
## FAQ
**Q1:免费接口有调用上限吗?**
有。平台统一档位,L0 基础版 100 次/天、1 QPS,可用积分升级到 L4(50,000 次/天、50 QPS)。具体以官方档位说明为准。
**Q2:缓存 key 用什么?**
用文本内容的稳定指纹(如排序后拼接再哈希),不要用原始文本串当 key;比较对称,a-b 与 b-a 应归一为同一 key。
**Q3:QPS 超限会怎样?**
可能触发平台限流导致请求失败,用令牌桶在客户端平滑控速可避免。
**Q4:先做粗筛还是先调接口?**
先粗筛。用低成本方式(关键词交集、SimHash)过滤明显不相似的 pair,只对疑似项调用接口,能显著省额度。
## 下一步阅读
- [中文文本相似度检测接口实战:UGC 评论 / 文章去重从采集到判重的全链路设计](https://www.showapi.com/guides/text-similarity-dedup-294)
- [中文文本相似度检测接口:5 分钟从注册到第一条相似度结果](https://www.showapi.com/guides/text-similarity-quickstart-294)
- [中文文本相似度检测接口批量匹配:单文本 vs 候选库如何定位最相似项](https://www.showapi.com/guides/text-similarity-batch-294)
- **本系列共 12 篇**:查看[中文文本相似度检测接口指南总目录](https://www.showapi.com/guides/text-similarity-guides-294)