做注册会员和购物的网站需要什么,如何建立网站域名,wordpress评论改成微博,工作总结及下步工作计划#x1f4a5;《缓存架构#xff1a;穿透 / 雪崩 / 击穿解决方案》 文章目录#x1f4a5;《缓存架构#xff1a;穿透 / 雪崩 / 击穿解决方案》#x1f9ed; 一、开篇导语#xff1a;为什么缓存是高并发系统的命脉#xff1f;✅1.1 缓存的核心价值缓存带来的收益…《缓存架构穿透 / 雪崩 / 击穿解决方案》 文章目录《缓存架构穿透 / 雪崩 / 击穿解决方案》 一、开篇导语为什么缓存是高并发系统的命脉✅1.1 缓存的核心价值缓存带来的收益1.2 缓存不当的灾难1.3 三大问题导火索 二、缓存三大核心问题解析与解决方案✅ 1. 缓存穿透 解决方案 2. 缓存击穿 解决方案 3. 缓存雪崩 解决方案 三、进阶架构实践模块3.1 ✅ 热点 Key 探测与本地缓存实时探测方案Caffeine本地缓存实现3.2 ✅ Redis 分布式锁的正确实现Redisson最佳实践3.3 ✅ 多级缓存架构设计三级缓存架构各级缓存配置建议3.4 ✅ 缓存与数据库一致性最终一致性方案Canal Redis实现四、 总结与实战建议4.1 不同场景选型建议4.2 性能优化Checklist4.3 常见避坑指南 五、互动引导讨论话题一、开篇导语为什么缓存是高并发系统的命脉
在高并发系统中缓存是支撑系统性能的关键基石。 ✅ 它可减轻数据库压力显著提升 QPS 和用户体验。 但一旦缓存失效或设计不当可能造成雪崩式系统故障。 三大典型问题缓存穿透、缓存击穿、缓存雪崩是系统稳定性的“隐形杀手”。
✅1.1 缓存的核心价值 缓存带来的收益
性能提升Redis QPS可达10万远超数据库的5千成本降低减少数据库负载节省服务器资源体验优化响应时间从100ms降至10ms
1.2 缓存不当的灾难
真实案例某电商大促期间因缓存雪崩导致
数据库连接池耗尽1200/1200响应时间从50ms飙升至15秒订单损失超千万
1.3 三大问题导火索
问题类型触发场景危害等级穿透恶意请求不存在数据★★☆击穿热点key突然失效★★★雪崩大量key同时过期★★★★二、缓存三大核心问题解析与解决方案
✅ 1. 缓存穿透
定义请求数据数据库和缓存中都没有穿透缓存直接打到数据库。
场景恶意请求、参数异常、攻击行为。 解决方案 布隆过滤器初始化时将合法 ID 加入过滤器拦截非法请求。
// 使用Guava布隆过滤器
BloomFilterString bloomFilter BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 1000000, // 预期元素数量0.01 // 误判率
);// 初始化数据
for (String key : existingKeys) {bloomFilter.put(key);
}// 请求拦截
public Object getData(String key) {if (!bloomFilter.mightContain(key)) {return null; // 直接拦截}// 正常查询流程...
}️空值缓存将无数据查询结果短暂缓存防止重复击打 DB。
if (!bloomFilter.mightContain(id)) {return null; // 拦截非法请求
}
Object data redis.get(id);
if (data null) {data db.query(id);redis.set(id, data null ? : data, 3, TimeUnit.MINUTES); // 空值缓存
} 2. 缓存击穿
定义热点 Key 失效瞬间海量请求直接击穿数据库。
典型场景秒杀商品详情、热点文章页。 解决方案 热点预加载、缓存永不过期逻辑失效 本地缓存 分布式缓存Caffeine Redis组合抗压 加分布式锁防止缓存同时构建
分布式锁实现
public Object getData(String key) {// 1. 先查本地缓存Object value localCache.get(key);if (value ! null) return value;// 2. 查Redisvalue redisTemplate.opsForValue().get(key);if (value ! null) {localCache.put(key, value); // 刷新本地缓存return value;}// 3. 获取分布式锁String lockKey lock: key;boolean locked redisTemplate.opsForValue().setIfAbsent(lockKey, locked, 10, TimeUnit.SECONDS);try {if (locked) {// 4. 再次检查缓存双检锁value redisTemplate.opsForValue().get(key);if (value null) {// 5. 查询数据库value dbService.queryData(key);// 6. 写入RedisredisTemplate.opsForValue().set(key, value, 30, TimeUnit.MINUTES);}return value;} else {// 等待其他线程加载Thread.sleep(100);return getData(key); // 重试}} finally {if (locked) redisTemplate.delete(lockKey);}
}3. 缓存雪崩
定义大量 Key 在同一时间过期数据库承压被击穿。
场景批量缓存设置相同 TTL集中失效。 解决方案 TTL 加随机抖动避免同时过期
// 设置缓存时添加随机抖动
int baseTtl 1800; // 30分钟
int randomTtl baseTtl new Random().nextInt(300); // 增加0-5分钟随机值
redisTemplate.opsForValue().set(key, value, randomTtl, TimeUnit.SECONDS);分批加载 / 缓存预热
PostConstruct
public void cacheWarmUp() {ListHotItem hotItems dbService.getTop100HotItems();ExecutorService executor Executors.newFixedThreadPool(4);for (HotItem item : hotItems) {executor.submit(() - {redisTemplate.opsForValue().set(item: item.getId(), item, 30 new Random().nextInt(10), TimeUnit.MINUTES);});}
}⚡ 引入熔断降级机制 异步缓存重建 三、进阶架构实践模块
3.1 ✅ 热点 Key 探测与本地缓存
实时探测方案 Caffeine本地缓存实现
LoadingCacheString, Object localCache Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(5, TimeUnit.MINUTES).refreshAfterWrite(1, TimeUnit.MINUTES).build(key - {// 当本地缓存失效时从Redis加载return redisTemplate.opsForValue().get(key);});3.2 ✅ Redis 分布式锁的正确实现
Redisson最佳实践
RLock lock redissonClient.getLock(product_lock: productId);
try {// 尝试加锁最多等待100ms锁自动释放时间30秒if (lock.tryLock(100, 30, TimeUnit.MILLISECONDS)) {// 执行业务逻辑updateStock(productId);}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
} finally {if (lock.isHeldByCurrentThread()) {lock.unlock();}
}避免的坑
非原子操作setnx expire 要使用Lua脚本保证原子性锁误删使用唯一value标识锁持有者锁续期使用Redisson的watchdog机制
3.3 ✅ 多级缓存架构设计
三级缓存架构 各级缓存配置建议
层级缓存类型TTL特点L1进程内缓存1-5分钟超高速容量有限L2Redis集群30分钟分布式支持高并发L3数据库-数据源头性能最低
3.4 ✅ 缓存与数据库一致性
最终一致性方案 Canal Redis实现
// Canal监听数据库变更
public class CacheInvalidationHandler implements EntryListener {Overridepublic void onInsert(RowChange rowChange) {String table rowChange.getTable();ListColumn columns rowChange.getRow(0).getColumns();if (products.equals(table)) {String productId getColumnValue(columns, id);redisTemplate.delete(product: productId);}}
}四、 总结与实战建议
4.1 不同场景选型建议
场景推荐方案注意事项高并发读多级缓存 热点探测监控本地缓存大小秒杀系统Redis锁 本地缓存避免锁竞争过久数据一致性要求高异步更新 重试机制保证最终一致海量数据布隆过滤器控制误判率
4.2 性能优化Checklist
TTL管理基础值随机抖动预热机制启动时加载热点数据监控告警缓存命中率低于90%时报警容量规划Redis内存使用不超过70%大Key治理单Key不超过1MB
4.3 常见避坑指南 五、互动引导
讨论话题
1.你在项目中遇到过哪种缓存问题如何解决的 2.对于金融等高一致性场景如何保证缓存与数据库强一致 3.本地缓存的最大挑战是什么 欢迎评论区分享你的实战经验 点赞超过100将更新《Redis深度优化从大Key治理到集群管理》专题 本文涉及技术栈
Redis 6.xSpring Boot 3.xRedisson 3.17Caffeine 3.0Canal 1.1.6
性能数据来源
阿里云Redis性能白皮书美团缓存架构实践Redis官方基准测试报告