缓存穿透
缓存穿透指的是数据既不在缓存里,也不在数据库里。
最常见的场景就是有攻击者伪造了大量的请求,请求某个不存在的数据。这会造成两个后果。
缓存里没有对应的数据,所以查询会落到数据库上
数据库也没有数据,所以没有办法回写缓存,下一次请求同样的数据,请求还是会落到数据库上。
如果没有在服务层面上采用熔断、限流之类的措施,那么数据库就可能崩溃。
缓存击穿
缓存击穿是指数据不在缓存中,导致请求落到了数据库上。注意,数据这个时候在数据库中是存在的,所以我们可以预计,查询到数据库中的数据之后就会回写缓存。
这看起来没有问题,但如果请求的是热点数据呢?比如同一时刻有几百个人请求某个大博主的数据,这些请求都没有命中缓存,那么几百个查询请求都会落到数据库上。
因为,如果请求的数据并不是热点数据,那么击穿也没有问题,就是普通的缓存未命中而已。
缓存雪崩
缓存雪崩是指缓存里大量数据在同一时刻过期,导致请求都落到了数据库上。
缓存雪崩基本上都是因为一次性加载了很多数据到缓存中,并且都设置为同一个过期时间。比如在应用启动的时候,提前从数据库里查询数据,然后放到缓存里面,这样一批数据就会在同一时刻过期。又比如榜单数据计算好了以后加载到缓存里,都是同一个过期时间,导致这一批榜单数据同一时间过期。
面试准备
需要收集的信息
Redis是如何部署的?用的Redis Cluster还是Redis Sentinel
有没有出现过Redis崩溃的情况?什么原因
有没有出现过Redis连不上的问题?后面使用什么方案来容错?
有没有遇到过缓存穿透、击穿或雪崩问题?如果有,当时是怎么解决的?有没有什么可以改进的点?
公司有没有保护数据库的措施?比如防止缓存失效,导致数据库不堪重负直接崩溃。
你可以在简历中或者自我介绍的时候强调自己解决过很多缓存问题,包括缓存穿透、击穿、雪崩等问题。面试官多半会对这些点感兴趣,那么你就可以趁机把你前面准备的各种案例说出来。同时,你也可以考虑把各种缓存问题融合到自己的高可用方案里面,作为其中的一个环节。