为什么缓存优化至关重要?

在高并发系统中,缓存(Redis)能极大地减少数据库(MySQL)查询压力,提升网站性能。然而,如果缓存策略不合理,可能导致 缓存穿透、缓存击穿、缓存雪崩 等经典问题,进而引发数据库崩溃、系统可用性下降、响应变慢。

这些问题不仅影响SEO页面加载速度,还可能导致业务宕机。因此,深入理解Redis缓存的优化策略是架构设计中的关键。本文将详细介绍这些缓存问题的原理、影响,并提供对应的解决方案。

Redis MySQL

1. 什么是缓存穿透(Cache Penetration)?

缓存穿透: 缓存穿透是指查询的数据在缓存和数据库中都不存在,每次请求都会直接查询数据库还一无所获,导致数据库压力过大,甚至被击穿。通常发生在 恶意攻击、异常数据,导致 Redis 和 MySQL 都查不到数据。

解决方案

✅ 方法 1:缓存不存在的空值(推荐)
当数据库返回空结果时,将 null 或 empty 值也存入 Redis,防止后续同样的查询持续打穿透到 MySQL 数据库。比如可用如下代码逻辑有效防止缓存穿透:

key := "uid:9999999"
result := redis.Get(key)
if result == nil { 
    user := db.Query("SELECT * FROM users WHERE uid=9999999")
    if user == nil {
        redis.Set(key, "empty", 60)  // 缓存空值 60 秒
    } else {
        redis.Set(key, user, 600)  // 缓存正常数据 10 分钟
    }
}

✅ 方法 2:布隆过滤器(Bloom Filter)(高效拦截非法请求)
使用布隆过滤器存储所有合法的 uid,请求时先查询布隆过滤器,避免无效查询。

if !bloomFilter.Exists("uid:9999999") {
    return nil  // 直接返回,不查询数据库
}

✅ 方法 3:参数校验
在 API 层面限制非法请求,避免 uid < 0 或超出正常范围的数据进入查询逻辑。

2. 什么是缓存击穿(Cache Breakdown)?

缓存击穿 缓存击穿是指某个热点 key(如秒杀商品、热门新闻)突然过期,导致大量请求同时打到数据库,引发 MySQL 瞬时压力暴增。

解决方案

✅ 方法 1:热点数据永不过期(适用于超高访问量数据)
对于经常访问的热点数据,可以不设置 Redis 过期时间或由后台定期更新。

redis.Set("product:1001", data, 0)  // 永不过期

✅ 方法 2:加互斥锁(防止并发请求同时查询数据库)
第一个查询请求获取锁,回源数据库并写入 Redis,其它请求等待。

if redis.Get("product:1001") == nil {
    if redis.SetNx("lock:product:1001", 1, 10) {  // 10 秒内只有 1 个请求能拿到锁
        data := db.Query("SELECT * FROM products WHERE id=1001")
        redis.Set("product:1001", data, 600)
        redis.Del("lock:product:1001")  // 释放锁
    } else {
        time.Sleep(50ms)  // 其他请求等待后再查缓存
    }
}

✅ 方法 3:缓存预热(在 key 过期前主动更新)
定期刷新缓存,确保热门数据不会突然失效。

3. 什么是缓存雪崩(Cache Avalanche)?

缓存雪崩 缓存雪崩是指大量缓存数据同时过期,导致数据库承受极高压力,甚至 MySQL 直接崩溃。

解决方案

✅ 方法 1:随机过期时间(避免大规模缓存同时失效)

redis.Set("product:1001", data, 600 + rand(60))  // 600~660 秒随机过期

✅ 方法 2:分批更新(不同数据设置不同的缓存刷新时间)
避免一次性清空所有缓存,采用滚动更新策略。

✅ 方法 3:多级缓存(L1 + L2 + L3)(提高数据可用性)

  • L1 缓存(Guava Cache 本地缓存):减少 Redis 依赖
  • L2 缓存(Redis):作为主要缓存层
  • L3 缓存(MySQL):最终数据存储

延伸问题:

  • Redis 如何保证数据一致性?(异步双写、订阅更新)
  • 如何提高 Redis 高可用?(主从复制、哨兵模式、集群架构)
  • 如果 Redis 宕机,系统如何应对?(降级策略、读写分离)

总之,缓存优化是高并发系统的核心能力,掌握 缓存穿透、缓存击穿、缓存雪崩 及其解决方案,不仅能优化系统性能,还能应对高频面试中的 Redis 高并发问题。