python -c "import struct; f=struct.unpack('f',struct.pack('f',19.9))[0]; print(repr(f))"
redis-cli --scan --pattern 'price:*' | head -5

商品详情接口缓存命中率只有 3%,日志里同一个商品两次请求的 key 一个是 price:19.9 一个是 price:19.899999618530273。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:float32 只有 24 位有效位,19.9 存进去已经是近似值,转成 float64 会把误差原样展开成长串小数。两种精度混用,同一个价格算出的字符串不同,key 自然对不上。

「浮点缓存键」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:缓存 key 只用整数或字符串标识 价格别放进去;必须带价格时先按分转成整数;key 拼装收口到一个函数 固定格式;上线后盯命中率曲线 确认没有持续走低。

确认没问题再收工,同一商品连续请求十次 key 完全相同 缓存命中率回到 90% 以上。

作者 9823189