一、缓存穿透
什么是缓存穿透
请求的对应key不存在,每次对此key的请求都直接落在数据库上,从而使得数据库崩溃。比如请求使用一个不存在的用户id获取用户信息,缓存和数据库都没有该信息,一般为黑客对数据库的恶意攻击。
缓存穿透解决方式
1、缓存该无效key:对于一个查询返回的数据为空值,仍然缓存这个key(value为null),并设置较短的过期时间。
2、使用布隆过滤器:布隆过滤器可以非常方便地判断一个给定数据是否存在于海量数据中。即判断该请求是否合法。布隆过滤器可能会存在误识别。但是,布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。
3、进行监控:当缓存命中率急速降低时,排查访问对象和访问请求,配合运维设置黑名单。
4、直接报警:缓存穿透一般为黑客的攻击行为,配合网警解决提出问题的人,一劳永逸。(狗头)
二、缓存击穿
什么是缓存击穿
关键的key值过期了,大量需要使用到该key的请求直接落在数据库,此时的高并发可能会压垮数据库。比如某热搜关键词的key失效了。
缓存击穿解决方式
1、提前设定热门数据:在访问高峰之前,将热门数据存入缓存,设置较长的过期时间或者永不失效。
2、实时调整过期时间:实时监控数据,实时调整过期时间。
3、加锁:效率较低不推荐,在此只是点明可以这样弄。本质上就是限流,降低用户体验。
三、缓存雪崩
什么是缓存雪崩
缓存中的大量key在较短时间内集中过期。大量请求直接落在数据库读取数据并设置缓存,此时的高并发可能会压垮数据库。
对比:缓存击穿主要是某一个重要key失效,缓存雪崩是一大批key失效
缓存雪崩解决方式
1、构建缓存集群:采用 redis 集群,避免单机出现问题整个缓存服务都没办法使用。
2、随机设置失效时间:随机设置失效时间,将缓存失效的时间点分散开,降低失效时间的重复率,分散压力将雪崩变为小雪。
3、及时更新缓存:记录缓存过期时间,在临近过期时通知后台对缓存进行更新。
4、加锁:效率较低不推荐,在此只是点明可以这样弄。本质上就是限流,降低用户体验。