【Redis篇】什么是缓存雪崩、缓存穿透、缓存击穿?如何解决?

目录

  • 什么是缓存雪崩、缓存穿透、缓存击穿?如何解决?
    • 1. 缓存雪崩
      • 1. 概念
      • 2. 本质原因
      • 3. 解决方案
        • 1. 防止缓存集中失效
        • 2. 保护数据库
    • 2. 缓存穿透
      • 1. 概念
      • 2. 本质原因
      • 3. 解决方案
        • 1. 将空对象记录在缓存中
        • 2. 使用布隆过滤器
    • 3. 缓存击穿
      • 1. 概念
      • 2. 本质原因
      • 3. 解决方案
        • 1. 过期时间长一点
        • 2. 保护数据库

什么是缓存雪崩、缓存穿透、缓存击穿?如何解决?

1. 缓存雪崩

1. 概念

指在某一个时间段,缓存集中过期失效。所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

2. 本质原因

大量key同时过期

3. 解决方案

1. 防止缓存集中失效

过期时间+随机数:尽量让缓存失效的时间均匀分布,最次也得随机分布,尤其是一些访问大的接口。

2. 保护数据库

加锁或者队列:防止大量线程对数据库的一次性进行读写,避免缓存失效时对数据库造成的巨大冲击,但吞吐量就降低了。

2. 缓存穿透

1. 概念

查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询缓存失去意义

2. 本质原因

黑客攻击,查询数据库中不存在的数据

3. 解决方案

1. 将空对象记录在缓存中

如果数据库返回信息为null,也可以将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓 存里边获取了

注意:将空对象设置一个较短的过期时间(因为没有意义,存着就是为了防止黑客高频null攻击)

2. 使用布隆过滤器

关键字:bitmap数组、hash算法、误判率

详情见这篇文章:【Redis篇】什么是布隆过滤器?

3. 缓存击穿

1. 概念

缓存击穿指的是热点key在某个特殊的场景时间内恰好失效了,恰好有大量并发请求过来了,造成DB压力(屋漏偏逢连夜雨)

其实缓存击穿缓存雪崩从概念上来讲差不多,只是缓存击穿是某些热点key,而雪崩指的是大规模的key

2. 本质原因

热点key过期

3. 解决方案

1. 过期时间长一点

对于一些热点key,过期时间可以无限调长

2. 保护数据库

加锁或者队列的方式:和缓存雪崩处理方式意义

你可能感兴趣的:(中间件,缓存,redis,java)