Amazon ElastiCache 缓存设计 - Redis 与 Memcached 的选型及缓存策略

整理 Redis 与 Memcached 的选型标准,介绍 Lazy Loading 和 Write-Through 缓存策略以及 Serverless 模式的活用。

Redis 与 Memcached 的选型标准

ElastiCache 提供 Redis 和 Memcached 两种引擎,以微秒级延迟处理每秒数百万请求。Redis 以单线程事件循环模型运行,提供字符串、哈希、列表、集合、Sorted Set、Streams、HyperLogLog 等丰富的数据结构。支持 AOF (Append Only File) 和 RDB 快照的数据持久化、只读副本、自动故障转移、Pub/Sub 消息传递,不仅可用作缓存,还可作为会话存储、排行榜、实时排名和消息代理。Memcached 是多线程架构,专注于简单键值缓存,通过添加节点可轻松水平扩展。不需要数据持久化和复制、仅需纯粹缓存数据库查询结果时适合使用。新项目大多因功能丰富和运维灵活性而选择 Redis。

表:Redis 与 Memcached 的差别在于「能把什么交给它」
观察点RedisMemcached
执行模型单线程事件循环多线程
数据结构字符串、哈希、列表、集合、有序集合、Streams、HyperLogLog只有简单的键值
持久化与复制AOF 与 RDB 快照、只读副本、自动故障转移两者都没有
扩展方式分片与只读副本增加节点即可轻松横向扩展
缓存之外的用途会话存储、排行榜、实时排名、Pub/Sub 消息代理基本只用作缓存
适合场景需要丰富功能与运维灵活性;新项目大多选它只想缓存数据库查询结果时

缓存策略设计

Lazy Loading (Cache-Aside) 是缓存未命中时从数据库获取并写入缓存的策略。缓存中仅存储实际被请求的数据,内存效率高,但首次访问时会发生缓存未命中。Write-Through 是在写入数据库的同时更新缓存的策略。缓存数据始终保持最新,但写入延迟增加,且从未被读取的数据也会被缓存。实践中组合两种策略最为有效:通过 Write-Through 在写入时更新缓存,同时设置 TTL 使过期数据自动失效。TTL 值根据数据新鲜度需求决定,实时性要求高的数据设短 (数秒到数分钟),主数据设长 (数小时到数天)。通过 CloudWatch 指标持续监控缓存命中率,定期审查 TTL 和节点大小是运维的关键。

表:Lazy Loading(Cache-Aside)与 Write-Through 各自的长短
观察点Lazy Loading(Cache-Aside)Write-Through
写入缓存的时机缓存未命中时,从数据库取回的同时写入缓存写入数据库时,同一时刻更新缓存
缓存中的数据只有真正被请求过的数据所有被写入的数据,包括没人读的数据
内存效率容易偏低
数据新鲜度缓存可能变旧始终保持最新
弱点首次访问一定会未命中写入延迟增加
实务上的落点两者结合:用 Write-Through 在写入时更新,同时用 TTL 让旧数据自动失效。要求实时性的数据设为数秒〜数分钟,主数据设为数小时〜数天

集群模式与分片

启用 Redis 集群模式后,数据分布在 16384 个哈希槽中,可跨多个分片水平扩展。每个分片配置一个主节点和最多 5 个只读副本,分散读取负载。客户端根据哈希槽映射将请求发送到正确的分片,槽位迁移时通过 MOVED 重定向自动连接。节点类型选择方面,内存优化的 r 系列实例 (cache.r7g 系列) 适合缓存工作负载,根据数据量和吞吐需求调整分片数和副本数。Multi-AZ 部署确保可用性,自动故障转移可在数十秒内完成主节点切换。

Valkey 兼容引擎与 Global Datastore

Valkey 是 Redis 的开源分支兼容引擎,作为 ElastiCache 的新默认引擎提供。可直接使用现有 Redis 客户端库和命令集,无需担心许可证问题即可使用 Redis 兼容环境。ElastiCache Serverless 同时支持 Valkey 引擎和 Memcached。使用 Global Datastore 可跨区域异步复制数据,实现灾难恢复 (DR) 和降低全球读取延迟。主区域故障时可在数分钟内将次要区域提升为主区域,RPO 通常小于 1 秒。

ElastiCache Serverless 与运维

ElastiCache Serverless 是 2023 年推出的模式,无需预先设计节点类型或集群大小。容量根据工作负载自动扩缩,从最小配置开始自动应对流量增长。费用基于数据存储量和 ElastiCache Processing Units (ECPU) 使用量的按量计费。适合流量模式难以预测的新应用或开发环境。而流量稳定的生产环境中,使用预留节点的预置配置可能更具成本效益。

ElastiCache 费用

ElastiCache 按节点小时计费。Redis 的 cache.r7g.large 每小时约 0.252 美元 (月费约 181 美元)(截至 2026 年 8 月)。Serverless 模式按 ECPU (每百万约 0.0034 美元) 和存储 (每 GB 月费约 0.125 美元) 按量计费。流量间歇的工作负载 Serverless 更经济,持续高吞吐的工作负载预置节点更有利。预留节点可享受最高 55% 折扣。

总结

ElastiCache 是直接改善数据库负载和应用响应速度的缓存服务。以 Redis 为默认选择,结合 Lazy Loading 和 Write-Through 设计缓存策略。通过集群模式的分片和只读副本确保可扩展性,利用 Valkey 兼容引擎和 Global Datastore 支持全球部署。从 Serverless 模式轻松起步,工作负载稳定后考虑迁移到预置配置的方法更为有效。

参考资料(AWS 官方)

本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。

如本页内容与官方文档不一致,请以官方文档为准。