应在缓存键生成前统一预处理URI和参数,过滤无意义随机字段(如_t、_r、ts等),再构建标准化key;map仅作存储工具,不参与键生成或清理;已有脏key可正则批量清理,但属补救措施;推荐配合命名空间与TTL降低风险。

直接在缓存键生成前做标准化处理,比事后“剔除”更可靠、更高效。map 本身不参与缓存键的构建或清理,它只是存储工具;所谓“剔除随机数干扰”,本质是统一键的生成逻辑,让相同语义的请求始终产出一致的 key。
统一预处理 URI 或参数,避免随机数进入缓存键
很多随机数来自前端埋点、防缓存参数(如 ?t=1716709234567)、或 SDK 自动生成的 trace_id。这些字段对缓存无意义,应在构造缓存 key 前就过滤掉:
- 用正则从原始 URL 中提取干净路径:例如
/api/user/123?_r=abc&t=123456→ 提取为/api/user/123 - 解析 query string 后,显式白名单保留关键参数(如
userId、page),忽略所有带_前缀或含t/ts/random的字段 - Java 示例中可使用
UriComponentsBuilder解析再重建,或用Map手动筛选后拼接
用 map 存储归一化后的键值对,而非原始请求
不要把带随机数的完整 URL 当作 key 存进 map;而是先归一化,再存:
- 原始请求:
GET /v2/report?uid=1001&format=json&_v=0.1.2&_t=1716709234 - 归一化 key:
v2:report:uid=1001:format=json(去掉_v和_t) - 这样即使前端发 100 次不同
_t的请求,最终只命中同一个 map key
对已有脏 key 做批量清理(仅限补救场景)
若缓存已混入大量含随机数的 key(如 user:1001:ts=1716709234),可通过遍历 + 正则匹配识别并删除:
- Java 中遍历
map.keySet(),用key.replaceAll(":(ts|t|_t|_r)=[^:]+", "")得到基准 key - 若该基准 key 已存在更“干净”的条目,当前条目即可
remove() - 注意:此操作需加锁或单线程执行,避免并发修改异常
配合 TTL 和命名空间,降低误伤风险
即便做了归一化,也建议给不同业务域的缓存加前缀(如 cache:api:v2:),再配合过期时间:
- 避免全局 map 膨胀,也方便按前缀批量
clear() - 设置合理 TTL(如 5–30 分钟),让偶然漏掉的脏 key 自动失效,无需强依赖剔除逻辑
- 不推荐长期依赖“运行时动态剔除”,而应把净化逻辑前置到 key 生成环节










