redis的缓存击穿,雪崩,穿透
缓存击穿(Cache Breakdown)
指某个热点数据在缓存中过期或失效的瞬间,大量请求直接打到数据库上,导致数据库压力骤增。
原因:
-
热点数据在缓存中过期。
-
大量并发请求同时访问该数据。
解决方法:
-
永不过期:对热点数据设置永不过期,但需要定期更新。
-
互斥锁:在缓存失效时,使用互斥锁(如Redis的
SETNX
命令)确保只有一个请求去数据库加载数据,其他请求等待并重试。 -
异步更新:在缓存即将过期时,异步更新缓存,避免大量请求同时打到数据库。
缓存雪崩(Cache Avalanche)
指缓存中大量数据在同一时间过期或失效,导致大量请求直接打到数据库上,引起数据库压力骤增甚至崩溃。
原因:
-
大量缓存数据在同一时间过期。
-
缓存服务器宕机或重启。
解决方法:
-
分散过期时间:为缓存数据设置随机的过期时间,避免大量数据同时过期。
-
高可用架构:使用Redis集群或其他高可用架构,避免单点故障。
-
降级和限流:在缓存失效时,使用降级策略(如返回默认值)和限流策略(如限制请求速率)来保护数据库。
缓存穿透(Cache Penetration)
指查询一个不存在的数据,由于缓存中没有该数据,请求直接打到数据库上,导致数据库压力增加。
原因:
-
查询的数据在数据库和缓存中都不存在。
-
恶意攻击或大量无效请求
解决方法:
-
布隆过滤器:使用布隆过滤器(Bloom Filter)在缓存层过滤掉不存在的数据,避免请求打到数据库。
-
缓存空值:对于查询结果为空的请求,缓存一个空值(如
NULL
),并设置较短的过期时间,避免重复查询数据库。 -
参数校验:在业务层对请求参数进行校验,过滤掉明显无效的请求。
总结
-
缓存击穿:热点数据失效导致大量请求打到数据库。
-
缓存雪崩:大量缓存数据同时失效导致数据库压力骤增。
-
缓存穿透:查询不存在的数据导致请求直接打到数据库。