redis学习笔记-缓存雪崩、缓存穿透、缓存击穿
一、缓存穿透
定义:同一时刻,大量的并发请求数据库中不存在的信息,由于不存在所以不会命中缓存而是直接查询数据库
解决方案:
1、将空数据存入缓存:不是null而是空值,空值时间不可以太长,因为后面可能存入值而导致和缓存不一致
2、布隆过滤器:用于检索一个元素是否在一个集合中,优点是空间效率和查询时间比较好,缺点是有一定的误识别率和删除困难
3、逻辑校验:校验入参,对于不正确的入参直接返回,不请求数据库;比如id<0、分页查询的参数大小做限制等
二、缓存击穿
定义:热点key在某个时间点过期的时候恰好有大量的并发请求出现,从而大量请求直接调用到数据库
解决方案:
1、自动更新:请求时查看剩余时间,如果小于某个阈值则更新数据;缺点:如果阈值内恰好没有请求导致缓存失效,还有风险发生击穿
2、定时更新:使用定时任务查询快要过期的key,更新内容;缺点耗费服务器性能
3、消息队列:数据存入缓存的同时将key存入延迟队列中,设定延迟时间为缓存有效期之前,到时间自动刷新缓存数据;缺点:实现麻烦
4、程序加锁:使用高性能的锁保证程序串行请求数据,如读写锁等
三、缓存雪崩
定义:缓存中数据大批量到过期时间,大量的查询同时打到数据库导致数据库宕机;可能是在使用定时任务刷新缓存数据时大批量的key都设定了相同的过期时间
由于存在大量的请求,即使是重启数据库又会被大量请求攻击导致宕机;限流:只保证一部分数据可以请求;降级处理:给另一部分请求返回默认值从而减小数据库压力
解决方案:
1、设置随机过期时间:在固定的过期时间的基础上加一个小范围的随机数
2、永久有效:根据实际情况将一些数据设置为永久有效