Amazon ElastiCache 缓存设计 - Valkey、Redis OSS 与 Memcached 的选型及缓存策略
整理 Valkey、Redis OSS 与 Memcached 的选型标准,介绍 Lazy Loading 和 Write-Through 缓存策略以及 Serverless 模式的活用方法。
Valkey、Redis OSS 与 Memcached 的选型标准
ElastiCache 提供 Valkey、Redis OSS 与 Memcached 共 3 种引擎,以微秒级延迟每秒处理数百万请求。Valkey 是作为 Redis 的分支而诞生的开源兼容引擎,作为 ElastiCache 的默认引擎提供。Valkey 与 Redis OSS 以单线程事件循环模型运行,提供字符串、哈希、列表、集合、Sorted Set、Streams、HyperLogLog 等丰富的数据结构。支持基于 AOF(Append Only File)和 RDB 快照的数据持久化、只读副本、自动故障转移以及 Pub/Sub 消息传递。因此不仅可用作缓存,还可用作会话存储、排行榜、实时排名和消息代理。Memcached 采用多线程架构,专注于简单的键值缓存,通过添加节点即可轻松水平扩展。适合不需要数据持久化和复制、只想单纯缓存数据库查询结果的场景。在引擎选型上,关键在于 Valkey 使用与 Redis OSS 相同的命令集和客户端库,价格却更低。其节点小时单价、Serverless 的 ECPU 单价和 Serverless 的最低计费存储均低于 Redis OSS。因此,新建时以 Valkey 为起点,延长现有集群的寿命或依赖特定版本时用 Redis OSS,不需要复制和持久化的简单缓存层用 Memcached,这样的划分是务实的。
| 观察点 | Valkey(默认引擎) | Redis OSS | Memcached |
|---|---|---|---|
| 执行模型 | 单线程事件循环 | 单线程事件循环 | 多线程 |
| 数据结构 | 字符串、哈希、列表、集合、Sorted Set、Streams、HyperLogLog | 与 Valkey 相同(Valkey 兼容 Redis OSS) | 只有简单的键值 |
| 持久化与复制 | AOF 与 RDB 快照、只读副本、自动故障转移 | AOF 与 RDB 快照、只读副本、自动故障转移 | 都不具备 |
| 扩展方式 | 分片与只读副本 | 分片与只读副本 | 通过添加节点即可轻松水平扩展 |
| 缓存之外的用途 | 会话存储、排行榜、实时排名、Pub/Sub 消息代理 | 会话存储、排行榜、实时排名、Pub/Sub 消息代理 | 基本只用作缓存 |
| Serverless 支持 | 支持。最低计费存储为每个缓存 100 MB | 支持。最低计费存储为每个缓存 1 GB | 支持。最低计费存储为每个缓存 1 GB |
| 成本水平 | 3 种引擎中最便宜(节点小时单价、ECPU 单价、Serverless 存储单价全部如此) | 比 Valkey 贵 | 节点小时单价与 Redis OSS 处于同一水平 |
| 适合场景 | 新建时的默认选择。保持 Redis OSS 兼容的同时以最低成本起步 | 想继续直接使用现有 Redis OSS 资产时 | 只想单纯缓存数据库查询结果时 |
缓存策略设计
Lazy Loading(Cache-Aside)是在缓存未命中时从数据库获取数据并写入缓存的策略。由于缓存中只存储实际被请求的数据,内存效率高,但首次访问时会发生缓存未命中。Write-Through 是在写入数据库的同时也更新缓存的策略。缓存中的数据始终保持最新,但写入延迟会增加,未被读取的数据也会存入缓存。在实践中,有效的做法是将两者结合:用 Write-Through 在写入时更新缓存,同时设置 TTL 让旧数据自动失效。TTL 的设定值根据数据的新鲜度要求决定:要求实时性的数据设短(数秒到数分钟),主数据设长(数小时到数天)。运维的关键是通过 CloudWatch 指标持续监控缓存命中率,并定期审查 TTL 和节点大小的适当性。
| 观察点 | Lazy Loading(Cache-Aside) | Write-Through |
|---|---|---|
| 写入缓存的时机 | 缓存未命中时,从数据库取回的同时写入缓存 | 写入数据库时,同一时刻更新缓存 |
| 缓存中的数据 | 只有真正被请求过的数据 | 所有被写入的数据,包括没人读的数据 |
| 内存效率 | 高 | 容易偏低 |
| 数据新鲜度 | 缓存可能变旧 | 始终保持最新 |
| 弱点 | 首次访问一定会未命中 | 写入延迟增加 |
| 实务上的落点 | 两者结合:用 Write-Through 在写入时更新,同时用 TTL 让旧数据自动失效。要求实时性的数据设为数秒〜数分钟,主数据设为数小时〜数天 | |
集群模式与分片
在 Valkey 或 Redis OSS 中启用集群模式后,数据会分布到 16384 个哈希槽中,并可通过多个分片水平扩展。每个分片配置主节点和最多 5 个只读副本,以分散读取负载。集群的默认上限不是由分片数而是由节点数决定,主节点与副本合计每个集群最多 90 个节点(不配置副本的构成最多 90 个分片)。在 Valkey 7.2 或更高版本(Redis OSS 5.0.6 或更高版本)中,可通过申请提高上限,将每个集群扩展到最多 500 个节点(官方文档记载值,截至 2026 年 8 月)。客户端按照哈希槽映射将请求发送到正确的分片,槽位移动时通过 MOVED 重定向自动连接。选择节点类型时,内存优化的 r 系列实例(cache.r7g 系列)适合缓存工作负载,并根据数据量和吞吐量要求调整分片数和副本数。启用 Multi-AZ 部署和自动故障转移后,主节点故障时复制延迟最小的副本会被自动提升。官方文档表述为,到能够恢复写入为止通常需要数秒。不过由于复制是异步的,如果被提升的副本稍有滞后,相应部分的写入存在丢失的可能性。不能丢失的数据,前提是也要写入 DynamoDB 或 RDS 等持久存储。
迁移到 Valkey 与 Global Datastore
Valkey 可以直接使用现有的 Redis 客户端库和命令集,无需担心许可证问题即可使用 Redis 兼容环境。从运行中的 Redis OSS 集群可以通过引擎升级操作迁移到 Valkey,已购买的预留节点折扣也可以沿用。使用 Global Datastore 可在区域间异步复制数据,实现灾难恢复(DR)并改善全球读取延迟。主区域发生故障时可以提升次要区域。根据 AWS 官方 FAQ 的记载值(截至 2026 年 8 月),RPO 通常小于 1 秒,RTO 通常也小于 1 分钟(故障转移开始后,次要区域通常在 1 分钟以内变得能够同时承担读写)。通过区域间复制发送的数据会产生传输费用,因此对于写入量大的集群,要把这部分费用计入估算。
ElastiCache Serverless 与运维
ElastiCache Serverless 是 2023 年推出的模式,无需事先设计节点类型和集群大小。支持 Valkey、Redis OSS 与 Memcached 全部 3 种引擎,只需选择引擎即可创建缓存。容量会根据工作负载自动扩缩,从最小配置开始,自动应对流量的增长。费用是基于数据存储量(GB 小时)和 ElastiCache Processing Units(ECPU)使用量的按量计费。ECPU 以读写传输的数据每 1 KB 计 1 ECPU 为基准,在 Valkey 和 Redis OSS 中,占用大量 vCPU 时间的命令按传输量和 vCPU 时间中较大的一方计算。另外,每个缓存规定了最低计费存储:Valkey 为 100 MB,Redis OSS 与 Memcached 为 1 GB(官方价格页面记载值,截至 2026 年 8 月)。可以为数据存储和请求速率设置上限和下限:用上限抑制意外成本,用下限确保基线性能。特别适合流量模式难以预测的新应用以及开发和测试环境。另一方面,在流量模式稳定的生产环境中,使用预留节点的预置配置的成本效率有时会更高。
ElastiCache 费用
(截至 2026 年 8 月,弗吉尼亚北部 us-east-1 与东京 ap-northeast-1)ElastiCache 的计费对象有 4 个维度:基于节点的集群的节点小时计费、Serverless 的数据存储与 ECPU、备份(快照)的存储,以及 Global Datastore 的区域间数据传输。 节点小时计费方面,Valkey 的 cache.r7g.large 在弗吉尼亚北部为 0.1752 USD/小时,在东京为 0.2104 USD/小时。同一节点类型下,Redis OSS 与 Memcached 在弗吉尼亚北部为 0.219 USD/小时,因此 Valkey 的定价便宜约 20%。Serverless 的数据存储以 GB 小时(GB-Hours)为单位计费。Valkey 在弗吉尼亚北部为 0.084 USD/GB 小时、在东京为 0.101 USD/GB 小时,Redis OSS 与 Memcached 在弗吉尼亚北部为 0.125 USD/GB 小时。ECPU 按每 100 万 ECPU 计价:Valkey 在弗吉尼亚北部为 0.0023 USD、在东京为 0.0027 USD,Redis OSS 与 Memcached 在弗吉尼亚北部为 0.0034 USD。备份对超出免费额度的存储量收取 0.085 USD/GB 月(GB-months),弗吉尼亚北部与东京相同。通过 Global Datastore 的区域间复制发送的数据,从弗吉尼亚北部发出为 0.02 USD/GB,从东京发出为 0.09 USD/GB。 最低计费和例外有 3 点。Serverless 规定了每个缓存的最低计费存储(Valkey 100 MB / Redis OSS 与 Memcached 1 GB),即使处于空闲状态,这部分也会计费。启用了 Valkey 耐久性选项(同步写入)的节点,会产生与节点费用不同的计费项目,cache.r7g.large 在弗吉尼亚北部为 0.0315 USD/小时、在东京为 0.0379 USD/小时。继续使用标准支持已结束的引擎版本时,会增加延长支持的计费项目,弗吉尼亚北部的 cache.r7g.large 第 1 至 2 年为 0.175 USD/小时,第 3 年为 0.35 USD/小时。免费套餐的内容因注册时间而异:如果在 2025 年 7 月 15 日之前注册了 AWS 免费套餐,cache.t3.micro 的节点使用量每月 750 小时最长 12 个月免费(Serverless 不在对象内)。该日期及之后的注册,则在 Free Plan 和 Paid Plan 之间选择,并通过抵扣额度使用。 对于流量间断的工作负载,Serverless 的成本较低;对于持续高吞吐量的工作负载,预置节点更有利。在预置配置中可以通过预留节点大幅降低成本,Valkey cache.r7g.large 的 3 年全额预付在弗吉尼亚北部为 2,071.92 USD、在东京为 2,488.19 USD。除以 3 年(26,280 小时)后,每小时的费用约为按需价格的 45%,也就是实际享受约 55% 的折扣。
总结
ElastiCache 是直接有助于减轻数据库负载、改善应用响应速度的缓存服务。新建时以默认引擎 Valkey 为起点,通过组合 Lazy Loading 和 Write-Through 来设计缓存策略。通过集群模式的分片和只读副本确保可扩展性,并可借助 Global Datastore 应对全球部署和灾难恢复。有效的做法是先用 Serverless 模式轻松起步,待工作负载稳定后,再考虑迁移到使用预留节点的预置配置。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。