Skip to content

Redis 7.0 集群面试题 ​

生成时间:2026-06-06 21:10 | 侧重:Redis 7.0 集群运维与架构 与 Spring 集成 Redis 面试题不同,本文聚焦集群层面


1. Redis 7.0 有哪些影响集群架构的核心新特性? ​

难度:⭐⭐

标准答案:

Redis 7.0 引入了多项影响集群架构的核心特性:

  1. Function 机制:替代 Lua 脚本,支持函数库的持久化与集群同步,解决了 Lua 脚本在集群中不一致的痛点
  2. 多 AOF 机制:将 AOF 拆分为 base AOF + incr AOF,减少重写开销,集群各节点可独立重写
  3. Client-Side Caching 增强:新增广播模式(broadcast),集群场景下缓存失效通知更高效
  4. Sharded Pub/Sub:分片级发布订阅,消息仅在所属 slot 的节点传播,避免集群广播风暴
  5. ACL v2:支持 Selector 模式,可为不同命令和 Key Pattern 设置细粒度权限,增强集群多租户安全
  6. Stream 消费者组改进:支持 XGROUP CREATE 的 ENTRIESREAD 参数,优化消费者组 lag 计算

延伸思考: Function 的引入是否意味着 Lua 脚本会被完全淘汰?从兼容性角度看,Redis 7.x 仍保留 EVAL/EVALSHA,但新项目建议优先使用 Function,因为 Function 支持持久化和集群自动同步。


2. Redis Cluster 的分片机制是如何工作的?16384 个 slot 的设计考量是什么? ​

难度:⭐⭐⭐

标准答案:

Redis Cluster 采用哈希槽(Hash Slot)分片:

  1. 分片算法:slot = CRC16(key) % 16384,将 key 映射到 0~16383 的槽位
  2. 槽位分配:集群启动时将 16384 个 slot 均匀分配到各主节点
  3. 请求路由:客户端向任意节点发请求,若 key 所在 slot 不在该节点,返回 MOVED 重定向

16384 的设计考量:

  • 心跳包大小:节点间 Gossip 消息需携带 slot 位图,16384 位 = 2KB;若用 65536 则需 8KB,Gossip 消息膨胀 4 倍
  • 集群规模:Redis Cluster 设计上限约 1000 节点,16384 个 slot 在该规模下每个节点平均 16 个 slot,粒度足够
  • slot 稀疏性:实际生产中节点数远小于 16384,slot 压缩传输效率高

延伸思考: 如果集群需要超过 1000 节点怎么办?Redis 7.0 并未突破此限制,大规模场景需考虑多集群方案(如 Twemproxy 分层或 Codis),或者评估是否真需要如此多节点——通常意味着数据模型设计需要优化。


3. Redis Cluster 故障转移的完整流程是什么?与 Sentinel 有何区别? ​

难度:⭐⭐⭐

标准答案:

Cluster 故障转移流程:

  1. 故障检测:节点 A 对节点 B 的心跳超时(cluster-node-timeout),标记为 PFAIL(疑似故障)
  2. 确认故障:超过半数主节点标记 B 为 PFAIL,B 升级为 FAIL(确认故障)
  3. 从节点选举:B 的从节点发起选举,向其他主节点拉票
  4. 投票裁决:主节点投票,从节点获得多数票后晋升为新主节点
  5. 槽位迁移:新主节点接管原主节点的所有 slot
  6. 通知客户端:客户端通过 MOVED 或节点广播感知新拓扑

与 Sentinel 的核心区别:

维度Cluster 内置故障转移Sentinel
架构去中心化,无额外进程独立 Sentinel 进程集群
检测方式Gossip 互探Sentinel 下行 + 客观下线
选举从节点向主节点拉票Sentinel 投票选主
适用场景Cluster 分片集群主从复制(非分片)
脑裂防护需多数主节点存活需多数 Sentinel 存活

延伸思考: Cluster 模式下,如果某主节点的所有从节点同时宕机,该主节点的 slot 将不可用。是否应该配置 cluster-require-full-coverage no 来允许部分不可用?这取决于业务能否接受部分数据暂时不可访问。


4. Redis 7.0 的 Function 机制与 Lua 脚本有什么本质区别?集群场景下如何同步? ​

难度:⭐⭐⭐

标准答案:

核心区别:

维度Lua 脚本Function
持久化不持久化,重启丢失持久化到 RDB/AOF
集群同步不同步,需手动分发自动同步到集群所有节点
管理方式EVAL/EVALSHA 临时执行FUNCTION LOAD 注册函数库
代码组织脚本散落客户端函数库集中管理,支持 LIST/DELETE
调试无原生调试FUNCTION DEBUG 支持
执行模型原子执行(单线程)原子执行(单线程),等效

集群同步机制:

  • FUNCTION LOAD 命令在任一节点执行后,Redis 7.0 通过集群广播将函数库同步到所有节点
  • 函数库随 RDB/AOF 持久化,新加入集群的节点通过全量同步获取
  • 通过 FUNCTION LIST 可验证各节点函数库一致性

