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 标记。这些是后续日志收集与错误排查工程的基础数据源。