一、缓存雪崩(Cache Avalanche)
定义:雪崩效应是指缓存系统中大量key在同一时间段内失效,导致大量请求直接打向数据库,造成数据库压力过大,甚至宕机。
原因:
-
缓存时间设置相同或相近,同时失效。
-
突发的高流量访问缓存,导致缓存大量失效。
解决方案:
-
使用随机过期时间,避免大量key同时过期。
-
限流降级,在高流量时对部分请求进行限流或降级处理。
-
多级缓存策略,例如使用本地缓存作为一级缓存,Redis作为二级缓存。
-
缓存预热,提前将热点数据加载到缓存中。
二、缓存穿透(Cache Penetration)
定义:缓存穿透是指查询一个不存在的数据,由于缓存中找不到该数据,因此请求会穿透到数据库。当大量这样的请求发生时,数据库的压力会增大。
原因:
-
恶意攻击,故意请求不存在的数据。
-
应用逻辑错误,导致大量无效请求。
解决方案:
-
缓存空值,对于不存在的数据,也将其在缓存中标记为不存在。
-
布隆过滤器(Bloom Filter),在缓存之前添加一个快速校验层,过滤掉不存在的数据。
-
请求限流,对于频繁查询不存在的数据的请求进行限制。
-
对数据进行合法性校验,避免无效数据查询。
三、缓存击穿(Cache Breakdown)
定义:缓存击穿是指一个热点key过期,大量请求同时访问该key,由于缓存中找不到该数据,请求会穿透到数据库,导致数据库压力瞬间增大。
原因:
-
热点数据过期。
-
突发的高流量访问热点数据。
解决方案:
-
永久缓存热点数据或设置较长的过期时间。
-
互斥锁,当缓存过期时,只有获取到锁的请求能访问数据库,其他请求等待锁释放后从缓存中获取数据。
-
双缓存策略,主缓存设置较短的过期时间,备用缓存设置较长的过期时间。