延伸思考: Function 的自动同步是否增加了集群间的通信开销?实际上开销极小,因为 Function 只在加载/删除时同步,不像 Pub/Sub 那样持续产生流量。但需注意 Function 数量不宜过多,否则全量同步时传输量会增加。


5. Redis 7.0 多 AOF 机制的工作原理是什么?它如何优化 AOF 重写? ​

难度:⭐⭐

标准答案:

多 AOF 机制原理:

Redis 7.0 将单一 AOF 文件拆分为三种类型:

  1. BASE AOF:重写完成后生成的基准文件(由 redis-cli BGREWRITEAOF 或自动触发),体积小
  2. INCR AOF:重写后新增的增量写命令,追加写入
  3. HISTORY AOF:被新 BASE 替代的旧 BASE 文件,待清理

重写优化:

  • 传统 AOF 重写需 fork 子进程,期间新写命令写入 aof_rewrite_buf,重写完成后需合并,大内存实例 fork 耗时长
  • 多 AOF 模式下,重写只需生成新 BASE,INCR 文件继续追加,无需暂停写入
  • 重写完成后,旧 BASE 变为 HISTORY,后台异步删除,不影响在线服务
  • aof-use-rdb-preamble yes(默认开启)时,BASE 以 RDB 格式存储,恢复更快

集群场景影响:

  • 各节点独立执行 AOF 重写,互不干扰
  • 全量同步时,主节点可选择发送 BASE + INCR 组合,减少传输量

延伸思考: 多 AOF 是否意味着可以更激进地开启 AOF?是的。7.0 大幅降低了 AOF 重写对性能的影响,但 fork 仍然是瓶颈,大内存实例建议搭配 RDB 做混合持久化。


6. Redis 的内存淘汰策略有哪些?7.0 有何变化?集群场景下如何选择? ​

难度:⭐⭐

标准答案:

8 种淘汰策略:

策略说明
noeviction不淘汰,内存满时拒绝写入(默认)
allkeys-lru所有 key 中淘汰最久未使用的
allkeys-lfu所有 key 中淘汰使用频率最低的(4.0+)
allkeys-random所有 key 中随机淘汰
volatile-lru仅过期 key 中淘汰最久未使用的
volatile-lfu仅过期 key 中淘汰使用频率最低的
volatile-random仅过期 key 中随机淘汰
volatile-ttl仅过期 key 中淘汰 TTL 最短的

7.0 变化: Redis 7.0 对 LRU 算法做了优化,采用更精确的衰减计数器,减少了长周期采样偏差;同时 maxmemory-eviction-tenacity 参数可控制淘汰的激进程度(0-100,默认 1)。

集群场景选择建议:

  • 缓存场景:allkeys-lfu(推荐),各节点独立淘汰,LFU 比 LRU 更抗缓存穿透
  • DB 场景:noeviction + 合理 maxmemory,避免丢数据
  • 混合场景:volatile-lfu,保护未设 TTL 的持久数据
  • 注意:淘汰策略是节点级配置,集群各节点需统一,否则行为不一致

延伸思考: 集群模式下,不同节点内存使用不均怎么办?可配合 cluster-balance 相关配置或手动迁移 slot,Redis 7.0 目前不支持自动 slot 均衡,需运维介入。


7. Redis Stream 在集群模式下有什么限制?如何设计高可用的消息队列? ​

难度:⭐⭐⭐

标准答案:

集群模式下的限制:

  1. Stream 不跨分片:一个 Stream 的所有消息存储在同一个 slot(由 key 决定),无法利用多分片并行写入
  2. 消费者组无跨节点协调:消费者组状态仅存于 Stream 所属节点,消费者故障转移依赖客户端重连
  3. Sharded Pub/Sub vs Stream:7.0 的 Sharded Pub/Sub 解决了广播问题,但 Stream 本身不支持分片

高可用消息队列设计:

方案一:分片 Stream(推荐)
  - 按 key 前缀分片:stream:{order_id % 8}
  - 每个分片 Stream 在不同 slot,实现写入并行
  - 消费者轮询各分片读取

方案二:Sharded Pub/Sub + Stream 混合
  - 用 Sharded Pub/Sub 做实时通知
  - Stream 做持久化存储和回溯消费

方案三:XAUTOCLAIM 自动转移
  - 7.0 优化了 XAUTOCLAIM,消费者故障后 Pending 消息自动转移给其他消费者
  - 配合 `XREADGROUP` 的 `NOACK` + 手动 `XACK` 实现精确一次语义

延伸思考: 如果业务需要严格的全局有序消息,分片 Stream 无法保证。此时只能用单一 Stream + 多消费者组,牺牲写入吞吐换全局有序。评估是否真需要全局有序,通常业务维度有序即可。


8. Redis 7.0 多线程 IO 的工作机制是什么?如何配置?对集群性能有何影响? ​

难度:⭐⭐

标准答案:

工作机制:

