缓存键设计需过滤埋点统计类参数,仅保留影响响应内容的查询参数,剔除utm_、ref、ts、_t、_r等噪音字段,防止缓存键膨胀、命中率下降。

缓存键设计中过滤埋点统计类参数,核心是**只保留影响响应内容的查询参数,剔除 utm_、ref、ts、_t、_r 等纯客户端或营销用途的“噪音”字段**。这类参数不改变资源实际内容(如图片、API数据),却会导致缓存键无限膨胀、命中率暴跌。
明确哪些参数该过滤
先识别典型无意义参数,它们通常具备以下特征:
- 仅用于前端行为追踪:utm_source、utm_medium、utm_campaign、gclid、fbclid、ref、from
- 防缓存干扰或时间戳:ts、t、_t、_timestamp、v(当为随机数或毫秒级时间时)
- 设备/环境标识:device_id、client_id、_r、_uid、browser_fingerprint
- AB测试临时标记:ab_test、exp_id、variant(除非后端真据此返回不同内容)
在CDN层统一剥离(推荐首选)
腾讯云CDN、阿里云DCDN等主流平台均支持「缓存键配置」,可直接开启「忽略指定查询参数」功能:
- 进入控制台 → CDN域名管理 → 缓存配置 → 查询字符串设置
- 选择「过滤参数」模式,填入需剔除的参数名(支持逗号分隔,如 utm_source,ref,ts,_t)
- 保存后,CDN在生成缓存键时自动忽略这些字段,?img.png?utm_source=weibo&ts=1726455000 和 ?img.png?ref=share 将映射到同一个缓存键
在Nginx反向代理层标准化key
若使用自建Nginx作为缓存网关,需手动归一化URL:
- 用 map 指令提取关键参数(如 page、sort、lang),丢弃其余
- 用 rewrite 重写请求,构造干净的 query string(如 /api/list?lang=zh&sort=price)
- 在 proxy_cache_key 中组合稳定字段:proxy_cache_key "$scheme$request_method$host$uri lang=$arg_lang sort=$arg_sort";
后端代码中提前清洗(兜底方案)
当CDN/Nginx不可控时,在业务逻辑入口做轻量清洗:
- 解析原始 query string,只保留白名单参数(如 ['lang', 'format', 'version'])
- 按字母序拼接剩余参数,生成确定性 key:cache_key = f"{path}?{'&'.join(sorted(whitelist_items))}"
- 注意:避免在 key 中拼接用户ID、会话ID等敏感或高基数字段











