Redis雪崩时应主动触发多级缓存降级:先查Caffeine本地缓存,再查DB并加锁限流,成功后异步回填Redis且设随机TTL防再崩。

Redis雪崩时,不能只靠 catch 简单吞异常或返回 null,而应主动触发多级缓存降级策略:先查本地缓存(如 Caffeine),再查数据库,同时异步刷新 Redis 并设置随机过期时间防再崩。
1. 定义降级优先级链路
明确「Redis → 本地缓存 → DB」的 fallback 顺序,避免层层 try-catch 嵌套。推荐用统一方法封装降级逻辑:
- 用 Caffeine 做毫秒级本地缓存(无网络开销,不依赖 Redis)
- 本地缓存未命中时,走数据库查询(加读锁或限流,防 DB 打满)
- DB 查询成功后,异步写回 Redis(用线程池 + 失败重试),并设 带随机偏移的 TTL(如 baseTTL=30min + random(0–5min))
2. 在 catch 中触发降级而非静默失败
不要在 catch 里只打日志或 return null;要显式调用降级方法,并记录降级原因:
try {
String value = redisTemplate.opsForValue().get("user:1001");
if (value != null) return value;
} catch (Exception e) {
log.warn("Redis query failed, fallback to local cache & DB", e);
return fallbackToMultiLevel("user:1001"); // 主动降级入口
}
3. 本地缓存需支持自动加载与过期联动
Caffeine 配置示例(配合数据库加载器):
立即学习“Java免费学习笔记(深入)”;
Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.refreshAfterWrite(2, TimeUnit.MINUTES) // 主动刷新,减轻 DB 压力
.build(key -> loadFromDb(key)); // 自动加载函数,fallbackToMultiLevel 内部调用
注意:refreshAfterWrite 不阻塞读请求,适合做“后台静默更新”,避免雪崩时大量线程同时击穿到 DB。
4. 异步回填 Redis 要可控且可观测
降级过程中 DB 查到数据后,用独立线程池异步写 Redis:
- 线程池需隔离(不共用 Tomcat 或全局池),防拖垮主流程
- 写 Redis 失败时记录告警(如发消息到监控平台),但不抛出异常影响主链路
- 对 key 设置 随机过期时间:防止大量 key 同时过期引发下一次雪崩
例如:final long ttl = 1800 + ThreadLocalRandom.current().nextLong(0, 300); // 30~35 分钟


















