题目
设计高并发电商系统的分布式缓存架构,解决穿透、击穿、雪崩问题
信息
- 类型:问答
- 难度:⭐⭐⭐
考点
分布式缓存设计,缓存穿透/击穿/雪崩解决方案,高并发场景优化,缓存一致性策略
快速回答
核心解决方案要点:
- 缓存穿透:布隆过滤器拦截非法请求 + 空值缓存策略
- 缓存击穿:分布式互斥锁 + 热点数据永不过期
- 缓存雪崩:随机过期时间 + 多级缓存架构
- 高并发优化:本地缓存+Redis集群 + 请求合并
- 数据一致性:延迟双删策略 + 监听binlog
问题场景分析
在电商大促期间,面临以下挑战:
- 每秒10万+查询请求,商品详情页访问量激增
- 恶意攻击导致缓存穿透(查询不存在的商品ID)
- 热点商品缓存同时失效(缓存击穿)
- Redis集群批量过期导致雪崩
- 商品价格更新需要保证缓存-数据库一致性
解决方案设计
1. 缓存穿透防御
布隆过滤器实现:
// 使用Redisson布隆过滤器
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("productFilter");
bloomFilter.tryInit(1000000L, 0.01); // 100万数据量,1%误判率
// 查询前校验
if (!bloomFilter.contains(productId)) {
return null; // 直接拦截非法请求
}空值缓存策略:
// 查询数据库为空时缓存空对象
if (product == null) {
redis.setex("product:empty:" + productId, 300, ""); // 缓存5分钟
return null;
}2. 缓存击穿解决方案
分布式锁实现:
RLock lock = redisson.getLock("product_lock:" + productId);
try {
if (lock.tryLock(1, 10, TimeUnit.SECONDS)) { // 等待1秒,持有10秒
// 双重检查
String data = redis.get(key);
if (data != null) return data;
// 数据库查询
Product product = db.query(productId);
// 更新缓存并设置逻辑过期时间
redis.setex(key, 3600, product.toJson());
}
} finally {
lock.unlock();
}热点数据特殊处理:
- 监控系统识别Top100热点商品
- 设置逻辑过期时间(物理永不过期)
- 后台线程定期更新缓存
3. 缓存雪崩防御
多级缓存架构:
- L1:本地缓存(Caffeine)50ms过期
- L2:Redis集群(分片部署)
- L3:商品服务本地缓存
过期时间优化:
// 基础过期时间 + 随机偏移量
int baseExpire = 3600;
int randomExpire = ThreadLocalRandom.current().nextInt(600);
redis.setex(key, baseExpire + randomExpire, value);4. 高并发优化
- 请求合并:使用Hystrix Collapser合并10ms内的商品查询请求
- 连接优化:Redis连接池配置(最大连接数500,最小空闲50)
- 读写分离:Redis Cluster配置3主6从架构
5. 缓存一致性保障
延迟双删策略:
// 更新数据库
db.updateProduct(product);
// 第一次删除缓存
redis.del("product:" + productId);
// 延迟500ms后再次删除
executor.schedule(() -> redis.del("product:" + productId), 500, TimeUnit.MILLISECONDS);Binlog监听方案:
- 使用Canal监听MySQL binlog
- 发送变更消息到Kafka
- 消费者更新Redis缓存
最佳实践
- 监控体系:实时监控缓存命中率(>95%)、慢查询、内存使用率
- 熔断降级:当Redis不可用时降级到本地缓存
- 压测优化:定期进行全链路压测,验证雪崩预案
- Key设计规范:{业务}:{功能}:{ID} 三级结构
常见错误
- ❌ 布隆过滤器未预热导致首次穿透
- ❌ 分布式锁未设置超时时间导致死锁
- ❌ 双删策略未考虑删除失败场景
- ❌ 本地缓存未设置上限导致OOM
扩展知识
- 新型解决方案:Redis-ML集成实现实时热点预测
- 持久化策略:AOF重写压缩 + RDB快照组合
- 跨机房同步:Redis Geo-Replication方案
- 容器化部署:Redis Cluster on Kubernetes的StatefulSet实现