免费接口也有限流:星座运势查询缓存策略(避开档位限制 + 对齐每日3次更新)
# 免费接口也有限流:星座运势查询缓存策略(避开档位限制 + 对齐每日3次更新)
> 接入点 872-1 · 免费 · 适用:中高级开发者、架构师 · 阅读时间:约 7 分钟
## TL;DR
- 虽免费,但平台「为防止滥用设有使用档次限制」,盲目高频调用会触限;且数据每天仅 **1/7/17 点**更新 3 次,期间内容不变。
- 最佳实践:以「星座 + 周期 + 日期」为键做缓存,TTL 对齐更新节奏,定时预热。
- 缓存设计直接省钱/省额度、提升响应速度、降低工单。
## Why:免费不等于能无限调
很多团队看到「免费」就直连接口,结果用户量一上来就被档位限制拦住,或重复请求同一星座同一天的数据浪费额度。星座运势数据每日仅变 3 次,命中缓存后 99% 的请求根本不需要回源——这是性价比最高的优化。
## What:缓存目标
| 目标 | 策略 |
|------|------|
| 避开限流 | 回源前先查缓存,未命中才请求并写缓存 |
| 对齐更新 | TTL 跨过最近一次更新,等下次更新后自然失效 |
| 预热 | 每日 01:05/07:05/17:05 定时批量回源 12 星座 × 周期 |
## How:Redis 缓存设计
```python
import redis, time, requests
r = redis.Redis()
def get_horoscope(star: str, period: str, appkey: str):
# period ∈ {day, tomorrow, week, month, year}
today = time.strftime("%Y-%m-%d")
key = f"horo:{star}:{period}:{today}"
cached = r.get(key)
if cached:
return cached # 命中,不消耗额度
params = {"appKey": appkey, "star": star,
"needTomorrow":1, "needWeek":1, "needMonth":1, "needYear":1}
data = requests.get("https://route.showapi.com/872-1", params=params, timeout=10).json()
body = data["showapi_res_body"]
payload = body.get(period) # 按需取对应周期
# TTL 设到当日最后一次更新(17点)之后,例如按当前时间推到次日 01:10
ttl = max(3600, seconds_until_next_refresh())
r.setex(key, ttl, json.dumps(payload))
return payload
def seconds_until_next_refresh():
# 对齐 1/7/17 点三个更新窗口,返回到下一窗口的秒数 + 缓冲
now = time.localtime()
windows = [1, 7, 17]
# 简化:取下一窗口时刻(含 10 分钟缓冲)
...
```
> 说明:上述为生产级思路示意,回源建议配合令牌桶限流(见下),避免缓存集体失效时瞬时回源打满额度。
## 进阶 / 边界
- **TTL 对齐**:数据每日 1/7/17 点更新,TTL 设计为「到下一次更新窗口 + 缓冲(如 10 分钟)」,避免过期瞬间大量回源(缓存击穿)。可用互斥锁/单飞(singleflight)保护回源。
- **令牌桶**:即使有缓存,预热任务仍会集中回源,建议用令牌桶控制 QPS,保护档位额度。
- **档位数字未知**:具体免费档位阈值文档未给,以[免费档位说明](https://www.showapi.com/island/free-api)为准,缓存是规避触限的通用手段,不依赖具体数字。
## FAQ
**Q:缓存多久过期合适?**
A:对齐官方更新节奏即可——每日 3 次更新,TTL 设到下次更新后缓冲;周期内内容不变,长 TTL 安全。
**Q:缓存会不会拿到旧数据?**
A:不会,因为数据本身每日仅变 3 次,TTL 跨过更新窗口即可保证与官方一致。
**Q:配对接口(872-2)也要缓存吗?**
A:要,且收益更高——同一对星座+性别的组合会被反复查询,以「star1+gender1+star2+gender2」为键缓存性价比极高。
## 下一步阅读
- [星座运势 API:星座社区与社交 App 集成场景设计](https://www.showapi.com/guides/horoscope-community-app-872)
- [星座运势查询:调用失败排查](https://www.showapi.com/guides/horoscope-error-handling-872)
- [星座运势查询:5 分钟接入指南](https://www.showapi.com/guides/horoscope-quickstart-872)
- **本系列共 13 篇**:查看[星座运势 API 开发指南总目录](https://www.showapi.com/guides/horoscope-guides-872)