问答
社媒接口的结果该缓存多久,才能少花冤枉钱?
简短回答
按数据变化快慢来定:博主资料缓存一天到一周;帖子正文可以一直留着,只在需要时刷新互动数;发布超过一周的帖子的评论缓存几天;热搜不缓存,每次快照单独存一条记录。省得最多的是单对象接口:一个看板每天被打开 50 次、每次都重新拉 200 篇小红书笔记,在 okdata 上一天要 $200.00;缓存一天只要 $4.00。
为同一份数据付两次钱,通常是不小心造成的:看板每次刷新页面都调一次接口,夜间任务把所有东西重拉一遍,做分析时反复重跑 notebook。在调用前面加一层小缓存,这三种情况都能解决。真正要决定的只有一件事:每类数据放多久再重新取。
适合社媒数据的缓存时长
| 数据 | 接口 | 变化速度 | 建议缓存 |
|---|---|---|---|
| 博主资料、粉丝数 | 抖音账号信息 | 慢 | 1 到 7 天 |
| 帖子正文和图片 | 小红书笔记详情 | 几乎不变 | 一直保留 |
| 帖子互动数 | 同一个接口 | 刚发时快,之后变慢 | 第一周按小时,之后按天 |
| 发布超过一周的帖子的评论 | TikTok 视频评论 | 慢 | 几天;只复查第一页 |
| 热搜榜 | 微博热搜 | 几小时就变 | 不缓存,每次快照单独存 |
| 搜索结果 | 按关键词 | 看关键词热度 | 等于你的监测间隔 |
单价决定了缓存在哪里最值钱。小红书笔记详情每篇 $0.02,重复查 1000 次就白花 $20.00。抖音账号信息每次 $0.002,这类便宜的查询做缓存,还能让大任务少撞频率限制。
十几行的缓存
import hashlib, json, os, pathlib, time, requests
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
CACHE = pathlib.Path(".okcache"); CACHE.mkdir(exist_ok=True)
def cached(path, ttl_seconds, **params):
key = hashlib.sha256(json.dumps([path, params], sort_keys=True).encode()).hexdigest()
f = CACHE / key
if f.exists() and time.time() - f.stat().st_mtime < ttl_seconds:
return json.loads(f.read_text())
body = requests.get(f"https://api.okdata.online{path}", headers=H, params=params, timeout=60).json()
if body["code"] == "ok":
f.write_text(json.dumps(body, ensure_ascii=False))
return body
profile = cached("/v1/douyin/users/get", 3 * 86400, id="MS4wLjABAAAA...")
只缓存成功的返回,错误不会被缓存住;何况错误本来就不收费。
两样东西不能当成你的缓存
- 幂等键。 24 小时内用同一个
Idempotency-Key重发同一个请求,会免费重放保存的结果。它保护的是重试,不是不同请求之间的通用缓存。 meta.cached。 服务端可能用自己的短期缓存回答,并在返回里注明。别指望靠它省钱。
只为新内容付费的监测搭法,见竞品监测。
更新于