百万并发缓存架构详解(原理+架构+流程)

在互联网和大数据时代,支撑百亿级别数据访问的缓存体系对于提升系统性能至关重要@mikechen

百万并发缓存架构

百万并发(QPS 100万+,峰值千万级),缓存系统本质是“多级拦截 + 分片服务化 + 最终一致性”架构。

核心目标:99.99%请求在缓存层命中,DB只扛<1%流量。

百万并发缓存架构详解(原理+架构+流程)-mikechen

架构,如下:

客户端
   ↓
网关层(限流)
   ↓
应用层
   ↓
本地缓存(Caffeine)
   ↓
分布式缓存(Redis Cluster)
   ↓
数据库(MySQL)

请求入口层:

负载均衡(Nginx/LVS)做流量分发,可以做简单限流、灰度、路由等。

CDN 针对静态资源、图片、小视频做边缘缓存,把静态内容的并发在最外层挡掉 。

业务应用层:

无状态业务服务,从接口维度或业务维度缓存响应结果(例如:接口参数 + 响应内容缓存 1 分钟),减少重复计算 。

本地内存缓存(如 Caffeine、Ehcache)作为 L1,存储极热数据,响应通常是亚毫秒级 。

缓存层:

分布式缓存集群(如 Redis、Memcached、Tair、自研缓存)作为 L2,负责跨节点共享的热点数据 。

可以做多 AZ、分片集群、读写分离,用客户端分片或服务端分片把流量打散到多个节点 。

数据库与保护层

数据库前面可能会有“缓存旁路 + 读写分离”,只在缓存失效时回源读库,写库时异步更新缓存 。

通过限流(如令牌桶、漏桶)、熔断和降级。

在数据库压力过大时,宁可降级展示旧数据或默认值,也不让整个系统雪崩 。

 

百万并发缓存原理

读流程:本地L1 → Redis L2 → DB(逐层穿透 + 回写)。

首先,搭建本地缓存:本地L1缓存搭建。

Cache<String, Object> localCache = Caffeine.newBuilder()
    .maximumSize(10_000_000)  // 千万级容量
    .expireAfterWrite(5, TimeUnit.MINUTES)  // 短TTL
    .build();
// 读:localCache.getIfPresent(key) → miss再查Redis

Redis集群部署(Redis Cluster + Sentinel)搭建。

百万并发缓存架构详解(原理+架构+流程)-mikechen

最小3主3从,4096槽自动分片。

开启AOF + RDB混合持久化。

Proxy + Cache Service服务化(微博核心) 客户端SDK直连或走Proxy。

多级读流程:

Object get(String key) {
    Object val = localCache.getIfPresent(key);  // L1
    if (val != null) return val;
    val = redis.get(key);                       // L2
    if (val != null) { localCache.put(key, val); return val; }
    val = db.query(key);                        // DB
    if (val != null) {
        redis.set(key, val, randomExpire(300, 600));  // 随机TTL
        localCache.put(key, val);
    }
    return val;
}

写流程:先写DB → 删/更新多级缓存(Cache Aside Pattern,防不一致)。

最终一致性:异步同步 + 随机TTL + 补偿机制。

评论交流
    说说你的看法