Redis:缓存雪崩、穿透、击穿的技术解析和实战方案
🚨 1、简述
随着系统规模扩大,Redis 缓存被广泛用于数据预热、热点数据防护和高并发系统优化。然而在高并发环境中,缓存雪崩、穿透、击穿等问题若处理不当,可能导致系统雪崩式崩溃。
本文从原理、原因出发,结合实际项目经验,讲解如何应对这三大常见问题,并给出对应实践方案。
💣 2、缓存雪崩(Cache Avalanche)
✅ 定义:
大量缓存同时失效,导致请求直接打到数据库或下游服务,造成系统瞬时过载甚至崩溃。
🧨 触发场景:
🔹 同一时间大量缓存设置了相同过期时间。
🔹 Redis 故障、重启或崩溃,导致全缓存失效。
✅ 解决方案:
🛠 实践样例:设置随机过期时间
int baseExpire = 60 * 10; // 10分钟int random = new Random().nextInt(60); // 加1分钟以内的随机值redisTemplate.opsForValue().set(\"product:123\", data, baseExpire + random, TimeUnit.SECONDS);
🕳️ 3、缓存穿透(Cache Penetration)
✅ 定义:
请求的数据既不在缓存中,也不在数据库中,攻击者通过大量随机 key 造成数据库压力激增。
🧨 触发场景:
🔹 攻击者构造不存在的 key 请求接口。
🔹 key 本身无意义(如 user:-1)
✅ 解决方案:
🛠 实践样例:缓存空值
String key = \"user:1000\";String userJson = redisTemplate.opsForValue().get(key);if (userJson == null) { User user = userService.getById(1000L); if (user == null) { // 缓存一个占位符,防止穿透 redisTemplate.opsForValue().set(key, \"\", 5, TimeUnit.MINUTES); } else { redisTemplate.opsForValue().set(key, toJson(user), 10, TimeUnit.MINUTES); }}
🛠 实践样例:布隆过滤器(Guava)
BloomFilter<Long> filter = BloomFilter.create(Funnels.longFunnel(), 100_0000);filter.put(12345L);if (!filter.mightContain(requestedId)) { return null; // 拦截非合法请求}
🔥 4、缓存击穿(Cache Breakdown)
✅ 定义:
某个热点 key 失效瞬间,多个并发请求同时击中数据库。
🧨 触发场景:
🔹 热点数据过期,瞬时大量请求访问该 key。
🔹 并发场景下没有做好互斥更新控制。
✅ 解决方案:
🛠 实践样例:互斥锁方式防止击穿
public User getUserById(Long userId) { String key = \"user:\" + userId; String cache = redisTemplate.opsForValue().get(key); if (cache != null) return parseUser(cache); // 加锁防击穿 String lockKey = \"lock:user:\" + userId; boolean lock = redisTemplate.opsForValue().setIfAbsent(lockKey, \"1\", 30, TimeUnit.SECONDS); if (!lock) { try { Thread.sleep(50); } catch (InterruptedException ignored) {} return getUserById(userId); // 递归重试 } try { User user = db.queryById(userId); if (user != null) { redisTemplate.opsForValue().set(key, toJson(user), 10, TimeUnit.MINUTES); } else { redisTemplate.opsForValue().set(key, \"\", 3, TimeUnit.MINUTES); } return user; } finally { redisTemplate.delete(lockKey); // 释放锁 }}
🎯 5、总结
🔹 Redis 作为缓存层时,不应将其设计为单点依赖。
🔹 搭配使用 Caffeine(本地)+ Redis(远程)+ MQ异步回源 是中大型系统推荐策略。
🔹 限流、熔断、降级 机制应作为系统稳定性的基本保障。