1. 课程概述:搜索服务工程案例背景、集成测试的重要性、Redis在搜索服务中的角色
1.1 工程案例背景:从零构建高可用搜索服务
本课程以一个真实的电商商品搜索服务为工程案例。该服务需要支持海量商品(千万级 SKU)的实时检索、多维度筛选(价格、品牌、分类)、相关性排序以及高并发(峰值 QPS 10万+)访问。在微服务架构下,搜索服务作为核心链路,其稳定性直接决定用户体验和订单转化率。
案例架构采用经典的分层设计,核心组件如下:
| 层级 | 组件 | 职责 |
|---|---|---|
| 接入层 | Nginx + OpenResty | 流量分发、限流、防爬虫 |
| 业务层 | Search API (Spring Boot) | 查询解析、参数校验、结果聚合 |
| 索引层 | Elasticsearch 集群 | 倒排索引、全文检索、打分排序 |
| 缓存层 | Redis 集群 | 热点数据缓存、分布式锁、限流计数器 |
| 存储层 | MySQL + HBase | 商品元数据持久化、全量数据备份 |
案例痛点: 在一次大促压测中,Redis 集群因内存碎片率过高触发
OOM 错误,导致缓存击穿,ES 集群瞬间被打满,搜索服务整体不可用长达 12 分钟。事后复盘发现,集成测试阶段对 Redis 错误码的断言覆盖严重不足。
1.2 集成测试的重要性:为什么不能只靠单元测试?
在搜索服务中,单元测试只能验证单个函数或模块的逻辑正确性,但无法捕获跨组件交互时的异常行为。集成测试填补了这一空白,其核心价值体现在:
- 验证真实依赖:测试 Search API 与 Redis、ES 的真实网络通信,而非 Mock 对象。
- 捕获配置错误:如 Redis 连接池超时配置不当、序列化方式不匹配等。
- 断言错误码行为:当 Redis 返回
MOVED、ASK、CLUSTERDOWN等错误码时,服务能否正确降级或重试。 - 保障数据一致性:验证缓存更新与数据库变更的最终一致性。
以下对比表清晰展示了单元测试与集成测试在搜索服务中的差异:
| 维度 | 单元测试 | 集成测试 |
|---|---|---|
| 测试范围 | 单个类/方法 | 跨服务、跨组件调用链 |
| 依赖管理 | Mock 全部外部依赖 | 启动真实 Redis/ES 容器 |
| 错误码覆盖 | 模拟异常对象 | 真实网络错误码(如 ETIMEDOUT) |
| 执行速度 | 毫秒级 | 秒级(依赖容器启动) |
| 发现缺陷类型 | 逻辑错误、边界值 | 配置错误、网络异常、集群状态异常 |
1.3 Redis 在搜索服务中的角色:不止是缓存
在搜索服务中,Redis 承担了三个关键角色,每个角色都对应不同的错误码风险:
- 热点缓存:存储热门搜索词的结果列表,使用
GET/SET命令。风险:OOM、LOADING(持久化时)。 - 分布式锁:防止缓存重建时多个线程同时回源 DB,使用
SET NX EX。风险:NOSCRIPT(Lua 脚本未加载)、BUSYGROUP(Stream 消费者组冲突)。 - 限流计数器:基于滑动窗口的 QPS 限流,使用
INCR+EXPIRE。风险:WRONGTYPE(类型误用)、EXECABORT(事务回滚)。
课程核心观点: 集成测试中,对 Redis 错误码的断言不能停留在“是否抛出异常”层面,而应深入到“错误码类型 + 业务降级策略”的组合验证。例如:当断言
CLUSTERDOWN 时,必须验证服务是否触发了“读本地缓存 + 异步重试”的降级路径。
1.4 课程学习路径与预期收获
本课程共 30 章,从基础概念到实战演练,层层递进。你将掌握以下核心能力:
- Redis 错误码体系:全面理解 20+ 常见错误码的触发场景与语义。
- 集成测试框架搭建:基于 Testcontainers + JUnit 5 构建可复用的测试基础设施。
- 断言策略设计:针对不同错误码,设计“状态码 + 响应体 + 降级行为”的多维度断言。
- CI/CD 集成:将错误码断言测试无缝嵌入 GitLab CI / Jenkins 流水线。
前置要求: 建议学习者具备 Spring Boot 基础、Redis 基本命令使用经验以及 JUnit 测试框架的初步了解。课程中会提供完整的 Docker Compose 环境,无需本地安装 Redis 集群。