Loading... ### **一、核心测试方向** 1. **功能正确性** - **缓存命中场景**:模拟数据已存在 Redis 中,验证接口是否直接返回缓存数据(避免穿透到 DB)。 - **缓存未命中场景**:首次请求时验证接口是否从 DB 加载数据并正确写入 Redis。 - **数据一致性**:当 DB 数据更新时(如用户修改信息),检查缓存是否同步更新或失效(通过 TTL 或主动删除)。 - **缓存更新策略**:测试主动更新(Write-Through) vs 惰性更新(Cache-Aside)。 2. **异常场景** - **Redis 宕机/网络中断**:验证接口是否有降级机制(如直接访问 DB)并返回合理错误码。 - **缓存穿透**:请求不存在的数据(如非法 ID),观察是否导致大量 DB 查询(防御方案:空值缓存或布隆过滤器)。 - **缓存雪崩**:模拟大量缓存同时过期,测试系统是否因瞬时 DB 压力崩溃(防御:随机过期时间)。 - **缓存击穿**:高并发请求同一个过期的热点 Key,验证锁机制(如 Redis 分布式锁)能否防止 DB 被压垮。 3. **性能测试** - **响应时间对比**:对比缓存命中 vs 未命中的接口延迟(缓存命中应显著更快)。 - **并发能力**:压测高并发场景(如 JMeter/Locust),观察 Redis 连接池是否溢出监控(`redis.clients.jedis.exceptions.JedisConnectionException`)。 - **内存与 TTL**:验证 Redis 内存占用是否合理,过期策略(如 LRU)是否有效。 4. **数据验证** - **缓存内容正确性**:通过 `redis-cli` 直接查询 Key,检查序列化格式(如 JSON/protobuf)、数据类型(String/Hash)和值是否符合预期。 - **过期时间**:使用 `TTL key` 命令检查 TTL 设置是否准确。 --- ### **二、测试工具与技巧** 1. **Redis 操作工具** - **命令行**:`redis-cli -h <host> -p <port>` → 使用 `GET key`、`HGETALL key`、`TTL key` 等命令验证数据。 - **图形工具**:RedisInsight、Another Redis Desktop Manager 可视化查看数据。 2. **模拟异常** - **强制宕机**:`redis-cli DEBUG SEGFAULT` 或直接重启 Redis 服务。 - **网络隔离**:使用 `tc`(Linux)模拟网络延迟或丢包: ```bash tc qdisc add dev eth0 root netem delay 1000ms # 增加 1s 延迟 tc qdisc del dev eth0 root # 恢复 ``` 3. **自动化测试** - **单元测试**:用 Mock 工具(如 Python 的 `unittest.mock`、Java 的 `Mockito`)模拟 Redis 行为。 - **集成测试**: ```python # Python 示例:使用 fakeredis 模拟 Redis from fakeredis import FakeRedis def test_cache_hit(): redis = FakeRedis() redis.set("user:1", "{'name': 'Alice'}") response = api_request(user_id=1) # 应命中缓存 assert response.status_code == 200 ``` --- ### **三、典型测试用例** | 场景 | 测试步骤 | 预期结果 | |---------------------|------------------------------------------------------------------------|------------------------------| | **缓存首次加载** | 1. 清空 Redis<br>2. 调用查询接口(ID=101) | 1. 返回 DB 数据<br>2. 数据写入 Redis | | **DB 更新同步** | 1. 请求 ID=102(缓存存在)<br>2. 更新 DB 中 ID=102 的数据<br>3. 再次请求 ID=102 | 第 3 步返回**最新数据**(缓存已更新或失效) | | **Redis 宕机** | 1. 停止 Redis 服务<br>2. 调用接口 | 接口降级访问 DB,返回正常数据/错误码 | | **高并发击穿** | 1. 设置热点 Key 过期<br>2. 用 100 线程并发请求该 Key | 仅 1 个线程访问 DB,其余等待或命中重建缓存 | --- ### **四、环境与配置检查** 1. **Redis 配置** - 最大内存策略:`maxmemory-policy`(如 `allkeys-lru`)。 - 连接池配置:`maxTotal`(最大连接数)是否合理。 2. **监控指标** - **命中率**:`keyspace_hits / (keyspace_hits + keyspace_misses)`(低于 0.8 需优化)。 - **内存占用**:`used_memory` 是否接近 `maxmemory`。 - **慢查询**:检查 `slowlog get` 输出。 --- ### **五、缓存策略建议** - **读写模式**:优先用 **Cache-Aside**(先读缓存,未命中读 DB 再回填)。 - **删除 vs 更新**:数据频繁变更时,**删除缓存**(而非更新)更安全(避免并发写入导致脏数据)。 - **双写一致性**:结合消息队列(如 Kafka)异步更新缓存,或使用 Canal 监听 DB 变更。 通过覆盖上述场景,可确保 Redis 在接口中可靠、高效地工作,同时保障系统稳定性。 最后修改:2025 年 06 月 03 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