Redis
Redis 是内存 KV 存储,常用作缓存、计数、分布式锁、简单队列。通用缓存模式见 缓存与消息队列;本篇专注 Redis 本身。
Redis 解决什么
| 场景 | 用法 |
|---|---|
| 热点读 | String / Hash 缓存对象 |
| 计数 / 限流 | INCR、滑动窗口 |
| 排行榜 | Sorted Set(ZSet) |
| 去重 / 标签 | Set |
| 队列(轻量) | List / Stream(严肃 MQ 见 Kafka) |
| 分布式锁 | SET key NX EX + 唯一 value |
数据结构(面试必背)
| 类型 | 典型命令 | 场景 |
|---|---|---|
| String | GET/SET/INCR | 缓存、计数 |
| Hash | HGET/HSET | 对象字段 |
| List | LPUSH/BRPOP | 简单队列 |
| Set | SADD/SMEMBERS | 去重、共同好友 |
| ZSet | ZADD/ZRANGE | 排行榜、延迟队列 |
| Stream | XADD/XREADGROUP | 消费组、类 MQ |
单线程模型
命令执行 单线程(6.0+ 多 IO 线程处理网络,命令仍主线程):
| 含义 | 实践 |
|---|---|
| 命令原子 | 复杂逻辑用 Lua 或 MULTI/EXEC |
| 避免阻塞 | 禁 KEYS *、大 key、O(N) 全表扫 |
| 热 key | 本地缓存、多副本、拆分 key |
持久化
| 方式 | 说明 |
|---|---|
| RDB | 快照;恢复快,可能丢最后一次快照后的数据 |
| AOF | 追加写命令;可 everysec;文件更大 |
| 混合 | RDB + 增量 AOF(常用) |
缓存场景可 不持久化;锁/计数要看能否重建。
高可用
| 方案 | 说明 |
|---|---|
| 主从复制 | 异步复制;读从有延迟 |
| Sentinel | 监控、自动 failover |
| Cluster | 16384 slot 分片;跨 slot 操作受限 |
缓存三大问题
| 问题 | 解法 |
|---|---|
| 穿透 | 布隆过滤器、空值缓存 |
| 击穿 | 互斥锁重建、逻辑过期 |
| 雪崩 | TTL 随机抖动、多级缓存、限流降级 |
分布式锁
SET lock:order:123 <uuid> NX EX 30
-- 释放时 Lua:if GET==uuid then DEL
| 注意 | 说明 |
|---|---|
| 必须设 TTL | 防死锁 |
| 唯一 value | 防误删他人锁 |
| Redlock | 多节点方案,争议点到即可 |
| 续期 | 看门狗延长 TTL(长任务) |
业务强一致仍靠 DB 唯一约束 / 乐观锁。
常见误解
- 「Redis 就是缓存」——角色还包括计数、锁、Coordination
- 「List 当 Kafka 用」——无持久与消费语义保障时别当主 MQ
- 「Cluster 无限扩容」——跨 slot 事务/MGET 受限,要设计 key
面试速记
- 为什么快? 内存、单线程无锁竞争、IO 多路复用、高效数据结构。
- RDB vs AOF? 快照 vs 日志;混合常用。
- 穿透击穿雪崩? 各自定义与解法。
- 分布式锁要点? NX+EX、唯一 value、Lua 释放。
- 热 key? 本地缓存、复制、拆分、读写分离。