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 契约层。整体数据流如下:

项目整体架构图 客户端 / 外部调用 API 网关 (OpenAPI 校验) Go 服务 (Gin + 分层架构) Handler → Service → DAO 读/写缓存 Redis 缓存层 持久化 MySQL 数据库 Binlog 监听 (Canal) 缓存失效/更新 说明: 客户端请求经 OpenAPI 网关校验后进入 Go 服务;服务优先读取 Redis,未命中则回查 MySQL 并回写缓存;MySQL Binlog 变更通过 Canal 异步刷新缓存,保证最终一致性。

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 中,方便统一治理与替换。

1.7 本章小结