这是一个老掉牙的面试题,如果被问到且不会,那也够你喝一壶的了,话不多说,直接上干货。
一、缓存穿透
1.场景
大量客户端请求查询数据,这个数据Redis没有,DB也没有,大量请求Redis可以承受,DB承受不了宕机了。
2.解决方案
1)可能有人要干我(恶意攻击),针对发起大量请求的ip进行封禁。
2)针对不存在的key给它缓存一个null,每次查都返回null。
3)布隆过滤器,在查数据库之前,可以先经过布隆过滤器查看是否存在,存在再查DB
(布隆过滤器最大的特点是:说有的不一定有,说没有的一定没有)
二、缓存击穿
1.场景
存放在Redis中的热点数据生存时间到期,导致大量请求查询DB,DB宕机。
2.解决方案
1)热点数据生存时间不应该到期,查一次,增加一次生存时间
2)查询DB之前加锁(分布式锁、传统锁都可以)
三、缓存雪崩
1.场景
Redis缓存中的大量数据生存时间同时到期,导致大量请求访问DB,导致DB宕机。
2.解决方案
1)查询数据库之前加锁(分布式、传统锁)
2)缓存预热时,将key的生存时间设置为一个范围,不让它们同时到期
四、缓存倾斜(热key问题)
1.场景
有一个超级热点数据存储在Redis集群的某一个结点上,导致大量的请求都访问Redis集群的某一个节点,导致这个节点宕机
2.解决方案
1)给存放热点数据的节点搭建主从架构分担查询压力
2)多级缓存(本地缓存、cdn、redis等)
3)将key根据一定的后缀名进行拆分,分散到多个阶段中,客户端请求的时候再根据一定规则计算得到一个固定的key
五、记忆技巧
首先,雪崩的概念比较容易记,就是很多个key同时到期才会雪崩,”缓存雪崩的时候没有一个Key是无辜的“。
至于穿透和击穿,区别在于穿透是”透“,什么叫透呢,那就是不仅被缓存击穿了,数据库也被击穿了,这种才叫透。所以,这种缓存和数据库中都没有的情况叫做”缓存穿透“。