1. 课程导学与项目全景
1.1 缓存一致性问题的业务背景
在微服务与高并发架构下,缓存(Redis)与数据库(MySQL)之间的数据不一致是引发线上故障的头号杀手。典型场景包括:
- 缓存穿透:大量请求直接打到数据库,导致连接池耗尽。
- 缓存击穿:热点 key 失效,瞬间并发全部穿透。
- 缓存雪崩:大量 key 同时过期,数据库负载飙升。
- 双写不一致:并发写操作导致缓存与数据库数据错乱。
业务痛点:某电商平台曾因缓存与订单库不一致,导致库存超卖 2000 单,直接经济损失超 50 万元。缓存一致性不是“理论问题”,而是真金白银的工程红线。
1.2 课程目标与交付物
本课程将带你从零构建一个生产级 Go 服务,完整解决缓存一致性问题,并落地 OpenAPI 契约。学完本课程,你将获得:
| 维度 | 具体目标 | 交付物 |
|---|---|---|
| 缓存治理 | 掌握延迟双删、Binlog 监听、分布式锁等 5 种一致性策略 | 可复用的 cache-consistency 中间件 |
| Go 工程 | 构建分层清晰、可测试的 Go 项目骨架 | 基于 Gin + GORM 的完整项目模板 |
| OpenAPI 契约 | 使用 OpenAPI 3.0 规范驱动 API 设计与文档生成 | 契约文件 + 自动校验工具链 |
| 可观测性 | 集成 Prometheus 指标与结构化日志 | Grafana 监控大盘配置 |
1.3 项目整体架构概览
本项目采用经典的三层微服务架构,核心组件包括 Go 服务、Redis、MySQL 以及 OpenAPI 契约层。整体数据流如下:
1.4 核心技术栈与版本
| 组件 | 技术选型 | 版本 | 用途 |
|---|---|---|---|
| Go | Gin + GORM + Go-Redis | Go 1.21+ | 业务服务主语言 |
| 缓存 | Redis | 7.x | 热点数据缓存 |
| 数据库 | MySQL | 8.0 | 持久化存储 |
| 契约 | OpenAPI 3.0 (Swagger) | 3.0.3 | API 定义与校验 |
| 可观测 | Prometheus + Grafana + Zap | 最新稳定版 | 监控与日志 |
1.5 缓存一致性策略矩阵
本课程将覆盖以下 5 种主流缓存一致性策略,每种策略的适用场景与代价如下:
| 策略 | 一致性级别 | 复杂度 | 适用场景 |
|---|---|---|---|
| 延迟双删 | 最终一致 | 低 | 读多写少,允许秒级延迟 |
| Cache-Aside 模式 | 最终一致 | 低 | 通用场景,业务最常用 |
| 分布式锁 + 双写 | 强一致 | 中 | 库存、金额等关键数据 |
| Binlog 异步刷新 | 最终一致 | 高 | 写频繁、对延迟不敏感 |
| 读写分离 + 版本号 | 最终一致 | 中 | 多副本缓存场景 |
课程路线图:我们将从最简单的 Cache-Aside 模式开始,逐步引入分布式锁与 Binlog 监听,最终构建一个可应对生产级流量的一致性治理方案。
1.6 项目目录结构(核心骨架)
项目采用标准的 Go 工程布局,分层清晰,便于扩展与测试:
cache-consistency-project/
├── api/ # OpenAPI 契约文件 (YAML)
│ └── openapi.yaml
├── cmd/ # 主入口
│ └── server/main.go
├── internal/ # 业务逻辑
│ ├── handler/ # HTTP 处理器
│ ├── service/ # 业务服务层
│ ├── dao/ # 数据访问层
│ ├── cache/ # 缓存策略实现
│ ├── model/ # 数据模型
│ └── middleware/ # 中间件 (日志、鉴权)
├── pkg/ # 公共工具包
│ ├── redis/ # Redis 客户端封装
│ ├── mysql/ # MySQL 连接管理
│ └── logger/ # 结构化日志
├── config/ # 配置文件
│ └── config.yaml
├── deploy/ # 部署与监控
│ ├── docker-compose.yaml
│ └── grafana-dashboard.json
└── go.mod
工程注意:
internal 目录下的包不会被外部导入,这是 Go 官方推荐的模块隔离方式。所有缓存策略实现均放在 internal/cache 中,方便统一治理与替换。