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 30s | RDB 快但丢 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 + TLS | 6.0+ 细粒度权限;内网隔离 + 防火墙白名单 |
| 维度 | 量化目标 | trade-off |
|---|---|---|
| ⑪ 监控 | QPS/延迟/内存/evicted_keys | SLOWLOG(默认 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 |
| 3 | Cluster 分片 | 大数据量,QPS > 10w |
| 4 | + 本地缓存(Caffeine) | 极致性能,热点数据 |
| 5 | + 多级缓存 + Canal | 强一致需求 |
工程实践清单
必做:- 容量规划(避免大促 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 告警 + 脑裂防护
关联题目
关联知识
设计缓存要覆盖 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["读极致优化"]
知识关系
⬆️ 前置(Prerequisite)
redis-single-threadcache-three-failurescache-consistencyredis-expiration-eviction🔄 延伸(Extends)
暂无
🎯 概念
📏 规则
⚠️ 误区
🔍 追问
✨ 口诀
共 0 张卡,点击翻面