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 代理仓库从客户端请求到缓存响应的完整数据流:

Nexus 代理缓存流程架构图 Nexus 代理缓存流程架构图 客户端请求 Nexus 代理仓库 缓存命中判断 元数据缓存 内容缓存 远程仓库 TTL 过期检查 返回缓存/远程响应 缓存决策逻辑 • 命中:直接返回 • 未命中:回源拉取 • TTL 过期:重新验证

3.6 缓存策略对比表

不同缓存策略在容量规划中的表现差异显著,下表总结了各策略的适用场景与存储影响:

策略 命中率 存储消耗 网络带宽 适用场景
缓存优先 高(>90%) 高 低 稳定版本仓库、CI/CD 频繁构建
强制回源 0% 低 高 安全审计、版本校验
条件请求 中(60%~80%) 中 中 SNAPSHOT 仓库、频繁更新场景
负缓存 N/A 极低 降低无效请求 防止重复请求不存在的资源

3.7 元数据缓存与内容缓存分离模型(SVG 结构图)

下图展示了元数据缓存与内容缓存在存储架构上的分离设计,以及各自的容量规划关注点:

元数据缓存与内容缓存分离架构 元数据缓存与内容缓存分离架构 Nexus 代理仓库 元数据缓存层 POM / package.json / 索引 版本列表 / 校验和 / 签名 容量占比:5%~10% | IOPS 占比:70%+ 内容缓存层 JAR / WAR / Docker 镜像层 npm 包 / PyPI 包 / 二进制文件 容量占比:90%~95% | IOPS 占比:30% 分离存储,独立规划容量与性能

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 参数,使误差预算保持在目标范围内。