埃尔法哥哥请大胆地告诉面试官缓存的来龙去脉


请大胆地告诉面试官缓存的来龙去脉
首先什么是缓存?
缓存就是一个存储数据的地方
为什么要把数据存储在这个地方?
因为可以更方便的获取到数据
缓存解决了什么问题?
首先我们来看一张图 , 先看看访问缓存的流程是什么:
【埃尔法哥哥请大胆地告诉面试官缓存的来龙去脉】
埃尔法哥哥请大胆地告诉面试官缓存的来龙去脉
本文插图
首先客户端先进入缓存拿数据 , 如果数据存在缓存中 , 则直接返回数据 , 如果没有在缓存中 , 还需要去数据库中拿数据 , 所以 , 如果我们有了缓存 , 就可以不用去数据库中拿数据 , 应用程序的响应速度也得到了极大的提升 。
缓存场景存在的几大问题
所有的解决方案都会存在问题 , 缓存方案也不例外 , 下面我们详细介绍下缓存所面临的问题和解决方案
缓存穿透
定义:缓存穿透是指查询不存在的信息 。
没错 , 我想看到定义应该都明白了 , 缓存穿透就是指客户端查询了不存在的数据 , 导致每次查询最终都会去访问数据库 , 就像缓存完全不存在一样 。
解决方案
第一种:缓存空值 , 缓存一些不存在ID的数据 , 设置value为null
第二种:在客户端查询数据的时候先判断查询的ID是否存在 , 如果不存在直接返回null 。
缓存击穿
定义:当大量请求查询一个Key时 , 正好这个Key的时间过期失效 。
缓存击穿虽然和缓存穿透只相差了一个字 , 但是他们的意思完全是不同的 , 缓存击穿是在同一时刻客户端请求了一条刚好过期的数据 , 导致我们的请求又需要去数据库中拿数据 。
解决方案
使用互斥锁锁住第一个请求 , 其他线程走到这里必须等待第一个线程查询完数据 , 做完缓存 , 其他线程发现已经有了缓存了 , 就直接走缓存了 。
缓存雪崩
定义:指缓存服务器宕机 , 大规模缓存失效 。
缓存雪崩就是我们做缓存的服务器宕机了 , 导致缓存数据无效
解决方案
使用集群缓存 , 保证缓存的高可用 。
热点数据集中失效
热点数据就是客户端经常需要查询的数据 , 如果设置了同样的过期时间的话 , 那么它们就有可能在同一时刻全部过期 , 导致应用程序的不稳定
解决方案:
设置不同的失效时间 , 例如在一个基础时间上加上或者减去一个随机值 。
好了 , 以上就是缓存解决方案中会遇到的问题和相对应的解决方案 , 如果有不同的问题或者更好的解决方案的可以在下方评论 。