做本地生活号的老周,上周把票房榜搬到了自己的小站上。第二天就有人在评论区问:下午三点刷,头名还是上午十点的数字,这榜是死的吗。
他先怀疑接口挂了,抓包看请求正常返回 200,一小时里数据变了三次。问题在自己这边:页面套了十分钟缓存,返回里的 updateTime 他压根没读。
接口里三个时间字段别混着用
常见票房接口一条记录至少带 releaseDate、updateTime、boxOffice。updateTime 是数据方最后一次入库时间,boxOffice 多数是累计值。把累计票房当成单日票房排序,顺序一定歪,还会出现老片压新片的怪现象。
延迟不是一处造成的
- 影院端 T+0 上报,系统汇总本身有 10 到 30 分钟延迟
- 数据方清洗入库按批次走,常见 5 分钟一批
- 站点缓存、CDN、浏览器三层叠加,能拖出一小时
榜单缓存卡在 60 秒以内
缓存键带上日期,跨天不会读到昨天的残留。updateTime 超过 40 分钟没动,就在榜头标一行「数据更新于 xx:xx」,比嘴上说实时体面得多。前端轮询别短于 30 秒,免费额度经不起十几个标签页一起刷。
排序和单位上的小坑
单日榜按当日票房字段排,预售和点映单列,别混进总榜。接口给的金额多是元,展示统一换成万元保留一位小数,转换前先确认字段是数字还是字符串,字符串加号会拼成新串。
抓不到数据时留个退路
免费接口偶尔限流,返回码 429 或者干脆空数组。这时别把昨天的榜往前端推,页面上直接写「数据暂未更新」,比给错数字强。要长期稳定,只能走付费接口或者自建采集,人力和授权都跑不掉。
还有个容易忽略的点:接口分页只给前二十名,想展示前五十得翻两页再合并,按影片 id 去重,同一部片两页都出现的情况经常有。合并后按单日票房重排,别直接拼接展示,否则前十里会出现两个第九名。
老周最后把缓存压到 30 秒,加了一行更新时间,评论区安静了。票房榜的实时性说到底是刷新频率和数据源延迟的折中,真要秒级,只能自己盯影院排片,那是另一个成本量级。