在高并发系统中,Redis作为高性能的内存缓存数据库,缓存可能会引发一系列严重问题——缓存雪崩、缓存穿透、缓存击穿。
一、缓存雪崩(Cache Avalanche)
1. 什么是缓存雪崩?
缓存雪崩是指大量缓存数据在同一时间集中失效,导致所有请求直接打到后端数据库,数据库瞬间承受巨大压力,甚至可能被压垮。
2. 典型场景
缓存服务器宕机或重启。
大量热点数据设置了相同的过期时间,同时失效。
Redis集群出现网络分区或主从切换失败。
3. 解决方案
设置不同的过期时间
避免所有缓存同时失效。可以在基础过期时间上增加一个随机值。
多级缓存架构
使用 本地缓存 + Redis 的多级缓存策略。即使Redis失效,本地缓存仍可缓解部分压力。
服务降级与熔断
当数据库压力过大时,可临时返回默认值或友好提示,保护核心服务。
高可用部署
Redis使用主从 + 哨兵或Redis Cluster集群模式。
数据持久化(RDB+AOF)防止数据丢失。
预热缓存
系统上线或重启后,提前加载热点数据到缓存,避免冷启动时直接冲击数据库。
二、缓存穿透
1. 什么是缓存穿透?
缓存穿透是指查询一个数据库中根本不存在的数据,由于缓存中没有,每次请求都会穿过缓存直达数据库,导致数据库压力剧增。
2. 攻击场景
恶意用户或爬虫频繁查询不存在的ID,造成数据库负载飙升。
3. 解决方案
缓存空值
即使查询结果为空,也缓存一个特殊值(如 null
或 "empty"
),并设置较短过期时间。
布隆过滤器
在访问缓存前,先通过布隆过滤器判断数据是否存在。
优点:空间效率高,查询速度快。
缺点:存在极低的误判率(可能把不存在的判为存在),但不会漏判。
接口层校验
对请求参数进行合法性校验,如ID格式、范围限制、权限验证等,提前拦截非法请求。
三、缓存击穿
1. 什么是缓存击穿?
缓存击穿是指某个热点数据在缓存中过期的瞬间,大量并发请求同时涌入,直接访问数据库,造成数据库瞬时压力激增。
与雪崩的区别:雪崩是大量key同时失效;击穿是单个热点key失效。
2. 典型场景
突发新闻、秒杀商品、热门视频等热点数据过期。
高并发下多个线程同时发现缓存失效,同时查询数据库。
3. 解决方案
互斥锁
当缓存失效时,只允许一个线程去加载数据库,其他线程等待。
逻辑过期
不设置Redis的物理过期时间,而是将过期时间作为数据的一部分存储:
永不过期(慎用)
对极端热点数据设置永不过期,通过后台任务定期更新缓存。
四、总结
问题 | 触发条件 | 影响范围 | 解决方案 |
---|---|---|---|
缓存雪崩 | 大量key同时失效 | 全局性,系统级风险 | 随机过期时间、多级缓存、高可用 |
缓存穿透 | 查询不存在的数据 | 针对特定非法请求 | 缓存空值、布隆过滤器、参数校验 |
缓存击穿 | 热点key失效瞬间 | 单个热点数据 | 互斥锁、逻辑过期、永不过期 |