为什么用 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 强一致成本