Redis 设计 12 大维度

redis 📚 learning redis-design-dimensions · redis · design · architecture · trade-off · capacity-planning

TL;DR(30 秒扫完)

  • 12 大维度:性能 / 数据结构 / 淘汰过期 / 持久化 / 高可用 / 扩展 / 一致性 / 并发 / 网络 / 安全 / 监控 / 业务集成
  • 每个维度必给量化目标:QPS 10w / P99 < 5ms / 可用性 99.99% / RPO 1min
  • 每个维度必讲 trade-off:如 RDB 快但丢数据,AOF 安全但写慢
  • 演进路径:先单机+主从 → Cluster → + 本地缓存

关键结论

结论 A设计题核心是量化目标 + trade-off,只列名词 = 2/5 分
结论 B12 维度按 6 层组织(性能存储 / 可靠性扩展 / 一致性并发 / 网络安全 / 可观测性 / 业务集成)
结论 C演进路径很重要——不要一上来就上 Cluster,先单机+主从验证
结论 D监控是最后一道防线——没有告警的缓存等于没有缓存

完整讲解(费曼四步)

STEP 1 · 概念

Redis 设计 12 大维度:设计一个缓存系统时需要考虑的 12 个关键维度,每个维度都要给出量化目标和trade-off 分析。

STEP 2 · 大白话

装修房子比喻: 设计缓存就像装修房子,不能只说"要好看、要结实、要省电",必须说清楚:
  • 好看 → P99 延迟 < 5ms
  • 结实 → 可用性 99.99%
  • 省电 → 内存占用 ≤ 32GB
  • 还要考虑:电路(网络)、锁(安全)、报警器(监控)、邻居(业务集成)

STEP 3 · 底层

12 大维度框架(6 层组织)

第一层:性能与存储
维度量化目标trade-off
① 性能模型QPS 10w / P99 < 5ms / 内存 ≤ 32GB先定目标再用 redis-benchmark 建基准
② 数据结构String/Hash/List/Set/ZSet小数据用 listpack 紧凑,大数据自动升级
③ 淘汰与过期allkeys-lru 或 allkeys-lfu;TTL 加随机抖动LRU 防热点被挤走,LFU 防新数据挤走热点
第二层:可靠性与扩展
维度量化目标trade-off
④ 持久化RPO 1min / RTO 30sRDB 快但丢 15min,AOF everysec 安全但写慢,混合最佳
⑤ 高可用可用性 99.99%主从+Sentinel 自动故障转移,脑裂防护 min-replicas-to-write
⑥ 扩展16384 哈希槽在线重平衡迁 slot;平滑扩容先加节点再迁数据
第三层:一致性与并发
维度量化目标trade-off
⑦ 一致性最终一致Redis 是 AP 系统,牺牲一致性保可用;读已写 vs 读多数
⑧ 并发命令原子性单线程保证命令原子;Lua 脚本批量原子;MULTI 慎用
第四层:网络与安全
维度量化目标trade-off
⑨ 网络epoll + RESP 协议连接复用(Lettuce Netty);Pipeline 批量减少 RTT
⑩ 安全ACL + TLS6.0+ 细粒度权限;内网隔离 + 防火墙白名单
第五层:可观测性
维度量化目标trade-off
⑪ 监控QPS/延迟/内存/evicted_keysSLOWLOG(默认 10ms);Prometheus + Grafana 告警
第六层:业务集成
维度量化目标trade-off
⑫ 业务集成穿透/击穿/雪崩防御布隆过滤器 + 互斥锁 + TTL 抖动;多级缓存 + Canal + TTL 兜底

容量规划(关键量化)

缓存容量 = 热点数据量 × 单条大小 × 副本数 × 安全系数(1.5-2)

例:
- 热点商品 10w 条 × 2KB/条 × 3 副本 × 1.5 = 900MB
- 加 20% 余量 → 申请 1GB 内存
采样验证:MEMORY USAGE 抽样 1000 个 key 看平均大小

演进路径

阶段架构适用场景
1单机 + 持久化验证阶段,QPS < 1w
2主从 + Sentinel生产入门,QPS < 10w
3Cluster 分片大数据量,QPS > 10w
4+ 本地缓存(Caffeine)极致性能,热点数据
5+ 多级缓存 + Canal强一致需求
原则:不要一上来就上 Cluster,先单机+主从验证业务模型。

工程实践清单

必做:
  • 容量规划(避免大促 OOM)
  • SLOWLOG 监控(默认 10ms 阈值)
  • evicted_keys 告警
  • 脑裂防护配置
  • 灰度发布 + 回滚预案
推荐:
  • redis-benchmark 压测建基准
  • 慢命令审计(INFO commandstats)
  • 大 key 扫描(--bigkeys)
  • 蓝绿部署
选做:
  • 可视化(RedisInsight / Grafana)
  • 自动扩缩容
  • 混沌工程(故意宕机测试)

常见坑

坑后果解决
没做容量规划大促 OOM提前压测 + 容量告警
没设淘汰策略写失败返回错误显式配置 allkeys-lru
用 KEYS 命令阻塞主线程改用 SCAN
大 key DEL卡住主线程改用 UNLINK 异步删除
没配 SLOWLOG不知道谁卡住默认 10ms 阈值
没做脑裂防护数据双写min-replicas-to-write

STEP 4 · 简化

