缓存雪崩防护策略:随机过期时间与互斥锁机制应用
在高并发场景下,缓存雪崩是后端服务面临的重要挑战。当大量缓存同时失效时,会瞬间导致数据库压力激增,引发服务雪崩。本文将分享两种有效的防护策略:随机过期时间和互斥锁机制。
随机过期时间实现
传统的固定过期时间容易造成缓存集中失效。通过引入随机因子,可以有效分散过期时间点。
public class CacheService {
private static final Random RANDOM = new Random();
public String getData(String key) {
String value = cache.get(key);
if (value == null) {
// 添加随机过期时间(±30%)
int baseExpire = 3600; // 1小时
int randomDelta = (int) (baseExpire * 0.3 * RANDOM.nextDouble());
int actualExpire = baseExpire + randomDelta;
value = fetchDataFromDB(key);
cache.put(key, value, actualExpire);
}
return value;
}
}
互斥锁机制实现
当缓存失效时,多个请求同时访问数据库。通过分布式锁控制只有一个请求能去数据库加载数据。
public String getDataWithLock(String key) {
String lockKey = "lock:" + key;
String lockValue = UUID.randomUUID().toString();
try {
if (redisTemplate.setIfAbsent(lockKey, lockValue, Duration.ofSeconds(10))) {
// 获取锁成功,从数据库加载数据
String value = fetchDataFromDB(key);
cache.put(key, value, 3600);
return value;
} else {
// 等待并获取缓存数据
Thread.sleep(100);
return cache.get(key);
}
} finally {
// 释放锁
if (redisTemplate.get(key) != null &&
redisTemplate.get(key).equals(lockValue)) {
redisTemplate.delete(lockKey);
}
}
}
实施建议
- 随机过期时间可设置为基准时间的±30%范围
- 互斥锁超时时间应控制在5-10秒,避免长时间阻塞
- 建议结合熔断机制,防止缓存击穿

讨论