详解缓存雪崩、缓存穿透、缓存击穿

张开发
2026/4/19 5:11:46 15 分钟阅读

分享文章

详解缓存雪崩、缓存穿透、缓存击穿
缓存雪崩是指大量的缓存数据在同一时间过期或者Redis服务宕机此时会有非常多的请求直接打在数据库上导致数据库压力过大甚至崩溃。核心解决思路分散过期时间、保证缓存服务高可用。避免方式①在设置缓存过期时间时加入随机数②采用多级缓存如本地缓存分布式存储(CaffeineRedis)的模式③构建高可用的缓存集群。通过哨兵模式或集群模式部署Redis避免因单点故障导致整个缓存服务不可用。这样即使个别节点宕机整个缓存服务依然能正常运行。缓存击穿可以看作是缓存雪崩的一个“微观”特例。它指的是某一个热点Key例如明星八卦、秒杀商品在缓存过期的瞬间有大量的请求并发地来访问这个Key。这些请求发现缓存过期于是都去数据库查询并重建缓存导致这个热点数据给数据库带来巨大的瞬时压力。与雪崩的区别雪崩是大量不同的Key失效击穿是单个热点Key失效。避免方式①设置热点数据永不过期②设置互斥锁。当发现缓存失效时不是所有线程都去查询数据库而是让一个线程去查询数据 库并重建缓存其他线程则等待待缓存重建完成后直接从新缓存中获取数据。缓存穿透是指请求一些不存在的数据也会增加数据库的压力避免方式①请求不存在的数据时也把请求结果存入Redis中需要防范恶意攻击者使用大量不同的Key来攻 击这会占用大量缓存空间。需要做好内存监控。②使用布隆过滤器布隆过滤器是一个二进制数组通过两个或以上的hash函数将一组数据映射到数组的两个位置上在请求此数据时先根据hash函数查看对应的数组位置是否为1只要有一个不是1就直接返回不查数据库但是布隆过滤器的方法名为mightcontain也就是可能包含不能100%确定数据是否存在。例如数据A的hash对应位置是1,3数据B的位置对应是2,4此时并不存在其他数据但是如果数据C的hash对应位置是1,4那么布隆过滤器会返回true的结果造成假阳性。

更多文章