preview 的键把 Redis 撑到了报警线
报警是内存使用率,不是错误率。Redis 从 6 月底的大约 1.1GB 慢慢到了今天的 3.6GB,中间没有发过版本。我一开始在猜会话,因为键前缀里 sess: 看起来最多。MEMORY USAGE 抽了几条,会话单条不大,数量也还在过期。
真正大的是 preview:。发票预览会把渲染后的 PDF 路径和一份 HTML 放进缓存,键是 preview:{invoiceId}:{templateVersion}。模板一改,version 变了,旧键却还在。代码里 SET 的时候没给 TTL。我翻提交,这段是五月为了「预览别每次都渲染」加上的,评论里写了 TODO:上线前补过期。TODO 还在。
当时发票少,看不出来。六月开了批量导入,预览接口被页面自动调用,一份发票能留下三四份旧模板的缓存。没有淘汰,就一直堆着。
我给新写入加了 6 小时过期,并写了个一次性脚本,把 preview:* 里 TTL = -1 的删掉。脚本先 SCAN,不要 KEYS。删之前在从节点上看了数量,大约 18 万条。生产上分了十几批,每批间隔 2 秒。内存回到 1.4GB 附近。
预览缓存值不值得保留,我现在有点犹豫。渲染一次大概 200 毫秒,用户又不是连续打开同一份。6 小时可能还是长。先这样,过两周看命中率,命中很低就把时间再缩短,或者干脆去掉。