Redis缓存穿透、缓存击穿、缓存雪崩

       正常的一个缓存处理流程都会这样设计:用户请求数据 ,后端先从缓存中get数据,get到直接返回结果,get不到从DB中取数据,DB取到更新缓存,并返回结果,DB也没取到,那直接返回空结果,流程见下图:

缓存穿透

缓存穿透是指查询一个一定不存在的数据,如果规则是从数据库中查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中查询,失去了缓存的意义,这也是经常提的缓存命中率问题。在流量大时,可能数据库就挂掉了,也可以利用不存在的key频繁攻击应用。

解决方案

  • 如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,同时设置缓存时间;
  • 在数据处理层,进行数据校验,判断数据类型和数据范围;
  • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力;

缓存雪崩

缓存雪崩是指由于大量原有缓存同时过期(或者数据未加载到缓存中),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机,造成系统的崩溃。redis服务直接宕机,缓存失效也会造成缓存雪崩。

解决方案

  • 缓存过期时间差异化,避免同一时间过期;(过期时间可以使用随机值)
  • 使用redis的主从架构或者哨兵机制;

缓存击穿

缓存击穿表示某个key的缓存非常热门,有很高的并发一直在访问,如果该缓存失效,那同时会走数据库,压垮数据库。缓存击穿与缓存雪崩的区别是这里针对的是某一热门key缓存,而雪崩针对的是大量缓存的集中失效。

解决方案:

  • 设置该热门key的缓存永不过期。
  • 使用互斥锁,通过redis的setnx实现互斥锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值