面试官问我:什么是缓存击穿,该怎么解决?

这个问题来自于粉丝面试的时候遇到的,下面我来讲解一下。

什么是缓存击穿

对于这个问题,简单的说就是把缓存透了但数据库没透。还不明白?那么这一小节我来带大家通过一个形象的例子来讲解一下。
我们知道缓存层都会设置数据过期时间,如果不设置过期时间的话,随着查询的越来越多缓存就会越来越大,内存撑不住了服务器就炸了。但是我们设置了过期时间真的就万无一失了吗?假设数据已经到期了,那么缓存就查不到了,这时只能去数据库查。如果同一时间巨多的人发送的查询请求都是要求查这个数据。因为缓存过期了,所以这个巨多的查询都直接转向数据库去查询了,呵呵🙂,我们的数据库大哥已经大半个身子埋土里了,这种情况叫缓存击穿。如果要查询的数据要跨表查询甚至跨库查询的话,面对这么大的查询请求,数据库大哥就直接见阎罗王了,这种情况叫数据缓存穿透。

如何解决

这很好办,我们可以从两个方向思考。目前我们可以使用的工具是数据库和缓存。

从数据库角度思考

我们可以直接把流量变成原来的一百分之一甚至是十分之一,这样数据库就能轻松可以处理查询请求了。
我们需要加锁,之前不管多少数据都可以同时读,但是现在来个锁,线程要读取数据时先查询数据有没有上锁,如果上锁了那就等着,如果没上锁那就获取锁后再请求数据库。这样数据库压力瞬间就降低了。但是这样做用户体验会很差,因为数据加锁了后面的请求都要等待,如果查询很慢的话用户可以明显感受到卡顿。但是没办法,因为这个方法的出发点就是牺牲用户体验,保证数据库不挂掉。

从缓存角度思考

我们来想想为啥什么出现缓存击穿的问题,是因为缓存数据过期了,没了。那么我们可以对缓存动刀解决这个问题。
修改缓存数据的过期策略,最常见的是设置热点数据永不过期。但是这个方法在很多情况下,我们无法预知哪些时热点数据。例如某明星官宣配偶前,微博的程序员们在初始化缓存的时候不可能直接把它归为热点数据。那该怎么办呢?当然还得从数据过期策略层面出发,我们可以做这样的逻辑:如果发现这个数据快过期了,并且最近这个数据访问特别多,那么后台就可以启动一个异步线程,重新在缓存层中添加这个数据的缓存,给这个数据续续命。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵叔哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值