商品详情缓存命中后接口还要 8ms,P99 从 30ms 涨到 90ms,缓存命中率 98% 却没有带来延迟下降。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
value = json.dumps(detail, separators=(',', ':'))
# 只缓存 id/name/price 等热字段,详情另取
缓存里存的是 2.3MB 的完整详情 JSON,命中后每次都要反序列化一遍,成本比直接查一次索引还高。本地缓存和网络传输都被这个大对象拖慢。这一点先确认清楚,后面就不用反复试。
碰到「大 value 反序列化」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
具体做法是,只缓存列表页需要的几个热字段 详情按需查;value 超过 200KB 就不要进本地缓存;用二进制或压缩格式 减少解析和内存占用。
改完照着核一遍,接口 P99 回到 32ms,本地缓存单条 value 降到 4KB,堆占用下降八成。
