redis缓存穿透,击穿,雪崩 笔记

缓存穿透:查询一个不存在的数据,mysql查询不到数据不会直接写入缓存,每次都会请求数据库

发生原因:

有人恶意攻击,发布很多不存在的查询数据,大量穿过redis,访问数据库

解决方法:

  1. (大量占用内存,可能造成数据不一致)缓存空数据,查询返回的数据为空,扔把这个空数据缓存
  2. (实现复杂,可能会误判(哈希碰撞))布隆过滤器:在redis前面添加布隆过滤器,需要先预热缓存,向布隆过滤器里面添加数据,当请求的数据为空,会直接返回,不为空 再访问redis

缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个可以有大量的并发请求过来,会直接把数据库压垮。

发生原因:

当热点key过期并且重建的这段时间如果耗费时间较长,就会造成缓存击穿

解决方法:

  1. 互斥锁(强一致,性能差):阻塞其它线程的写和获取锁,当一个线程在缓存中没有得到数据的时候,就会获取互斥锁,当完成缓存重建再释放锁,再查询缓存,成功后释放锁,此时其它被阻塞的线程可以正常执行
  2. 逻辑过期(高可用,不能保证一致性):给热点key加个过期字段,当过期的时候进行判断,当线程1在缓存中没有读取到数据,会先获取互斥锁,再新开一个线程2进行缓存重建,线程1不需要等待缓存重建成功,可直接返回旧的数据,为的是高可用性

缓存雪崩:同一时间段大量的缓存key同时失效或者redis服务宕机,导致大量请求直接访问数据库带来巨大压力。

发生原因 1:

大量key采用了相同的过期时间

原因1的解决方案:

给不同的key的过期时间添加随机值

发生原因 2:

redis服务器宕机

原因2的解决方案:

  1. 利用redis集群提高服务的高可用性  (哨兵模式,集群模式)
  2. 给缓存业务添加降级限流策略,前端用nginx,微服务的话用网关
  3. 给业务添加多级缓存(Guava,Caffeine)做一级缓存,redis做为2级缓存
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

humannoid

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

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

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

打赏作者

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

抵扣说明:

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

余额充值