Redis 7.0 的多线程 IO 仅用于网络读写,命令执行仍是单线程:

  1. 主线程接收连接,将读就绪的客户端分配给 IO 线程组
  2. IO 线程组并行读取请求和解析命令(io-threads 控制)
  3. 主线程串行执行所有命令(保证原子性)
  4. IO 线程组并行写回响应

配置参数:

redis
io-threads 4            # IO 线程数,建议 CPU 核数 / 2,不超过 8
io-threads-do-reads yes # 开启读多线程(默认只写多线程)

对集群的影响:

  • Gossip 消息收发走主线程,多线程 IO 不影响集群心跳
  • MOVED/ASK 重定向的响应走 IO 线程,降低客户端感知延迟
  • 全量同步时 RDB 传输走主线程,多线程 IO 不加速同步
  • 建议:集群节点开启多线程 IO 可显著提升 QPS(实测 30%~80%),但 io-threads 不宜超过 8,否则线程切换开销抵消收益

延伸思考: 多线程 IO 是否会让 Redis 变成多线程数据库?不会。命令执行仍是单线程,保证了 Redis 的原子性优势。多线程仅优化了 IO 瓶颈,类似 Netty 的 Reactor 模式。


9. Redis Cluster 扩缩容的关键步骤和风险点是什么? ​

难度:⭐⭐⭐

标准答案:

扩容步骤:

  1. 启动新节点:redis-server --cluster-enabled yes
  2. 加入集群:redis-cli --cluster add-node new_host:new_port exist_host:exist_port
  3. 迁移 slot:redis-cli --cluster reshard host:port --cluster-from <src_ids> --cluster-to <new_id> --cluster-slots <N>
  4. 迁移过程:每个 slot 迁移时,源节点标记 MIGRATING,目标节点标记 IMPORTING,客户端请求走 ASK 重定向
  5. 添加从节点:redis-cli --cluster add-node --cluster-slave --cluster-master-id <id>

缩容步骤:

  1. 迁移 slot:将待下线节点的 slot 迁走
  2. 移除节点:redis-cli --cluster del-node host:port <node_id>
  3. 关闭实例

关键风险点:

风险说明应对
大 Key 迁移阻塞单个 slot 含大 Key 时迁移耗时迁移前用 redis-cli --bigkeys 排查
客户端 ASK 风暴迁移期间大量请求被 ASK 重定向分批迁移,控制速率
slot 未迁完删除节点数据丢失确认 slot 全部迁走再删除
集群倾斜新节点 slot 过少导致负载不均使用 --cluster-weight 调整
Gossip 风暴节点过多时 Gossip 消息膨胀控制集群规模 < 1000 节点

延伸思考: 扩缩容期间如何保证业务零感知?7.0 改进了 slot 迁移的原子性,但 ASK 重定向仍会增加延迟。建议在低峰期操作,并配合客户端的 ASK 自动重定向能力(Jedis/Lettuce 均已支持)。


10. 生产环境 Redis Cluster 的监控指标有哪些?7.0 提供了哪些新的可观测性? ​

难度:⭐⭐

标准答案:

核心监控指标:

类别指标说明
集群健康cluster_stateok / fail,任一 slot 未覆盖即 fail
cluster_slots_ok正常 slot 数(应为 16384)
cluster_slots_assigned已分配 slot 数
节点状态connected_clients连接数
used_memory_rss实际内存占用
mem_fragmentation_ratio内存碎片率(>1.5 需关注)
延迟latency_percentiles_usec命令延迟百分位
instantaneous_ops_per_sec实时 QPS
持久化rdb_last_bgsave_statusRDB 最后备份状态
aof_last_bgrewrite_statusAOF 最后重写状态
aof_buffer_lengthAOF 缓冲区长度
主从复制master_repl_offset主节点复制偏移量
slave_repl_offset从节点复制偏移量(判断延迟)
master_link_status主从连接状态

7.0 新增可观测性:

  1. Function 监控:FUNCTION LIST 查看已加载函数库,INFO commandstats 中可追踪 function 相关命令执行情况
  2. 多 AOF 监控:INFO persistence 新增 aof-last-bgrewrite-status 及 AOF 文件列表信息
  3. ACL 审计:ACL LOG 记录权限拒绝事件,7.0 增强了日志内容
  4. Latency Histogram:LATENCY HISTOGRAM <command> 查看命令延迟分布直方图
  5. 客户端追踪:CLIENT TRACKINGINFO 查看 Client-Side Caching 状态

运维建议:

  • 使用 Prometheus + Grafana + redis_exporter 采集指标
  • 设置关键告警:cluster_state=fail、内存使用 > 80%、主从延迟 > 10s、AOF/RDB 备份失败
  • 定期执行 redis-cli --cluster check 验证集群完整性

延伸思考: 如何快速定位集群中的慢节点?7.0 的 LATENCY HISTOGRAM 是利器,可按命令维度分析延迟分布。结合 SLOWLOG GET 和 INFO commandstats 的 usec_per_call,可精准定位性能瓶颈节点。


本文共 10 道面试题,覆盖 Redis 7.0 集群架构核心知识点。建议结合实战经验深入理解,面试时不仅回答"是什么",更要讲清"为什么"和"怎么做"。