面试填坑之Redis无底洞(一)

Redis缓存雪崩、击穿、穿透

学习自大佬:https://blog.csdn.net/qq_35190492/article/details/102889333
https://www.cnblogs.com/yoishion/p/10791501.html

自己之前的博客:Redis基础

一、雪崩

1、 什么是雪崩?
一秒5000个请求来访问缓存中的key值,这时发生了Redis的全盘崩溃或者访问的key值同一时间全部过期失效,这时一瞬间的请求就会直接去查询数据库了,这么大量的请求会占用大量的cpu和内存,会引发数据库的崩溃或重启,就算重启后也会被新的请求再次冲垮,因此会影响所有涉及数据库的服务大范围崩溃,因此称之为雪崩。

2、解决方案?

  • Redis建立高可用,主从+哨兵,集群部署,避免Redis全面崩盘(后面会补详细高可用说明 TODO
  • 本地ehcache缓存+hystrix 限流&降级,避免数据库被击垮(ehcache是啥?hystrix又是啥?)
  • 数据过期时间设置永久不过期,有更新操作就更新缓存就好了(缺点消耗大量的内存,但是对大公司来说 内存算啥??保证效率就可以了)
  • 数据过期时间设置加上一个随机值,不要同一时间大规模过期失效
  • Redis集群部署,热点数据均匀分布到不同的Redis库中,既根据分类方便管理数据,又可以避免全部数据,但是
  • 粗暴点,熔断机制了解一下,涉及那些热点数据的服务,断掉,等好了在上线,避免影响其他服务的正常运行

ps:

  1. Redis高可用详细方案和策略、模型待学习(TODO
  2. 本地ehcache缓存???
  3. hystrix??????
  4. 无底洞果然是无底洞

二、击穿

1、什么是击穿?
某个热点key值,QPS非常高,在某个时间过期失效后,针对这个key值的请求直接落到数据库中,从而达到在一点上击穿数据库,所以叫击穿

2、解决方案?

  • 热点永不过期 永恒的解决方案
  • 针对某些高能热点,建立多级缓存,一层失效了还有另一层,分担了数据压力
  • 添加互斥锁,在缓存中查不到的话,去数据库查时互斥锁,查到之后放进缓存中,抢不到锁的话睡一会然后再在缓存中查询以此
  • 布隆过滤器 暂时先理解为类似为一个hashSet的结构可以帮助人们快速确认key值是否存在,但实际上还是存在一定的误差(布隆过滤器下来补 TODO

三、穿透

1、什么是穿透?
顾名思义,寻找薄弱点进行攻击,攻击一些不存在key值,因为内存中查不到,所以就直接去数据库中查了,查几次就炸了

2、解决方案?

  • 听这个意思就知道布隆过滤器可以解决
  • 增加key值的有效性校验,白名单,黑名单之类的过滤掉大部分非法攻击请求

整体解决方案

  1. hystrix之类的插件进行限流和降级的控制
  2. 网关层Nginx本渣我也记得有配置项,可以让运维大大对单个IP每秒访问次数超出阈值的IP都拉黑(引用的原话,又是一个坑)

引用敖丙大佬的一段话结尾

这里我想提的一点就是,我们在开发程序的时候都要有一颗“不信任”的心,就是不要相信任何调用方,比如你提供了API接口出去,你有这几个参数,那我觉得作为被调用方,任何可能的参数情况都应该被考虑到,做校验,因为你不相信调用你的人,你不知道他会传什么参数给你。
举个简单的例子,你这个接口是分页查询的,但是你没对分页参数的大小做限制,调用的人万一一口气查 Integer.MAX_VALUE 一次请求就要你几秒,多几个并发你不就挂了么?是公司同事调用还好大不了发现了改掉,但是如果是黑客或者竞争对手呢?在你双十一当天就调你这个接口会发生什么,就不用我说了吧。这是之前的Leader跟我说的,我觉得大家也都应该了解下。

发布了32 篇原创文章 · 获赞 11 · 访问量 1357

猜你喜欢

转载自blog.csdn.net/tiantang_zy/article/details/105104081