redis之缓存穿透、缓存击穿、缓存雪崩
一、缓存穿透
1 什么是缓存穿透
缓存穿透是指查询一个在redis和DB中都不存在的数据,redis中查不到去DB查,DB查不到则不写入redis,导致每次查询这个数据都要穿过redis穿透到DB
2 缓存穿透产生的情况
1) 业务不合理的设计
2) 误操作: 误删除了redis和DB中的数据
3) 黑客非法请求攻击: 故意捏造大量非法请求读取不存在的业务数据
3 解决措施
缓存穿透是不可能自动恢复的
1) 设置空值或默认值
查询DB为空,可以给缓存设置个空值或者默认值写入redis,同时设置一个过期时间
2) 布隆过滤器
a) 将数据库所有的数据加载到布隆过滤器
b) 当有请求时先去布隆过滤器查询,判断查询的数据是否存在
c) 如果判断数据不存在,那么直接返回空给客户端
d) 如果判断数据存在,那么则查询缓存或DB
e) 将DB中查询的结果返回给客户端,并且缓存到 Redis 中
二、缓存击穿
1 什么是缓存击穿
缓存击穿是指热点key在过期失效的瞬间,大量请求穿过了redis直接访问DB
严重的情况甚至会造成DB服务宕机
2 解决措施
1) 热点数据永不过期
2) 加锁
保证每个热点key同时只有一个线程去查询,其它线程会被阻塞,等锁释放开,缓存已有了数据,其它线程就不必访问DB,这会影响服务的高并发量
三、缓存雪崩
1 什么是缓存雪崩
缓存雪崩是指redis中大量key过期或者redis宕机,导致请求直接访问DB,引起DB压力过大甚至宕机
2 解决措施
1) 随机分散过期时间
2) 限流降级: 缓存失效后,通过加锁或队列来控制读取DB且写入redis的线程数量
3) 熔断:暂停缓存访问待实例恢复,返回预定义信息(错误页面或空值等信息)
4) 配置 redis 高可用集群
四、三个缓存问题之间的区别
缓存击穿是热点key过期失效的瞬间,有大量的请求穿过了redis直接访问DB
缓存穿透是请求查询不存在key,穿过了redis直接访问DB
缓存雪崩是大量key同一时间过期或者redis宕机,请求穿过了redis请求直接访问DB
缓存击穿、缓存雪崩都是DB中有数据,但redis中没有,是可以自动恢复的;缓存穿透是redis和DB都没有数据,不可能自动恢复的