缓存键设计核心是用map做标准化预处理与策略分发,先归一化uri和参数、注入业务维度标签、分离http方法策略,再拼接键;需前后端同步逻辑以确保一致命中。

缓存键设计结合 map 指令,核心不是让 map 直接“生成”键,而是用它做**标准化预处理与策略分发**,把原始请求特征转化为干净、一致、带业务语义的中间变量,再由 proxy_cache_key 或客户端逻辑引用。关键在于“先归一化,再拼接”,避免随机干扰,确保相同语义的请求始终产出同一缓存键。
统一清洗 URI 与查询参数
前端常携带 _t、ts、_r 等无意义参数,直接拼进缓存键会导致缓存碎片化。应在构造键前剥离这些字段:
- 在
http块中用map提取标准化路径: map $request_uri $clean_path {
~^(?/[^?]*)(\?.*)?$ $path;
default $request_uri;
} - 对 query string 做白名单过滤(如只保留
id、lang、version),可配合 Lua 或 Nginx Plus 的set_by_lua;若仅用原生 Nginx,建议在上游服务层或客户端完成清洗,map不适合做复杂字符串解析
按业务维度注入标识符
用 map 将请求特征映射为可读性强、易管理的维度标签,再参与缓存键拼接:
- 区分设备类型:
map $http_user_agent $device_type {
~*Mobile|Android|iPhone "mobile";
~*Tablet "tablet";
default "desktop";
} - 绑定语言或区域:
map $http_accept_language $lang {
~^zh "zh-CN";
~^en "en-US";
default "en-US";
} - 最终缓存键示例:
proxy_cache_key "$clean_path:$device_type:$lang:$version_param";
分离方法级缓存策略
不同 HTTP 方法语义不同,应避免 GET 和 POST 共享缓存槽位:
- 用
map分配缓存 zone 和 key 结构:
map $request_method $cache_zone {
GET static_cache;
HEAD static_cache;
POST api_no_cache;
default api_no_cache;
}
map $request_method $cache_key {
GET "$scheme$host$clean_path$lang";
POST "$scheme$host$clean_path$request_body";
default "$scheme$host$clean_path";
} - 在
location中启用:
proxy_cache $cache_zone;
proxy_cache_key $cache_key;
客户端缓存键同步设计
前后端缓存键需保持逻辑一致。服务端用 map 输出标准化字段后,可透传给前端作为键的一部分:
- 例如在响应头中注入维度标识:
add_header X-Cache-Namespace "$device_type:$lang" always; - 前端 JS 构建缓存键时复用该值:
const cacheKey = `${url}:${response.headers.get('X-Cache-Namespace')}`; - 这样服务端和客户端对同一资源的缓存判断完全对齐,避免“服务端命中但前端不认”的错配问题











