问答

社媒接口的结果该缓存多久,才能少花冤枉钱?

简短回答

按数据变化快慢来定:博主资料缓存一天到一周;帖子正文可以一直留着,只在需要时刷新互动数;发布超过一周的帖子的评论缓存几天;热搜不缓存,每次快照单独存一条记录。省得最多的是单对象接口:一个看板每天被打开 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。 服务端可能用自己的短期缓存回答,并在返回里注明。别指望靠它省钱。

只为新内容付费的监测搭法,见竞品监测。

更新于