侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1824 篇文章
  • 累计收到 0 条评论

设计高并发电商系统的分布式缓存架构,解决穿透、击穿、雪崩问题

2025-12-12 / 0 评论 / 4 阅读

题目

设计高并发电商系统的分布式缓存架构,解决穿透、击穿、雪崩问题

信息

  • 类型:问答
  • 难度:⭐⭐⭐

考点

分布式缓存设计,缓存穿透/击穿/雪崩解决方案,高并发场景优化,缓存一致性策略

快速回答

核心解决方案要点:

  • 缓存穿透:布隆过滤器拦截非法请求 + 空值缓存策略
  • 缓存击穿:分布式互斥锁 + 热点数据永不过期
  • 缓存雪崩:随机过期时间 + 多级缓存架构
  • 高并发优化:本地缓存+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实现