> 文章列表 > Redis—缓存雪崩、缓存击穿、缓存穿透

Redis—缓存雪崩、缓存击穿、缓存穿透

Redis—缓存雪崩、缓存击穿、缓存穿透

一、缓存雪崩

1.  定义:

       大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。

        简单讲就是大量key失效/缓存宕机,大量访问请求打在数据库上,数据库宕机

 2. 原因:

大量数据同时过期
Redis 故障宕机

3.  解决:

大量数据过期

针对大量数据同时过期而引发的缓存雪崩问题,常见的应对方法有下面这几种:

  • 均匀设置过期时间;(给数据过期时间加一个随机数)
  • 互斥锁;(就加个互斥锁,保证同一时间内只有一个请求来构建缓存)
  • 双 key 策略;(对缓存数据可以使用两个 key,一个主 key,会过期,一个备 key,不过期)
  • 后台更新缓存;(让缓存“永久有效”,并将更新缓存的工作交由后台线程定时更新)

 

Redis 故障宕机

服务熔断或请求限流机制;

服务降级(非核心数据不允许访问数据库);

构建 Redis 缓存高可靠集群

二、缓存击穿

1.  定义:

        如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。

        简单讲,某个热key失效,大量请求打在数据库上,缓存击穿可看成缓存雪崩的子集。

2.  解决:

• 热点数据不过期,或者在过期前由后台异步更新缓存;

• 缓存失败后使⽤互斥锁或者队列控制阻止对热key的访问

三、缓存穿透

1.  定义

        当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。

简单来说,缓存和数据库种都没有需要的key,数据库压力过大

2.  解决

非法请求的限制;
缓存空值或者默认值;
使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在; 

布隆过滤器:
布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。
当我们在写入数据库数据时,在布隆过滤器里做个标记。
这样下次查询数据是否在数据库时,只需要查询布隆过滤器
如果查询到数据没有被标记,说明不在数据库中。

四、 缓存预热

 1.  定义:

        系统上线前,提前将缓存数据加载到缓存中,避免开始对数据库的大量访问

五、缓存降级

1.   定义

        对于非核心数据自动降级,不去数据库查询,返回默认值,保证核心服务可⽤