什么是缓存雪崩、缓存击穿、缓存穿透?

我看你简历上有写到 Redis,那你能够介绍一下什么是缓存雪崩、缓存击穿和缓存穿透吗?

能够的,面试官
缓存雪崩是指大量的缓存数据几乎在同一时间内失效,而这时分又刚好碰上大量恳求过来获取该数据,
导致缓存没有击中,一切的恳求都直接打在了咱们的后端数据库中;
数据库压力骤增,就可能引发链路滚雪球式的不可用,一个服务拖垮一堆服务。
在 Redis 作缓存的场景中,表现的原因有:
1. 大量的 key 几乎在同一时间失效
2. Redis 宕机,导致一切 key 不可用
针对第一个原因,咱们能够采取以下的战略进行预防:
1. 均匀地设置过期时间,防止大量数据一起失效
2. 使用互斥锁构建缓存,防止一切恳求都打到后端数据库
3. 采用双 key 战略,主 key 设置过期时间,备 key 不设置,在主 key 失效的时分,能够返回备 key
4. Redis 后台构建缓存,能够是定期巡检,发现过期了就触发构建缓存,也能够是事务线程发现缓存失效后,通知 Redis 后台线程构建缓存。
针对 Redis 宕机的原因,咱们能够这么做:
1. 合理设计服务熔断或者恳求限流机制,防止大量恳求一起打到数据库
2. 构建 Redis 高可用集群,防止 Redis 缓存层面的不可用
能够看到咱们处理缓存雪崩的中心点便是防止大量恳求一起打到后端数据库,形成数据库压力骤增,然后防止了雪崩状况的产生。
缓存击穿和缓存雪崩很像,它是指一个或者几个缓存数据失效,大量恳求过来获取该数据,
导致缓存没有击中,一切的恳求都直接打在了咱们的后端数据库中;
数据库压力骤增,甚至被击垮。
缓存击穿能够看成是缓存雪崩的一个特例,
由于缓存击穿更多的是热门数据失效导致的,而不是大量数据;
可是它们所形成的后果是类似的——简单击垮数据库,然后导致一系列服务不可用。
所以咱们也是能够用互斥锁和后台构建缓存的计划来处理缓存击穿
缓存穿透,和前面两种不同,
前面两种只是缓存没击中,仍是有数据库兜底的;可是缓存穿透就不一样了,它是缓存没有该数据,数据库也没有该数据的。
缓存穿透产生的状况一般是以下两种:
1. 操作失误,把数据库的数据删了
2. 不合法恳求,专门恳求数据库没有的数据
针对第一种状况,便是要标准咱们的操作,防止出现误删的状况
针对第二种状况,咱们能够:
1. 限制不合法恳求
2. 缓存空值或者默认值
3. 使用布隆过滤器提早发现数据库中是否存在该数据
能够看到处理这类问题的中心是在该类场景下,防止大量恳求抵达数据库,
在达到这个目的的前提下,能够有多种处理计划。
这里的根因是数据库所能承受的并发量不是特别高所决定的。
以上便是我对缓存雪崩、缓存击穿和缓存穿透的答复。