列表页 ?status=1 和 ?status=2 返回同一份内容,先请求的那份被后一个复用,筛选结果对不上,X-Cache 全是 Hit。乍看像缓存或者权限的锅,追下去往往不是。

curl -s 'https://example.com/list?status=1' | md5sum
curl -s 'https://example.com/list?status=2' | md5sum

追下去是这么回事:缓存键只取了路径,查询串没有参与,不同筛选条件被当成同一个资源。反向的问题也有,把 utm 之类无关参数全拼进去,命中率又会掉。键里放什么,直接决定缓存能不能区分。

「缓存键丢查询参数」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,缓存键里保留完整查询串并对参数排序;分页和筛选参数全部纳入 不要只取 path;对无意义参数做白名单 避免打散缓存;用两个不同筛选值的 URL 各请求一次 对比响应内容。

验收就看一点,两个筛选条件返回各自的结果 缓存键里能看到完整参数 命中率没有明显下降。

作者 9823189