3. 代理缓存核心概念:远程仓库、缓存策略、TTL、元数据缓存与内容缓存
代理缓存是 Nexus 制品仓库实现“本地加速 + 远程透传”的核心机制。理解其底层概念,是进行容量规划与误差预算计算的前提。本节将拆解代理缓存的五大支柱:远程仓库、缓存策略、TTL、元数据缓存与内容缓存。
3.1 远程仓库:代理的目标端点
远程仓库是 Nexus 代理缓存的目标上游,可以是公共仓库(如 Maven Central、npmjs.org、Docker Hub)或内部私有仓库。Nexus 通过代理仓库类型将请求转发至远程 URL,并将响应制品与元数据缓存到本地存储。
| 属性 | 说明 | 容量规划影响 |
|---|---|---|
| 远程 URL | 上游仓库的完整地址 | 决定网络延迟与带宽消耗 |
| 认证方式 | Basic Auth / / 匿名 | 影响连接池配置与重试策略 |
| 连接超时 | 建立 TCP 连接的最大等待时间 | 超时过短导致缓存未命中时失败 |
| 重试策略 | 失败后重试次数与间隔 | 影响缓存填充速度与存储压力 |
容量规划提示: 远程仓库的响应速度直接影响缓存填充速率。若上游仓库延迟 > 500ms,建议增大连接超时并启用异步缓存预热,避免同步阻塞导致代理仓库性能下降。
3.2 缓存策略:命中与未命中的决策逻辑
Nexus 代理仓库的缓存策略决定了何时从远程拉取、何时直接返回本地缓存。核心策略包括:
- 缓存优先(Cache First): 本地存在有效缓存则直接返回,否则回源拉取并缓存。
- 强制回源(Always Fetch): 忽略本地缓存,每次请求都从远程仓库拉取(适用于校验场景)。
- 条件请求(Conditional Request): 使用
If-Modified-Since或ETag头,仅当远程资源变更时才重新下载。 - 负缓存(Negative Cache): 对 404/403 等错误响应进行短暂缓存,避免重复请求无效资源。
误差预算关联: 缓存命中率直接决定代理仓库的“有效容量”。命中率每提升 10%,可减少约 15% 的远程请求带宽消耗,从而降低误差预算的消耗速率。
3.3 TTL:缓存的生命周期管理
TTL(Time To Live)是缓存有效期的核心参数。Nexus 为元数据与内容缓存分别设置不同的 TTL 值:
| 缓存类型 | 默认 TTL | 推荐范围 | 容量规划考量 |
|---|---|---|---|
| 元数据缓存 | 1440 分钟(24 小时) | 60 ~ 1440 分钟 | 元数据体积小但请求频繁,TTL 过短增加远程查询压力 |
| 内容缓存 | 43200 分钟(30 天) | 1440 ~ 43200 分钟 | 制品体积大,TTL 过长可能导致磁盘占用膨胀 |
| 负缓存 | 60 分钟 | 5 ~ 60 分钟 | TTL 过长可能屏蔽真实可用的远程资源 |
避坑提醒: 不要对所有仓库使用统一 TTL。对于频繁发布更新的开发仓库(如 SNAPSHOT),建议将元数据 TTL 缩短至 5~10 分钟;对于稳定发布的 release 仓库,可适当延长至 7 天以上。
3.4 元数据缓存与内容缓存:两种存储模型
Nexus 将缓存分为两个独立存储层,分别对应不同的容量规划维度:
- 元数据缓存(Metadata Cache): 存储仓库索引、包列表、版本信息、POM 文件、
package.json等结构化数据。体积小(通常 < 1MB/条),但请求量极大(占代理仓库总请求的 60%~80%)。 - 内容缓存(Content Cache): 存储实际的制品文件(JAR、WAR、Docker 镜像层、npm 包等)。体积大(从 KB 到 GB 不等),但请求频率相对较低。
容量规划关键指标: 元数据缓存通常占用总缓存空间的 5%~10%,但消耗 70% 以上的 IOPS;内容缓存占用 90%~95% 的磁盘空间,但 IOPS 需求较低。规划时需分别计算两者的存储与性能预算。
3.5 代理缓存完整流程(SVG 架构图)
下图展示了 Nexus 代理仓库从客户端请求到缓存响应的完整数据流:
3.6 缓存策略对比表
不同缓存策略在容量规划中的表现差异显著,下表总结了各策略的适用场景与存储影响:
| 策略 | 命中率 | 存储消耗 | 网络带宽 | 适用场景 |
|---|---|---|---|---|
| 缓存优先 | 高(>90%) | 高 | 低 | 稳定版本仓库、CI/CD 频繁构建 |
| 强制回源 | 0% | 低 | 高 | 安全审计、版本校验 |
| 条件请求 | 中(60%~80%) | 中 | 中 | SNAPSHOT 仓库、频繁更新场景 |
| 负缓存 | N/A | 极低 | 降低无效请求 | 防止重复请求不存在的资源 |
3.7 元数据缓存与内容缓存分离模型(SVG 结构图)
下图展示了元数据缓存与内容缓存在存储架构上的分离设计,以及各自的容量规划关注点:
3.8 关键参数配置示例
以下是一个典型的 Maven 代理仓库缓存配置片段,展示了 TTL 与缓存策略的实际设置:
# Nexus 代理仓库缓存配置示例(Maven Central)
# 元数据缓存 TTL:120 分钟(适合频繁更新的中央仓库)
metadataMaxAge: 120
# 内容缓存 TTL:1440 分钟(1 天,平衡存储与更新频率)
contentMaxAge: 1440
# 负缓存 TTL:10 分钟(避免长时间屏蔽新发布的制品)
negativeCacheEnabled: true
negativeCacheTTL: 10
# 启用条件请求(减少不必要的全量下载)
useConditionalRequests: true
# 缓存优先策略(默认)
cacheMode: CACHE_FIRST
容量规划最佳实践: 建议为每个代理仓库建立独立的缓存 TTL 策略矩阵。对于高频访问的元数据,使用较短的 TTL 并配合条件请求;对于大体积的内容缓存,使用较长的 TTL 并定期清理过期条目。通过监控缓存命中率与存储增长率,动态调整 TTL 参数,使误差预算保持在目标范围内。