提示:文章先作为初版,等后续时间充足后,补充更深的内容
文章目录
- 缓存穿透、缓存击穿、缓存雪崩
- 一、区别
- 二、线程安全问题
缓存穿透、缓存击穿、缓存雪崩
一、区别
缓存穿透(Cache Penetration):
缓存穿透指的是恶意或非存在的请求不断地访问缓存和后端存储,导致缓存无法命中,每次请求都需要查询数据库或其他存储系统。这会增加数据库或存储系统的负载,并可能导致性能下降。
常见的解决方案包括在查询非法或不存在的数据时,将其缓存为特殊值(如null),或使用布隆过滤器等技术来过滤无效的请求。
缓存击穿(Cache Breakdown):
缓存击穿指的是当某个热点数据过期或被删除时,大量并发请求同时访问该数据,导致缓存无法命中,请求直接访问后端存储系统。这会对后端存储系统造成压力,并可能导致性能下降。
常见的解决方案包括在缓存失效时使用互斥锁或分布式锁来控制只有一个线程去加载数据并更新缓存,或者使用异步更新机制来避免大量请求同时访问后端存储系统。
缓存雪崩(Cache Avalanche):
缓存雪崩指的是当大量缓存数据同时失效或过期时,所有请求直接访问后端存储系统,导致后端存储系统负载激增,甚至崩溃。这是由于缓存的失效时间设置相同或相近,或者缓存系统故障引起的。
常见的解决方案包括设置缓存失效时间的随机性,使得缓存失效时间分散开来,或者使用多级缓存架构,避免单点故障。
二、线程安全问题
缓存穿透 | 缓存击穿 | 缓存雪崩 |
---|---|---|
缓存穿透:假如某一时刻访问redis的大量key都在redis中不存在(比如黑客故意伪造一些乱七八糟的key),那么也会给数据造成压力,这就是缓存穿透,解决方案是使用布隆过滤器,它的作用就是如果它认为一个key不存在,那么这个key就肯定不存在,所以可以在缓存之前加一层布隆过滤器来拦截不存在的key | 缓存击穿:和缓存雪崩类似,缓存雪崩是大批热点数据失效,而缓存击穿是指某一个热点key突然失效,也导致了大量请求直接访i问Mysql数据库,这就是缓存击穿,解决方案就是考虑这个热点key不设过期时间 | 缓存雪崩:如果缓存中某一时刻大批热点数据同时过期,那么就可能导致大量请求直接访问Mysql了,解决办法就是在过期时间上增加一点随机值,另外如果搭建一个高可用的Redis集群也是防止缓存雪崩的有效手段 |
Redis缓存和数据库中没有相关数据(例如用户直接携带id<=0的参数不断发起请求),Redis中没有这样的数据,无法进行拦截,直接穿透到了数据库里,导致数据库压力过大宕机 | 某一个热点key,在不停的扛着高并发,当这个热点key在失效的一瞬间,持续的高并发访问就击破缓存直接访问数据库,导致数据库宕机 | 在高并发的情况下,大量缓存key在同一时间失效,大量请求直接落在了数据库上,导致数据库宕机 |
非法检验与布隆过滤器 | 永不过期更新缓存 | 设置缓存失效时间的随机性 |
最后总结:
雪崩是大面积的key缓存失效;
穿透是Redis中不存在这个key;
击穿是Redis中某一热点数据突然失效;