Nginx 不提供通用 KV 缓存,但支持三种高性能路由缓存机制:1. map 指令配合共享内存实现静态键值路由映射;2. proxy_cache 缓存上游路由决策结果;3. njs 模块实现动态 KV 缓存。

Nginx 本身不提供“大型键值对缓存”这种类似 Redis 或 Memcached 的通用内存 KV 存储功能。它没有内置的、可自由写入/读取任意 key-value 的运行时缓存系统。但如果你的目标是用缓存机制优化路由转发性能(比如基于请求特征快速决定转发目标),Nginx 提供了两种高度相关且生产级可用的机制:共享内存区(shared memory zone) 和 map 指令配合变量缓存。它们能高效支撑大规模、低延迟的路由决策。
使用 map 指令 + 共享内存实现高性能路由映射
这是最常用、最轻量、也最适合“键值路由”的方式:把请求中的某个字段(如 Host、URL 路径、Header、参数)作为 key,映射到后端 upstream 名称或地址,Nginx 在启动时加载映射表,并在共享内存中缓存查找结果,每次请求仅做 O(1) 查找。
http {
# 定义一个共享内存 map 区,用于缓存映射关系(支持热重载)
map $http_host $backend_upstream {
default backend_default;
"api-v1.example.com" backend_v1;
"api-v2.example.com" backend_v2;
"admin.example.com" backend_admin;
# 支持正则和通配(需加 ~* 前缀)
"~*^staging\..+\.example\.com$" backend_staging;
}
upstream backend_v1 {
server 10.0.1.10:8080;
}
upstream backend_v2 {
server 10.0.1.11:8080;
server 10.0.1.12:8080;
}
upstream backend_admin {
server 10.0.1.20:9000;
}
upstream backend_default {
server 127.0.0.1:8000;
}
server {
listen 80;
location / {
proxy_pass http://$backend_upstream;
proxy_set_header Host $host;
}
}
}✅ 优势
- 映射表在 master 进程初始化时加载,worker 进程共享内存访问,无锁、零拷贝
-
$http_host等变量解析开销极低,整个路由判断在毫秒级内完成 - 支持热重载(
nginx -s reload),无需重启即可更新路由规则 - 内存占用极小(每个映射项约几十字节),万级条目仅占几 MB
⚠️ 注意:map 不支持动态写入(如运行时插入新 key),适合静态或低频变更的路由策略。若需实时增删,应结合外部服务(如通过 lua-resty-http 查询 Redis)。
利用 proxy_cache 缓存上游响应 + 预判式路由(适用于带状态的转发逻辑)
当路由逻辑依赖后端响应内容(例如鉴权后返回 target_id),可将「请求 → 路由目标」这一决策结果缓存下来,避免重复调用后端做路由计算:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
http {
proxy_cache_path /var/cache/nginx/route_cache
levels=1:2
keys_zone=route_cache:10m
max_size=100m
inactive=1h
use_temp_path=off;
upstream router_service {
server 127.0.0.1:8090; # 专用路由决策服务,返回 JSON {"upstream":"backend_v3"}
}
server {
location /api/ {
# 先查缓存:key = 请求路径 + 关键 header
set $route_key "$request_uri|$http_x_user_id";
proxy_cache route_cache;
proxy_cache_key $route_key;
proxy_cache_valid 200 10m; # 缓存成功响应 10 分钟
# 若未命中,转发给路由服务获取目标 upstream
proxy_pass http://router_service;
proxy_buffering off;
proxy_ignore_headers Cache-Control Expires Set-Cookie;
# 响应体中提取 upstream 名并设置变量(需启用 ngx_http_sub_module 或 njs)
# 更推荐:路由服务直接返回 307 + X-Upstream 头,Nginx 用 proxy_intercept_errors + error_page 捕获
}
}
}? 这种方式本质是「缓存路由决策结果」,适合:
- 路由依赖用户身份、设备类型、灰度标签等动态上下文
- 后端路由服务较重(如需查 DB 或调用鉴权中心)
- 可接受一定 stale 时间(如 10 分钟内不重新决策)
使用 njs 模块实现自定义键值缓存(高级场景)
Nginx 1.19.5+ 内置 njs 引擎,支持在配置中嵌入 JavaScript,可操作 shared 对象实现真正的运行时 KV 缓存:
# 在 http 块中定义 njs 脚本
js_import conf.d/router.js;
js_set $upstream_name router.chooseUpstream;
server {
location / {
proxy_pass http://$upstream_name;
}
}conf.d/router.js 示例:
// 使用 shared 对象模拟 LRU 缓存(最大 10000 条)
const cache = new SharedMap('route_cache', {maxSize: 10000});
function chooseUpstream(r) {
const key = r.headersIn['X-Tenant-ID'] || 'default';
let upstream = cache.get(key);
if (upstream === undefined) {
upstream = fetchUpstreamFromDB(key); // 或调用 HTTP API
cache.set(key, upstream, 300); // TTL 5 分钟
}
return upstream;
}
export default {chooseUpstream};✅ 适合需要真正动态写入、TTL 控制、LRU 清理的复杂路由场景
⚠️ 要求编译时启用 --with-http_js_module,且 njs 版本 ≥ 0.8.0;不适合超高 QPS 场景(JS 执行有微小开销)
不复杂但容易忽略:所有这些机制都依赖 Nginx 的事件驱动与共享内存设计,无需额外进程或中间件,就能把路由转发延迟压到微秒级。关键在于选对模型——静态映射用 map,动态决策缓存用 proxy_cache,强定制需求再上 njs。


















