缓存击穿攻防:分布式系统热点key防护策略 1. 缓存击穿场景下的攻防对抗本质在分布式系统架构中缓存击穿Cache Breakdown是指某个热点key在缓存过期瞬间突发大量请求直接穿透到数据库的现象。这种场景下面试官扮演流量洪峰的攻击方谢飞机则作为系统架构的防守方双方围绕三个核心维度展开博弈瞬时并发量级攻击方通过模拟突发流量制造压力峰值失效时间精度防守方对缓存过期策略的精确控制能力降级方案完备性系统在极端情况下的自我保护机制2. 攻击方战术手册解析2.1 时间窗口精准打击攻击方通常会采用以下手段制造缓存击穿// 模拟并发请求工具类 public class AttackSimulator { private static final int THREAD_COUNT 1000; private static final CountDownLatch LATCH new CountDownLatch(1); public void fireRequests(String targetKey) { ExecutorService pool Executors.newFixedThreadPool(THREAD_COUNT); for (int i 0; i THREAD_COUNT; i) { pool.execute(() - { try { LATCH.await(); getFromDB(targetKey); // 模拟缓存未命中 } catch (Exception e) { Thread.currentThread().interrupt(); } }); } LATCH.countDown(); pool.shutdown(); } }2.2 热点数据识别技术攻击方通过以下特征识别潜在攻击目标访问频率监控如Redis的hotkeys命令业务维度分析秒杀商品、首页推荐等缓存TTL模式识别固定过期时间的缓存项3. 防守方防御体系构建3.1 互斥锁实现方案public class CacheProtector { private final RedissonClient redisson; public Object getData(String key) { Object value redisTemplate.opsForValue().get(key); if (value null) { RLock lock redisson.getLock(key _lock); try { if (lock.tryLock(3, 10, TimeUnit.SECONDS)) { value dbQuery(key); redisTemplate.opsForValue().set(key, value, 30, TimeUnit.MINUTES); } else { Thread.sleep(50); return getData(key); // 递归重试 } } finally { lock.unlock(); } } return value; } }3.2 多级缓存策略构建层级化防御体系L1本地Caffeine缓存100ms级别TTLL2Redis集群缓存分钟级TTLL3布隆过滤器拦截非法key请求4. 进阶防御方案实现4.1 异步刷新机制Scheduled(fixedRate 60000) public void refreshHotKeys() { hotKeyList.forEach(key - { CompletableFuture.runAsync(() - { Object value dbQuery(key); redisTemplate.opsForValue().set(key, value, 2, TimeUnit.HOURS); }); }); }4.2 熔断降级配置# Resilience4j配置示例 resilience4j.circuitbreaker: instances: dbCircuitBreaker: registerHealthIndicator: true failureRateThreshold: 50 minimumNumberOfCalls: 10 automaticTransitionFromOpenToHalfOpenEnabled: true waitDurationInOpenState: 5s5. 实战性能对比测试通过JMeter模拟不同防御策略下的系统表现防御策略QPS平均响应时间DB负载无防护12500320ms100%互斥锁8500110ms2%多级缓存1420065ms0.5%异步刷新熔断1680048ms0.1%6. 生产环境部署要点锁粒度控制采用分段锁降低争用如商品ID取模分片监控埋点缓存命中率监控锁等待时间监控DB查询QPS告警压测方案影子库压测故障注入测试Chaos Engineering7. 典型问题排查实录Case 1锁失效导致DB查询翻倍现象互斥锁场景下DB查询量仍较高根因未设置锁过期时间导致死锁修复增加lock.tryLock()的超时控制Case 2缓存雪崩连锁反应现象多个热点key同时失效引发系统瘫痪根因缓存TTL设置过于集中修复基础TTL 随机抖动时间TTL ± 10%关键经验任何防御方案都需要配合对应的监控指标没有度量就无法优化