Skip to content

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 everysec

everysec 通常表示每秒刷盘一次,性能和安全性折中。极端宕机时可能丢 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 可能来自:

  1. Redis 本身执行慢命令。
  2. 网络抖动。
  3. 连接池耗尽。
  4. 大 Key 传输过慢。
  5. 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 操作有限制
缓存能保证强一致缓存通常只能做到最终一致或短时间不一致

学习建议 ​

  1. 先掌握数据结构和命令复杂度。
  2. 再理解缓存模式和缓存一致性。
  3. 再学 RDB、AOF,知道 Redis 重启如何恢复。
  4. 再学主从、哨兵、Cluster,理解故障转移。
  5. 最后学热 Key、大 Key、慢命令和生产排查。

Redis 高级知识的核心是“风险意识”:它很快,但它也可能因为热点、过期、持久化、网络、锁误用而成为事故源。