当前位置: 首页 > 科技观察

面试被挂系列-Redis缓存血崩

时间:2023-03-21 17:27:56 科技观察

本文转载自微信公众号《JAVA日之录》,作者单音。转载本文请联系JAVA日知录公众号。小张兴冲冲的去面试了,结果因为redis缓存雪崩问题被面试官拒绝了!小张:面试官你好。我是来面试的采访者:你好,小张。我看了你的简历。你通常在项目中使用redis。能介绍一下你对redis的使用吗?小张:Redis主要用来存储一些常用的配置数据和一些热点数据;它存储了一些过期的数据,比如登录用户颁发的token。面试官:嗯,既然你用它来存储热点数据。那我问你一个实际的场景,“查询热点数据的时候,会先从缓存中加载,如果没有命中缓存,就会从数据库中取回数据。很多时候我们也会设置一个过期时间那么我的问题是,假设在某个时间点,所有的热点缓存都过期失效了,那么所有的请求都会直接进入数据库,瞬间数据库就会被淹没,如果是你,你要怎么解决这个问题?”小张:嗯……面试官,我肚子有点不舒服,先回去了。小丈祖!面试官:因为缓存同时大面积失效,或者缓存服务暂时无法提供服务等,所有的请求都跑到数据库,导致数据库CPU和内存负载过高,甚至宕机.这种现象称为“缓存雪崩”。缓存崩溃可以通过以下四个维度来解决:“缓存预热”数据加热,就是在正式部署之前,预先访问可能的数据,让一些可能被大量访问的数据加载到缓存中。在即将发生大并发访问之前手动触发不同key的加载和缓存。“添加互斥锁”可以使用互斥锁来锁定第一个查询数据的请求。其他线程此时拿不到锁,等到第一个线程查询到数据,然后将数据放入redis缓存中。后面的线程进来发现已经有缓存了,就直接去缓存。“过期时间均匀分布”给缓存的老化时间增加了一个随机因素,即为缓存设置不同的过期时间,让缓存失效的时间点尽可能统一。《构建高可用缓存系统》将Redis设计成高可用。即使个别节点、个别机器甚至机房宕机,仍然可以提供服务。比如RedisSentinel和RedisCluster都实现了高可用。面试官:各位小伙伴,你学会了如何解决缓存雪崩问题吗?希望大家在以后的面试中不要被这个问题难倒~小张:学习了,下次再来。(我知道我没提热点数据,不提面试官也不会问。)面试官:小编,你不问这个我就不问其他问题了?你下次可以再试一次!