D
AI
学习工作台
后端面试题2026-05-221 分钟阅读

Redis 缓存策略

缓存模式、一致性、穿透击穿雪崩与数据结构选型

Redis缓存高并发后端面试记笔记标记疑惑

为什么用 Redis

内存 KV 存储,低延迟、高 QPS,支持丰富数据结构(String、Hash、List、Set、ZSet、Stream、Bitmap、HyperLogLog)。在架构中常作缓存、分布式锁、计数器、排行榜、消息队列(List/Stream)、会话存储。

经典缓存模式

| 模式 | 说明 | |---|---| | Cache Aside | 业务代码管缓存,最常用 | | Read/Write Through | 缓存层代理读写 | | Write Behind | 异步写回 DB,吞吐高、一致性弱 |

推荐默认 Cache Aside

读: cache.get → miss → db.get → cache.set
写: db.update → cache.delete (或延迟双删)

写后删缓存而非更新缓存,避免并发写乱序留下脏数据。高一致场景可用 Canal 订阅 binlog 异步删缓存。

三大问题

穿透:恶意 id 不存在 → 布隆过滤器拦截、空对象缓存 TTL 短。

击穿:热点 key 过期 → 逻辑过期(值带时间戳,异步刷新)、互斥锁(只有一个线程查 DB)、热点 key 永不过期 + 后台更新。

雪崩:批量过期 / Redis 故障 → 过期时间加随机抖动、集群高可用、限流降级、多级缓存(本地 Caffeine + Redis)。

分布式锁

SET key value NX EX 30 原子占锁;解锁用 Lua 校验 value 再 DEL,防误删他人锁。Redisson 看门狗续期。注意锁粒度、超时与业务幂等。

-- 安全释放
if redis.call("get", KEYS[1]) == ARGV[1] then
  return redis.call("del", KEYS[1])
else
  return 0
end

数据结构选型

  • 计数、限流:INCR + 过期
  • 对象字段:Hash
  • 排行榜:ZSet
  • 去重集合:Set + SINTER
  • 简单队列:List 或 Stream 消费组

面试延伸

  • 持久化 RDB vs AOF、混合持久化
  • 集群槽位、重定向
  • 大 key 危害与 unlink 异步删
  • 与 DB 一致性级别:最终一致 vs 强一致成本
结合业务说「商品详情 5 分钟 TTL + 更新消息删 key」比罗列 API 更能体现工程经验。

知识卡片

问题

Cache Aside 模式流程?

点击翻转查看答案

答案

读:先查缓存,miss 则读 DB 并回写缓存;写:常先更新 DB 再删缓存,避免双写顺序导致长期不一致。

问题

缓存穿透是什么?如何解决?

点击翻转查看答案

答案

查询不存在的数据,缓存与 DB 都 miss,流量打穿 DB;可用布隆过滤器、缓存空值短 TTL、接口校验。

问题

缓存击穿与雪崩区别?

点击翻转查看答案

答案

击穿:热点 key 过期瞬间大量请求打 DB;雪崩:大量 key 同时过期或 Redis 宕机,整体 DB 压力飙升。