面试知识库

Redis 缓存问题 → 一致性 → 分布式锁 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. 缓存穿透:恶意请求查不存在的key → 布隆过滤器前置拦截,误判率可控在1%以内
  2. 击穿 vs 雪崩:击穿是单个热key → 用互斥锁或逻辑过期;雪崩是批量key → 随机TTL分散过期
  3. 一致性核心矛盾:先更新DB再删缓存仍有短暂不一致窗口(读请求回填旧数据)→ 延迟双删补偿
  4. 分布式锁本质:SET NX EX 保证互斥+超时释放;Lua 脚本保证”判断+删除”原子性
  5. Redisson看门狗:后台线程每 lockWatchdogTimeout/3(默认10s)续期一次,业务线程完成后取消
  6. 代码示例
    -- Lua脚本原子释放锁
    if redis.call('get', KEYS[1]) == ARGV[1] then
        return redis.call('del', KEYS[1])
    else return 0 end
    lua

面试回答串联#

30秒速答#

“缓存穿透用布隆过滤器+空值缓存,击穿用互斥锁,雪崩用随机TTL。一致性保证采用Cache-Aside+延迟双删,兜底用Canal订阅binlog。分布式锁用Redisson的看门狗自动续期,主从切换丢锁场景靠业务幂等兜底。“

2分钟展开答#

“缓存穿透指查询不存在的key绕过缓存打到数据库,解决方案是布隆过滤器前置拦截——1%误判率只需9.6 bit/element,加上空值缓存设短TTL。击穿是热key过期瞬间并发请求打穿DB,用互斥锁或逻辑过期解决。雪崩是大批key同时过期,在基础TTL上加随机值分散。缓存DB一致性我们用Cache-Aside模式——先更新DB再删缓存,加延迟双删(300-500ms)补偿,最终兜底用Canal订阅binlog异步更新。分布式锁用SET key NX EX加锁,Lua脚本保证释放时判断+删除的原子性。生产中用Redisson,看门狗默认30s过期每10s续期,避免业务未完成锁就过期。Redis主从切换可能丢锁,RedLock需要N/2+1个独立实例确认,但Martin Kleppmann指出时钟偏移问题,实际我们用Redisson+业务幂等双重保障。“

相关追问链#