什么是缓存雪崩、缓存穿透、缓存击穿?如何解决?
1. 缓存雪崩
1. 概念2. 本质原因3. 解决方案
1. 防止缓存集中失效2. 保护数据库 2. 缓存穿透
1. 概念2. 本质原因3. 解决方案
1. 将空对象记录在缓存中2. 使用布隆过滤器 3. 缓存击穿
1. 概念2. 本质原因3. 解决方案
1. 过期时间长一点2. 保护数据库
什么是缓存雪崩、缓存穿透、缓存击穿?如何解决? 1. 缓存雪崩 1. 概念指在某一个时间段,缓存集中过期失效。所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
2. 本质原因大量key同时过期
3. 解决方案 1. 防止缓存集中失效过期时间+随机数:尽量让缓存失效的时间均匀分布,最次也得随机分布,尤其是一些访问大的接口。
2. 保护数据库加锁或者队列:防止大量线程对数据库的一次性进行读写,避免缓存失效时对数据库造成的巨大冲击,但吞吐量就降低了。
2. 缓存穿透 1. 概念指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,缓存失去意义。
2. 本质原因黑客攻击,查询数据库中不存在的数据
3. 解决方案 1. 将空对象记录在缓存中如果数据库返回信息为null,也可以将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓 存里边获取了
2. 使用布隆过滤器注意:将空对象设置一个较短的过期时间(因为没有意义,存着就是为了防止黑客高频null攻击)
关键字:bitmap数组、hash算法、误判率
详情见这篇文章:【Redis篇】什么是布隆过滤器?
3. 缓存击穿 1. 概念缓存击穿指的是热点key在某个特殊的场景时间内恰好失效了,恰好有大量并发请求过来了,造成DB压力(屋漏偏逢连夜雨)
2. 本质原因其实缓存击穿和缓存雪崩从概念上来讲差不多,只是缓存击穿是某些热点key,而雪崩指的是大规模的key。
热点key过期
3. 解决方案 1. 过期时间长一点对于一些热点key,过期时间可以无限调长
2. 保护数据库加锁或者队列的方式:和缓存雪崩处理方式意义



