预热期间的惊群效应避免
在分布式缓存预热场景中,惊群效应是指当缓存失效或系统启动时,大量并发请求同时涌入后端(数据库或下游服务),导致瞬间负载飙升、系统响应变慢甚至崩溃的现象。一、惊群效应的本质1.1 什么是惊群效应典型场景:系统刚启动,本地缓存为空,1000 个并发请求同时到达每个请求都发现缓存缺失,同时去查询 Redis 或数据库瞬间产生 1000 个后端请求,造成资源浪费和系统压力1.2 预热期间的特殊性场景惊群原因影响程度系统冷启动所有实例本地缓存全空⚠️ 严重本地缓存过期Caffeine/Guava 批量失效⚠️ 中等Redis 重启后Redis 缓存全空🔥 灾难性热点数据重建单个热点 Key 失效⚠️ 局部但可能严重二、解决方案2.1 方案一:互斥锁(Mutex)—— 最经典核心思想:只允许一个请求去加载数据,其他请求等待或直接返回旧值。java@Service public class CacheWithMutex { private final CacheString, Object localCache = Caffeine.newBuilder() .maximumSize(10_000) .expireAfterWrite(5, TimeUnit.MINUTES) .build(); private final MapString, Lock lockMap = new ConcurrentHashMap(); public Object get(String key) { // 1. 快速路径:缓存命中直接返回 Object value = localCache.getIfPresent(key); if (value != null) { return value; } // 2. 获取或创建该 Key 的锁 Lock lock = lockMap.computeIfAbsent(key, k - new ReentrantLock()); lock.lock(); try { // 3. 双重检查:获取锁后可能已被其他线程加载 value = localCache.getIfPresent(key); if (value != null) { return value; } // 4. 加载数据(只有一个线程执行) value = loadFromBackend(key); localCache.put(key, value); return value; } finally { lock.unlock(); // 清理锁(可选,避免内存泄漏) lockMap.remove(key, lock); } } }优化:使用分布式锁(多实例场景)java@Service public class DistributedCacheWithMutex { @Autowired private RedissonClient redissonClient; public Object get(String key) { // 1. 查本地缓存 Object value = localCache.getIfPresent(key); if (value != null) return value; // 2
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2516363.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!