高并发下,缓存击穿怎么解决?

高并发是大型架构核心,下面我详解高并发缓存击穿@mikechen

高并发击穿

缓存击穿是指:某个热点 key 突然失效(过期或被主动清除)。

高并发下,缓存击穿怎么解决?-mikechen

大量并发请求同时穿透缓存,直接打到数据库,导致数据库瞬间压力暴增,甚至宕机。

这是高并发场景,下最危险的缓存问题之一。

尤其:在秒杀、热点文章、直播间人数、热门商品等场景非常常见。

 

 

如何来解决?

高并发下,缓存击穿怎么解决?-mikechen

首先,提前把可能被高频访问的热点数据加载到缓存,避免大促/高峰期才首次访问。

@PostConstruct
public void preheatHotData() {
    List<String> hotKeys = getHotKeysFromConfig();  // 从配置中心获取热点key列表
    for (String key : hotKeys) {
        String data = db.get(key);
        redis.setex(key, 3600, data);  // 预热1小时
    }
}

当然,你也可以对极度热点数据(用户信息、商品详情等),不设置过期时间。

通过逻辑过期、或后台异步更新保证数据新鲜度。

高并发下,缓存击穿怎么解决?-mikechen

定时刷新热点(异步任务):

@Scheduled(cron = "0 */5 * * * ?")  // 每5分钟
public void refreshHotCache() {
    List<String> top100Keys = getTopHotKeys();  // 从监控系统获取Top100
    for (String key : top100Keys) {
        refreshKeyAsync(key);  // 异步刷新
    }
}

可以完全避免击穿,最简单粗暴。

但是,会存在数据不一致风险,脏数据可能存在较长时间,需要业务可接受。

除此之外,还可以采用:多级缓存 + 逻辑过期(最强防御)。

比如:在 Redis 前面再加一层本地缓存(如 Caffeine、Guava Cache),即使 Redis 层击穿,本地缓存也能挡住绝大部分流量。

常见组合:请求 → 本地 Caffeine 缓存(15秒) → Redis(130分钟) → 数据库。

mikechen睿哥

10年+大厂架构经验,大厂面试官,就职于阿里、淘宝等一线大厂,操盘多个亿级数据量大厂核心项目。

评论交流
    说说你的看法