
redis 笔记四(常见问题)
什么是缓存击穿、缓存穿透、缓存雪崩?
缓存击穿
定义
缓存击穿是指某个热点数据在缓存中失效后,大量请求同时访问数据库,导致数据库压力剧增,甚至崩溃。
问题描述
热点数据:某些数据被频繁访问,成为热点数据。
缓存失效:热点数据在缓存中过期或被删除。
大量请求:在缓存失效的瞬间,大量请求直接打到数据库,导致数据库压力剧增。
解决方案
互斥锁(Mutex):在缓存失效时,使用互斥锁确保只有一个请求去数据库获取数据,其他请求等待。
设置永不过期:对于热点数据,可以设置较长的过期时间或永不过期,减少缓存失效的频率。
预热缓存:在系统启动或维护窗口期间,提前加载热点数据到缓存中。
缓存穿透
定义
缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,请求直接打到数据库,而数据库中也没有该数据,导致每次请求都必须查询数据库。
问题描述
无效查询:客户端查询一个不存在的数据。
缓存未命中:缓存中没有该数据。
数据库未命中:数据库中也没有该数据。
频繁请求:每次请求都必须查询数据库,增加数据库负担。
解决方案
返回空对象:对于查询不存在的数据,可以在缓存中存储一个特殊的空对象(如 null 或自定义的空对象),并设置较短的过期时间。
布隆过滤器:使用布隆过滤器(Bloom Filter)预先判断数据是否存在,减少无效查询。
缓存雪崩
定义
缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求同时打到数据库,数据库压力剧增,甚至崩溃。
问题描述
集中失效:多个缓存数据设置相同的过期时间,导致在同一时间点大量缓存失效。
大量请求:缓存失效后,大量请求直接打到数据库,增加数据库负担。
解决方案
分散过期时间:为缓存数据设置随机的过期时间,避免大量缓存同时失效。
限流降级:在缓存失效时,使用限流策略限制请求频率,防止数据库过载。
多级缓存:使用多级缓存(如本地缓存 + 分布式缓存),减少对数据库的直接访问。
总结
缓存击穿:热点数据缓存失效后,大量请求直接打到数据库。解决方案包括使用互斥锁、设置永不过期和预热缓存。
缓存穿透:查询不存在的数据,每次请求都必须查询数据库。解决方案包括返回空对象和使用布隆过滤器。
缓存雪崩:大量缓存数据在同一时间失效,导致大量请求直接打到数据库。解决方案包括分散过期时间、限流降级和多级缓存。
通过合理的设计和配置,可以有效避免这些缓存问题,提高系统的性能和稳定性。