十六篇走到这里,问题不应是「Redis 好不好」,而是 你的失效代价、数据结构需求、团队运维半径 落在哪一格。本篇不重复 缓存架构 的五种读写模式全文,也不替代官方托管 SLA;只做 部署形态决策树、生态分叉一句、模块与争论边界,并把读者送回系列内外的下一步。
本文是「Redis / 缓存内核」系列第 16 篇(共 16 篇)。→ 系列目录
版本锚定:Redis OSS 7.4 / 8.x;Valkey 以 Linux Foundation 托管的 OSS 分叉为语境(具体发行版以你方镜像为准)。
一、选型决策树
flowchart TD
Start["Need in-memory KV?"] --> Q1{"Values rebuildable from DB?"}
Q1 -->|yes, blob only| MC["Consider Memcached / pure cache"]
Q1 -->|no or rich types| Q2{"Need structures / Lua / modules?"}
Q2 -->|yes| RD["Redis family"]
Q2 -->|no| MC
RD --> Q3{"Write QPS fits one primary?"}
Q3 -->|yes| Q4{"Need auto failover?"}
Q4 -->|no| SA["Standalone + manual DR"]
Q4 -->|yes| SEN["Sentinel"]
Q3 -->|no| CL["Cluster"]
RD --> Q5{"Durability RPO?"}
Q5 -->|zero loss| AOF["AOF always + WAIT / managed sync"]
Q5 -->|seconds| MIX["RDB + AOF everysec / hybrid"]
Q5 -->|cache only| NOP["no persistence"]
| 形态 | 适用 | 主要代价 |
|---|---|---|
| Standalone | 开发、低 QPS、可接受手动故障 | 单点;复制需自管 |
| Sentinel | 单分片生产、要自动 failover | 不解决写扩展;客户端需 Sentinel 感知 |
| Cluster | 写/内存超单机、接受 slot 约束 | 运维与客户端复杂度;CROSSSLOT、迁移期
ASK |
| Memcached | 纯 Cache-Aside blob(第 14 篇) | 无结构与持久化 |
| 托管 Redis | 团队不想自管 failover/fsync | 成本与供应商锁定(本篇不评定价) |
二、与 architecture/17 的分工
architecture/17 回答 应用侧 缓存模式(Cache-Aside、击穿雪崩、多级缓存);本系列回答 服务器内核(事件循环、编码、淘汰、持久化、复制、slot)。衔接关系:
| 架构层问题 | 应用篇 | 内核篇 |
|---|---|---|
| 写 DB 还是写缓存 | Cache-Aside / Write-through | 第 1、14、16 篇 |
| 缓存丢失怎么办 | 回源、降级 | RDB/AOF(9–11)、复制(12) |
| 分布式 key 路由 | 一致性哈希概念 | Cluster slot(13) |
| 延迟尖刺 | 超时、重试策略 | 排障(15) |
若已读完 architecture/17 而 未 读本系列:建议按 index 推荐阅读路径 补 2 → 8 → 11 → 12 → 13 → 16 最小链。
三、Valkey 与 Redis 生态(一段)
2024 年起,Redis Ltd. 调整 Redis OSS 许可证(RSAL/SSPL 路线,以官方公告为准),Linux Foundation 托管 Valkey 作为 OSS 社区分叉,目标保持 协议与 API 兼容(RESP、主要命令、RDB/AOF 格式在分叉早期仍对齐,具体差异需查各 release note)。对工程团队含义是:客户端驱动、运维脚本、监控指标 大多可复用,但 法务合规、长期 roadmap、企业功能 需分别跟踪 Redis 商业产品与 Valkey 社区版。本篇不展开许可证全文;选型时把 合规审查 与 技术审查 并列,勿假设二者永远字节级一致。
四、模块边界与 Redis Stack
Redis 模块 API 允许在服务器进程内加载 自定义命令与数据类型(JSON、Search、TimeSeries、Bloom 等 Stack 组件)。边界:
| 在内 | 在外 |
|---|---|
| 单进程内扩展命令、共享事件循环 | 跨语言业务事务、复杂查询规划器 |
| 与原生 encoding 共用内存上限 | 替代 PostgreSQL / Elasticsearch 全文场景(需自证) |
| 模块级持久化钩子 | 开箱即用的跨地域多主(Active-Active 属企业/专门产品) |
模块 不 改变 第 2 篇
的主线程执行默认:重模块仍可能抢占主线程时间,排障时用
INFO modules 与 SLOWLOG 同看。
# 查看已加载模块(名称依安装而定)
redis-cli INFO modules
redis-cli MODULE LIST五、开放争论(有文献或官方讨论锚点)
- 多线程执行 vs 多线程 IO:Redis 7/8 持续扩大 IO threads 与部分路径并行;是否与 Memcached 式 多线程命令执行 收敛,社区仍有性能与锁粒度争论(见 Redis release blog,B 级)。工程判断:CPU 饱和前先分清 网络、命令、持久化 谁占主线程。
- AOF always vs everysec:丢失窗口与 fsync 延迟的交换(第 10–11 篇、fsyncgate);无 universal 最优,只有 RPO/RTO。
- 读副本 vs 扩展主库:复制滞后 vs 读己之写(第 12 篇);PACELC 式延迟—一致性权衡。
- Redlock 与分布式锁:Martin Kleppmann 批评与 Antirez 回应是经典争论;锁语义 不应默认由单线程 Redis 命令保证,需应用层建模。
- Cluster vs
Proxy:Twemproxy、Envoy、自研 sidecar 在
CROSSSLOT上的不同拆法;proxy 不自动获得跨槽事务。
六、何时不该用 Redis
与 第 14 篇 互补,明确 退出条件:
- 值永远可重建且只需
get/set→ 纯缓存更简单。 - 需要 SQL、JOIN、跨行事务 → 关系库或 HTAP,不是 Redis 主战场。
- 数据量远大于内存、访问以扫描为主 → RocksDB 等磁盘 LSM / 列存路径。
- 强一致多副本写 → 共识数据库(etcd、TiKV),而非默认异步复制 Redis。
七、全系列阅读地图
7.1 本系列 16 篇(按主题)
| 块 | 篇目 | 一句话 |
|---|---|---|
| 模型 | 01–02 | 生态位与 ae/IO threads |
| 结构 | 03–06 | redisObject 与紧凑编码 |
| 内存 | 07–08 | TTL 与 maxmemory |
| 持久化 | 09–11 | RDB/AOF/混合 |
| 分布式 | 12–13 | 复制与 Cluster |
| 对照运维 | 14–15 | Memcached 与排障 |
| 收束 | 16(本篇) | 选型与地图 |
7.2 站外相邻系列
| 目标 | 链接 |
|---|---|
| 应用缓存模式 | architecture/17 缓存架构 |
| 多级缓存工程 | storage/66 缓存工程 |
| 哈希 / 跳表 / 一致性哈希 | algorithms/07、18、11 |
| fsync 语义 | linux/fsyncgate |
| 磁盘 LSM / 嵌入 KV | RocksDB 内核 |
| Redis 4.0 历史漫游 | linux/redis-source |
7.3 三条延伸路径
- 可靠性深化:11 → fsyncgate → storage/12 数据完整性。
- 分布式深化:13 → algorithms/11 → distributed 系列(共识与复制对比)。
- 存储栈下沉:01 → RocksDB index → 磁盘容量与缓存协同。
八、常见误解
| 误解 | 事实 |
|---|---|
| 「Cluster 解决一切扩展」 | 单 key 热点、跨槽事务、复制滞后仍在 |
| 「Sentinel 与 Cluster 可叠加强用」 | 生产通常二选一拓扑,避免双重复杂度 |
| 「Valkey 与 Redis 永远 100% 兼容」 | 跟踪各自 release note;合规与许可证独立 |
| 「模块等于微服务」 | 模块仍在单进程故障域内 |
| 「读完 16 篇就会运维百节点 Cluster」 | 本篇提供地图;大规模实践需官方工具链与演练 |
九、系列收束
本系列从 事件循环 与 对象编码 出发,经 淘汰 与 持久化,到 复制、Cluster、Memcached 对照 与 排障,构成 Redis 7.4/8.x 内核层 的一条可读路径。更上层的 Cache-Aside 与多级缓存,请回到 architecture/17;更下层的磁盘嵌入 KV,请进入 RocksDB。
三句话小结:
- Standalone / Sentinel / Cluster 按写扩展、failover、slot 复杂度递增;纯 blob Cache-Aside 仍应认真考虑 Memcached。
- Valkey 是许可证驱动下的 OSS 分叉路线,技术上短期接近 Redis,合规与 roadmap 需独立跟踪;模块 扩展命令但不改变单进程故障域与主线程代价模型。
- 全系列 16 篇与 architecture/17、RocksDB、算法篇形成 应用—内存服务器—磁盘存储 三角;按本篇地图选下一条边即可。
参考资料
文档(A 级)
- Redis Documentation, High availability、Cluster tutorial、Sentinel、Modules API。
- Redis OSS 7.4
redis.conf与 release notes(IO threads、许可证变更前的 OSS 行为)。
辅助(B 级)
- Linux Foundation, Valkey project announcements(分叉动机与兼容声明)。
- Kleppmann, M., How to do distributed locking(与 Redlock 争论);Antirez 回应文(B 级博客)。
- 系列 index、PLAN.md(规划文档,非发布页)。
返回 系列目录 | 上一篇:生产排障 | 缓存架构 | RocksDB
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【RocksDB 内核机制】选型与存储栈阅读地图
用决策树收束 RocksDB 与 InnoDB、列存、湖仓的适用边界;给出存储引擎三角 + 数据平台全栈阅读地图,对接 query-engine/18 与 postgresql-kernel,并标注 HTAP/TiKV 续作入口。
【Redis / 缓存内核】缓存服务器全景:HashMap · Memcached · Redis · 嵌入 KV
定位进程内 HashMap、Memcached、Redis 与 RocksDB 嵌入 KV 在内存缓存栈中的生态位;划分与 architecture/17、storage/66、linux/redis-source 的分工,并给出本系列 16 篇阅读地图。
【Redis / 缓存内核】Cluster:16384 slot · MOVED/ASK · 多 key 同槽
按 Redis Cluster Spec 与 cluster.c 拆解 CRC16 取模 16384 的 hash slot、MOVED 与 ASK 重定向语义,对照客户端一致性哈希,说明 hash tag 下同槽多 key 原子性边界与迁移期 TRYAGAIN。
【Redis / 缓存内核】事件循环 · 对象编码 · 淘汰 · RDB/AOF · Cluster
补齐内存 KV / 缓存服务器内核层:从 ae 事件循环与 redisObject 多态编码,到 TTL/maxmemory 近似淘汰、RDB/AOF 持久化语义,再到复制、Cluster hash slot 与 Memcached 对照。