一句话总结:设计缓存 = 12 维度 × (量化目标 + trade-off)。先单机验证,再 Cluster 扩展,监控是最后防线。 记忆口诀:
  • 6 层组织:性能存储 / 可靠性扩展 / 一致性并发 / 网络安全 / 可观测性 / 业务集成
  • 12 维度:性能/结构/淘汰/持久/高可用/扩展/一致性/并发/网络/安全/监控/业务
  • 每个维度:量化目标 + trade-off
  • 演进:单机 → 主从 → Cluster → + 本地缓存 → + Canal
  • 必做:容量规划 + SLOWLOG + evicted_keys 告警 + 脑裂防护

延伸追问

如何估算缓存容量?
热点数据量 × 单条大小 × 副本数 × 安全系数(1.5-2);MEMORY USAGE 抽样
一致性哈希如何解决数据倾斜?
虚拟节点(每物理节点 100-150 个虚拟节点)、MD5 散列均匀
Redis Cluster 的脑裂如何防护?
min-replicas-to-write + 多数派仲裁 + 老主库下线验证
Redis 如何做蓝绿部署?
新版本部署 → 双写或同步旧数据 → 灰度切流 → 全量切换 → 回滚预案
如何设计一个支持强一致缓存?
Raft 协议(etcd 思路)+ 多副本同步 + 写多数;或业务层加锁
缓存如何优雅降级?
熔断打开 → 走 DB(限流)→ 静态兜底数据 → 前端提示
多级缓存的一致性如何解决?
Cache-Aside + 发布订阅 + 本地缓存 TTL 极短 + 容忍短暂不一致
Redis 6.0 的 io-threads 怎么调?
根据 CPU 核数,一般 2-4,不超过 4

速查表

12 维度: 性能/结构/淘汰/持久/高可用/扩展/一致性/并发/网络/安全/监控/业务
6 层: 性能存储 / 可靠性扩展 / 一致性并发 / 网络安全 / 可观测性 / 业务集成
量化: QPS 10w / P99 < 5ms / 内存 32GB / 可用性 99.99% / RPO 1min
演进: 单机 → 主从+Sentinel → Cluster → +本地缓存 → +Canal
必做: 容量规划 + SLOWLOG + evicted_keys 告警 + 脑裂防护
坑: KEYS→SCAN / 大DEL→UNLINK / 没容量规划→OOM

Anki 候选卡片

Q: 设计缓存的 12 大维度?
A: 性能/数据结构/淘汰过期/持久化/高可用/扩展/一致性/并发/网络/安全/监控/业务集成
Q: 缓存容量如何估算?
A: 热点数据量 × 单条大小 × 副本数 × 安全系数(1.5-2)
Q: Redis 设计的演进路径?
A: 单机 → 主从+Sentinel → Cluster → +本地缓存 → +Canal
Q: 设计缓存必做的 4 件事?
A: 容量规划 + SLOWLOG 监控 + evicted_keys 告警 + 脑裂防护

关联题目

  • 《如果设计一个缓存,需要考虑哪些方面?》— 2026-09-20 Round 1 Q10, ⭐⭐(只答 4 维度,缺量化思维和结构化)
  • 关联知识

    设计缓存要覆盖 12 个维度,每个都要给量化目标+trade-off,只列名词不够
    设计缓存像装修房子:不能只说'好看、结实、省电',必须说清楚'10 平、承重 5 吨、月耗电 50'
    ✦ 记 忆 口 诀 ✦
    12 维度 6 层组织:性能存储/可靠扩展/一致并发/网络安全/可观测/业务集成
    关键可视化
    12 大维度 6 层组织
    flowchart TB
      L1["1.性能存储"] --> D1["性能 QPS/P99"] --> D2["数据结构"]
      L2["2.可靠扩展"] --> D3["淘汰过期"] --> D4["持久化"] --> D5["高可用"] --> D6["扩展"]
      L3["3.一致并发"] --> D7["一致性"] --> D8["并发"]
      L4["4.网络安全"] --> D9["网络"] --> D10["安全"]
      L5["5.可观测"] --> D11["监控告警"]
      L6["6.业务集成"] --> D12["业务适配"]
    每个维度必给量化目标
    flowchart LR
      G["量化目标示例"] --> P["性能<br/>QPS 10w<br/>P99 < 5ms"]
      G --> A["可用性<br/>99.99%<br/>=年宕机<53min"]
      G --> R["RPO<br/>1min<br/>=最多丢1min数据"]
      G --> M["内存<br/>100G<br/>=预估 key 数×大小"]
      G --> T["TTL<br/>1h<br/>=根据业务热点"]
    演进路径
    flowchart LR
      S1["单机 Redis"] --> S2["单机+主从"] --> S3["哨兵+自动故障转移"] --> S4["Redis Cluster 分片"] --> S5["+ 本地缓存 Caffeine"]
      S1 -.-> R["验证业务模型"]
      S2 -.-> R2["读扩展+备份"]
      S3 -.-> R3["自动故障转移"]
      S4 -.-> R4["写扩展+海量数据"]
      S5 -.-> R5["读极致优化"]
    知识关系

    🔄 延伸(Extends)

    暂无

    ⚡ 对比(Contrast)

    MVCC— 设计题考察系统性思维,MVCC 是单点技术深度——两种考察维度
    🎯 概念 📏 规则 ⚠️ 误区 🔍 追问 ✨ 口诀 共 0 张卡,点击翻面