一、测试概述
本次缓存测试主要证实系统在Redis发生缓存透过、缓存击穿、缓存雪崩三类典型异常场景下的服务稳定性、接口性能和保护方法有效性。测试目的:证实防护机制是不是生效,数据库压力是不是可控,接口响应时间、错误率是不是满足标准,防止数据库被突发流量打垮。测试环境包含业务应用、Redis、MySQL,使用JMeter作为压测工具,配套监控采集Redis命中标准、数据库CPU、连接数、接口RT、P99耗时等数据。测试前先采集正常业务流量下的性能基线,用于异常场景对比分析。
二、缓存透过测试设计
缓存透过指查询数据库不存在的数据,Redis无对应缓存,请求每次直达数据库。测试分为无防护标准测试和防护方法证实。标准测试:构造大量不存在的业务ID,开启高并发线程循环查询,监控Redis命中率为0,所有请求访问数据库。预期无防护时数据库QPS不断升高,高并发下连接耗尽、接口超时。
防护方案证实:一是空值缓存,查询不存在数据时,Redis写入短期空缓存。压测后观察,仅少量首轮请求访问数据库,后续请求命中空缓存,同时检查空缓存TTL不能过长,避免Redis内存占用过高。二是布隆过滤器方案,预加载全部合法业务ID,非法请求先经过布隆过滤器拦截。压测不存在ID,预期大部分请求在进入Redis前被拦截,极少请求访问数据库,同时证实布隆过滤器误判率和新增数据同步能力。
三、缓存击穿测试设计
缓存击穿是单个热点Key过期瞬间,大量并发请求同时涌入数据库。标准测试:创建访问量很高的热点Key,设置较短TTL,不断高并发压测该接口,等待key过期。无防护场景下,key过期瞬间Redismiss突增,数据库出现瞬时QPS尖峰,接口响应延迟明显上涨。
防护方法证实:分布式互斥锁方案,同一时刻仅允许一个请求查询数据库并回填缓存,其余请求等待重试。压测观测数据库同一时间只有单次查询,无流量尖峰,同时检查锁超时、死锁风险。思路过期方案,热点key不设置物理过期时间,在value内记录思路过期时间,后台异步线程刷新缓存。压测过程不会出现过期流量冲击,同时检查是不是存在短暂脏读问题。
四、缓存雪崩测试设计
缓存雪崩分为两种场景:大量key同一时间过期;Redis集群故障不可用。批量key过期标准测试:批量写入业务key并配置相同过期时间,不断并发压测,待key统一失效,大量请求直接访问数据库,造成数据库压力雪崩,接口大面积超时。防护方案为TTL增加随机偏移量,打散过期时间,压测后数据库流量平稳,无瞬时峰值。
Redis宕机故障注入测试,在压测过程中停止Redis服务,证实限流、熔断、本地缓存降级方法。预期触发熔断后限制数据库请求量,本地缓存兜底返回数据,避免数据库被压垮。同时证实Redis主从集群故障转移能力,缩短故障不断时间。
五、通用检查和风险说明
测试统一采集Redis命中率、数据库连接、CPU、接口错误率等标准。增加混合场景压测,模拟透过、击穿流量同时存在,长时间稳定性测试,证实锁残留、内存泄漏问题。测试必须在独立测试环境执行,压测前做好数据库保护,防止压测造成环境故障。测试完成后对比基线数据,考虑防护方法有效性,输出缺陷和优化建议,保障系统在缓存异常场景下稳定运行。