Redis高级
Redis 高级部分主要围绕可靠性、可用性、容量和缓存治理展开。基础命令解决“怎么用”,高级知识解决“高并发和生产故障下还能不能稳定用”。
高级阶段要解决什么问题
| 问题 | 对应知识 |
|---|---|
| Redis 重启后数据怎么办 | RDB、AOF、混合持久化 |
| 主节点挂了怎么办 | 主从复制、哨兵 |
| 单机容量不够怎么办 | Redis Cluster 分片 |
| 缓存突然失效怎么办 | 穿透、击穿、雪崩治理 |
| 某个 Key 太热怎么办 | 热 Key 发现、拆分、本地缓存 |
| 某个 Key 太大怎么办 | 大 Key 拆分、异步删除 |
| Redis 慢命令怎么查 | slowlog、info、监控指标 |
知识地图
mermaid
flowchart TD
A["Redis 高级"] --> B["可靠性<br/>RDB / AOF"]
A --> C["高可用<br/>主从 / 哨兵"]
A --> D["水平扩展<br/>Cluster 分片"]
A --> E["缓存治理<br/>穿透 / 击穿 / 雪崩"]
A --> F["性能排查<br/>慢命令 / 热 Key / 大 Key"]目录
RDB 和 AOF
mermaid
flowchart TD
A["Redis 写入数据"] --> B["内存数据变化"]
B --> C["RDB<br/>定期生成快照文件"]
B --> D["AOF<br/>记录写命令日志"]
C --> E["重启时加载快照"]
D --> E| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| RDB | 定期把内存数据生成快照文件 | 文件紧凑,恢复快 | 两次快照之间可能丢数据 |
| AOF | 追加记录写命令 | 数据更安全,可读性更好 | 文件更大,恢复可能更慢 |
| 混合持久化 | RDB 快照 + AOF 增量 | 兼顾恢复速度和数据安全 | 配置和理解成本更高 |
为什么不能只说“Redis 有持久化就不会丢数据”:持久化策略有刷盘间隔,机器宕机时仍可能丢失最近一小段写入。业务如果不能接受任何丢失,核心数据不要只放 Redis。
配置示例:
conf
appendonly yes
appendfsync everyseceverysec 通常表示每秒刷盘一次,性能和安全性折中。极端宕机时可能丢 1 秒左右数据。
主从、哨兵、Cluster
mermaid
flowchart TD
A["客户端"] --> B["Redis Master"]
B --> C["Redis Replica 1"]
B --> D["Redis Replica 2"]
E["Sentinel 1"] --> B
F["Sentinel 2"] --> B
G["Sentinel 3"] --> B| 架构 | 解决什么 | 不解决什么 |
|---|---|---|
| 主从复制 | 读扩展、数据副本 | 主节点故障自动切换 |
| 哨兵 | 主节点故障监控和自动切换 | 数据分片容量扩展 |
| Cluster | 分片、水平扩容、高可用 | 跨 slot 多 key 操作受限 |
为什么主从不能等同高可用:主从只复制数据,主节点挂了还需要有人判断故障、选择新主、通知客户端。这个职责由哨兵或 Cluster 机制处理。
缓存三大问题
mermaid
flowchart TD
A["缓存问题"] --> B["穿透<br/>查不存在数据"]
A --> C["击穿<br/>热点 Key 过期"]
A --> D["雪崩<br/>大量 Key 同时失效"]
B --> E["空值缓存 / 布隆过滤器"]
C --> F["互斥锁 / 逻辑过期"]
D --> G["TTL 随机 / 预热 / 降级"]| 问题 | 本质 | 常见处理 |
|---|---|---|
| 缓存穿透 | 无效请求绕过缓存打数据库 | 缓存空值、布隆过滤器、参数校验 |
| 缓存击穿 | 热点 Key 失效后并发回源 | 互斥锁、逻辑过期、热点预热 |
| 缓存雪崩 | 大量 Key 同时失效或 Redis 故障 | TTL 随机、高可用、限流降级 |
这些问题可以继续看 常见问题、缓存问题专题 或 高并发缓存治理。
热 Key 和大 Key
热 Key 是访问频率过高的 Key,大 Key 是 value 太大或集合元素太多的 Key。
| 类型 | 典型后果 | 治理 |
|---|---|---|
| 热 Key | 单节点 CPU 或网络被打满 | 本地缓存、拆分 Key、限流 |
| 大 Key | 查询慢、删除阻塞、迁移慢 | 拆分、分页、异步删除 |
扫描大 Key:
bash
redis-cli --bigkeys查看慢命令:
bash
redis-cli slowlog get 10查看整体状态:
bash
redis-cli info大 Key、热 Key、慢命令、连接池、Cluster 热点和高并发缓存治理的完整排查流程看:高并发缓存治理。
生产排查流程
mermaid
flowchart TD
A["Redis 延迟升高"] --> B["看 slowlog"]
B --> C{"是否有慢命令"}
C -- "是" --> D["定位大 Key 或复杂命令"]
C -- "否" --> E["看 info CPU / memory / clients"]
E --> F{"是否热 Key 或连接过多"}
F -- "是" --> G["限流、本地缓存、拆 Key"]
F -- "否" --> H["检查网络、持久化、主从同步"]不要只看应用日志里“Redis timeout”。Redis timeout 可能来自:
- Redis 本身执行慢命令。
- 网络抖动。
- 连接池耗尽。
- 大 Key 传输过慢。
- AOF rewrite、fork、主从同步带来的抖动。
命令 Demo
开启 AOF:
conf
appendonly yes
appendfsync everysec查看持久化信息:
bash
redis-cli info persistence查看主从复制信息:
bash
redis-cli info replication手动触发 RDB 快照:
bash
redis-cli bgsave查看慢命令:
bash
redis-cli slowlog get 20查看内存:
bash
redis-cli info memory常见误区
| 误区 | 正确理解 |
|---|---|
| Redis 在内存里所以一定不会慢 | 大 Key、慢命令、网络传输、持久化都会导致慢 |
| 开了 AOF 就绝不丢数据 | 取决于刷盘策略,everysec 仍可能丢最近数据 |
| 主从就是高可用 | 主从只是复制,还需要故障转移机制 |
| Cluster 可以随便做多 key 操作 | 跨 slot 操作有限制 |
| 缓存能保证强一致 | 缓存通常只能做到最终一致或短时间不一致 |
学习建议
- 先掌握数据结构和命令复杂度。
- 再理解缓存模式和缓存一致性。
- 再学 RDB、AOF,知道 Redis 重启如何恢复。
- 再学主从、哨兵、Cluster,理解故障转移。
- 最后学热 Key、大 Key、慢命令和生产排查。
Redis 高级知识的核心是“风险意识”:它很快,但它也可能因为热点、过期、持久化、网络、锁误用而成为事故源。
