美文网首页
什么是缓存击穿?缓存雪崩?如何解决?

什么是缓存击穿?缓存雪崩?如何解决?

作者: 走过分叉路 | 来源:发表于2021-08-27 11:27 被阅读0次

缓存击穿

  • 概念
    用户访问的key在redis中存在,但是key到了过期时间,因此需要去查询数据库。

  • 影响
    在高并发场景下,会让数据库压力骤增。

  • 解决方案
    相同业务逻辑在取缓存数据时,如果key过期,在查询数据库时,可以使用redis支持的命令setnx,对业务进行加锁处理。

  • 使用setnx会带来的问题

  • 死锁
    通过设置锁过期时间解决

  • 业务未处理完成但是锁已经过期
    通过多线程解决,一个线程从数据库取数据,另外一个线程监控数据是否取回,如果没有取回延长锁的过期时间

缓存雪崩

  • 概念
    缓存雪崩与缓存击穿类似,雪崩是由于缓存服务器宕机或者大量key同时过期,高并发请求这些过期的key,数据库崩溃。所以缓存雪崩是缓存击穿问题的升级版。
  • 解决方案
    1.与解决缓存击穿方案类似,需要使用锁来控制相同业务key的查库流量
    2.或者为每一个key生成一个随机的过期时间
    如果有如下场景要求key必须指定过期时间呢?银行业务要求第二天调整利率,所以零点以后缓存必须清除。
    这时可以通过业务代码判断零点这个时间段的业务,此时发生的请求随机睡眠一段时间,目的是分散流量,不会同时对数据库发生大量请求

setnx命令解读

该命令的含义是,如果设置的key不存在,则执行成功,如果key已经存在,那么执行失败。
因此并发场景下,只会有一笔业务可以设置成功,通过判断名称执行成功或者失败决定是否执行后续业务,因此这个命令可以模拟java中的锁。

相关文章

网友评论

      本文标题:什么是缓存击穿?缓存雪崩?如何解决?

      本文链接:https://www.haomeiwen.com/subject/hzhmiltx.html