3. 缓存服务架构概览:Docker 中的部署模式与缓存命中概念

在微服务与容器化架构中,缓存层是保障系统低延迟与高吞吐的核心组件。本章将梳理三种主流缓存服务(Redis、Memcached、Varnish)在 Docker 中的典型部署模式,并建立缓存命中/未命中的基础概念,为后续的回归冒烟与日志排查奠定架构认知。

3.1 三种缓存服务的定位与 Docker 部署模式

不同的缓存服务在数据模型、持久化策略与网络层级上存在显著差异,其 Docker 部署模式也各有侧重。下表从核心特性与部署要点进行对比:

缓存服务 数据模型 持久化 典型 Docker 部署模式 端口映射
Redis Key-Value(支持 String、Hash、List、Set、Sorted Set) RDB / AOF 持久化 单实例 + 持久化卷;哨兵/集群模式(多容器编排) 6379
Memcached Key-Value(纯内存,仅 String) 无持久化 单实例或分布式客户端分片;无状态,重启即清空 11211
Varnish HTTP 反向代理缓存(基于 VCL 策略) 内存缓存 + 持久化存储后端(可选) Sidecar 模式或独立反向代理容器;绑定宿主机端口 80 / 6081(管理端口)
工程提示: 在回归冒烟场景中,Redis 和 Memcached 通常作为应用层数据缓存,而 Varnish 更多用于 HTTP 响应缓存。日志收集的侧重点不同:Redis 关注慢查询与键过期,Memcached 关注内存淘汰与连接数,Varnish 关注 VCL 命中率与后端健康状态。

3.2 缓存命中与未命中的基本概念

缓存命中率是衡量缓存效率的核心指标。理解命中与未命中的生命周期,是设计日志采集与错误排查策略的前提。

  • 缓存命中(Cache Hit): 请求的数据在缓存中存在且未过期,直接从缓存返回,不穿透到后端存储或源服务器。
  • 缓存未命中(Cache Miss): 请求的数据在缓存中不存在、已过期或被淘汰,需要从后端存储或源服务器重新获取并回填缓存。
  • 缓存穿透: 请求的数据既不在缓存中,也不在后端存储中(如查询不存在的用户 ID),导致每次请求都穿透到后端。
  • 缓存雪崩: 大量缓存键在同一时间过期或缓存服务宕机,导致请求全部落到后端,引发后端压力激增。
  • 缓存击穿: 一个热点键在过期瞬间,大量并发请求同时穿透到后端。
冒烟关注点: 回归冒烟测试中,应重点验证缓存服务启动后是否能正常响应 GET/SET 操作,以及缓存命中/未命中的日志是否按预期格式输出。例如,Redis 的 SLOWLOG 是否开启,Varnish 的 varnishlog 是否捕获到 Hit / Miss 标记。

3.3 缓存请求生命周期与日志埋点

下图展示了在 Docker 容器化环境中,一次缓存请求从客户端到缓存服务再到后端的完整生命周期,以及关键的日志埋点位置。

缓存请求生命周期与日志埋点 客户端 缓存服务 后端存储 请求 未命中时回源 回填缓存 响应 日志埋点说明 ① 客户端侧:记录请求开始时间、目标缓存键、超时设置。 ② 缓存服务侧:记录命中/未命中、键过期、淘汰策略、慢查询。 ③ 后端存储侧:记录回源请求、响应时间、错误状态码。 命中决策 命中 → 直接返回 未命中 → 回源

3.4 常见部署架构对比:单实例 vs. 集群 vs. Sidecar

在 Docker 环境中,缓存服务的部署架构直接影响日志采集的拓扑与错误排查的路径。下表对比三种常见模式:

部署模式 适用场景 日志采集方式 故障隔离性
单实例容器 开发环境、低并发测试、单点缓存 直接挂载日志卷或使用 docker logs 低(容器宕机即缓存丢失)
集群/哨兵模式 生产环境高可用、数据分片 集中式日志收集(如 Filebeat + Elasticsearch) 高(主从切换、故障转移)
Sidecar 模式 Varnish 作为反向代理缓存,与应用容器同 Pod Sidecar 容器日志与应用日志分离,通过共享卷或 stdout 采集 中(Sidecar 故障影响缓存,不影响应用主进程)
避坑提醒: 在回归冒烟测试中,如果使用集群模式,务必验证每个节点的日志输出是否独立且完整。常见错误是只采集了主节点的日志,忽略了从节点的慢查询或连接错误,导致排查时遗漏关键线索。

3.5 缓存命中/未命中的日志格式示例

不同缓存服务的日志格式差异较大,冒烟测试中需要确认日志是否包含关键字段。以下为典型日志片段:

# Redis 慢查询日志示例(SLOWLOG)
1) 1) (integer) 1
   2) (integer) 1712345678
   3) (integer) 12034
   4) 1) "GET"
      2) "user:profile:12345"
   5) "127.0.0.1:6379"
   6) ""

# Memcached 统计日志(通过 stats 命令)
STAT get_hits 45231
STAT get_misses 1234
STAT curr_connections 56

# Varnish 命中/未命中日志(varnishlog)
*   << Request  >> 12345
-   Begin          req 12345 rxreq
-   Timestamp      Start: 1712345678.123456
-   VCL_call       HIT
-   VCL_return     deliver
-   Timestamp      Hit: 1712345678.123789

在回归冒烟中,应至少验证:Redis 的 SLOWLOG 是否可查询、Memcached 的 stats 是否返回命中计数、Varnish 的 varnishlog 是否输出 HIT/MISS 标记。这些是后续日志收集与错误排查工程的基础数据源。