您现在的位置是:首页 >技术交流 >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. 定义
对于非核心数据自动降级,不去数据库查询,返回默认值,保证核心服务可⽤