技术博客
免费档位下如何设计缓存节省调用?L0~L4 档位与 QPS 限制下的优化

免费档位下如何设计缓存节省调用?L0~L4 档位与 QPS 限制下的优化

作者: 万维易源
2026-09-01
缓存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)