Skip to content

Redis高级

Redis 高级部分主要围绕可靠性、可用性、容量和缓存治理展开。基础命令解决“怎么用”,高级知识解决“高并发和生产故障下还能不能稳定用”。

高级阶段要解决什么问题

问题对应知识
Redis 重启后数据怎么办RDB、AOF、混合持久化
主节点挂了怎么办主从复制、哨兵
单机容量不够怎么办Redis Cluster 分片
缓存突然失效怎么办穿透、击穿、雪崩治理
某个 Key 太热怎么办热 Key 发现、拆分、本地缓存
某个 Key 太大怎么办大 Key 拆分、异步删除
Redis 慢命令怎么查slowloginfo、监控指标

知识地图

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