Redis缓存雪崩、击穿、穿透
Redis缓存雪崩
指的是在某一时刻,大量缓存数据同时失效或Redis服务宕机,导致所有请求直接打到数据库,造成数据库压力骤增,甚至崩溃的现象。
原因:
1. 缓存集中失效:
大量缓存设置了相同的过期时间,导致它们在同一时刻失效,请求直接访问数据库。
2. Redis 服务宕机:
Redis实例崩溃或网络故障,导致缓存不可用,所有请求直接访问数据库。
3. 热点数据失效:
热点数据的缓存失效,导致大量请求同时访问数据库。
解决方案:
1. 设置不同的过期时间:为缓存数据设置随机的过期时间,避免大量缓存同时失效。
2. 使用多级缓存:引入本地缓存(如Guava Cache)作为Redis的补充,即使Redis失效,本地缓存仍能缓解数据库压力。
3. 限流与降级:使用限流工具(如Hystrix、Sentinel)限制请求量,或降级处理部分请求,减轻数据库负担。
4. 高可用框架:部署Redis集群或主从复制,确保即使某个节点宕机,其他节点仍能提供服务。
5. 缓存与预热:在系统启动或缓存失效前,提前加载热点数据到缓存中,避免大量请求直接访问数据库。
6. 持久化与备份:启用RDB或AOF持久化,定期备份数据,确保Redis故障后能快速恢复。
7.监控与警告:实时监控Redis和数据库的状态,设置告警机制,及时发现并处理异常。
Redis缓存击穿
指的是某个热点数据在缓存中过期或被删除时,大量请求同时涌入数据库,导致数据库压力骤增的现象。与雪崩不同,缓存击穿通常针对单个热点数据。
原因:
1. 热点数据失效:
某个热点数据的缓存过期或被删除,导致大量请求直接访问数据库。
2. 高并发请求:
在高并发场景下,大量请求同时访问同一个失效的热点数据。
解决方案:
1. 设置永不过期的热点数据:对热点数据设置永不过期,或通过后台任务定期更新缓存,避免缓存失效。
2. 互斥锁(Mutex Lock):当缓存失效时,使用互斥锁确保只有一个线程去数据库加载数据,其他线程等待缓存更新后再读取。
3. 缓存与预热:在系统启动或缓存失效前,提前加载热点数据到缓存中,避免大量请求直接访问数据库。
4. 限流与降级:使用限流工具(如Hystrix、Sentinel)限制请求量,或降级处理部分请求,减轻数据库负担。
5. 双缓存策略:使用两个缓存层,主缓存设置较短过期时间,备份缓存设置较长过期时间,主缓存失效时从备份缓存读取数据。
6. 监控与警告:实时监控缓存和数据库的状态,设置告警机制,及时发现并处理异常。
Redis缓存穿透
指的是查询一个不存在的数据,由于缓存和数据库中都没有该数据,导致每次请求都直接访问数据库,造成数据库压力过大的现象。与缓存击穿不同,缓存穿透针对的是不存在的数据。
原因:
1. 恶意请求:
攻击者故意请求大量不存在的数据,导致缓存无法命中,请求直接打到数据库。
2. 业务逻辑问题:
业务逻辑中存在漏洞,导致大量无效请求直接访问数据库。
3. 缓存未命中:
缓存中没有所需数据,请求直接打到数据库。
解决方案:
1. 使用布隆过滤器:使用布隆过滤器判断数据是否存在,如果布隆过滤器判断数据不存在,则直接返回,避免访问数据库。
2. 缓存空值:对于查询结果为空的请求,将空结果缓存到Redis中,并设置较短的过期时间,避免重复查询数据库。
3. 参数校验:在业务逻辑中对请求参数进行校验,过滤掉明显无效的请求。
4. 限流与降级:使用限流工具(如Hystrix、Sentinel)限制请求量,或降级处理部分请求,减轻数据库负担。
5. 监控与警告:实时监控缓存和数据库的状态,设置告警机制,及时发现并处理异常。
6. 热点数据预热:在系统启动或缓存失效前,提前加载热点数据到缓存中,避免大量请求直接访问数据库。