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。
缓存策略设计
Lazy Loading (Cache-Aside) 是缓存未命中时从数据库获取并写入缓存的策略。缓存中仅存储实际被请求的数据,内存效率高,但首次访问时会发生缓存未命中。Write-Through 是在写入数据库的同时更新缓存的策略。缓存数据始终保持最新,但写入延迟增加,且从未被读取的数据也会被缓存。实践中组合两种策略最为有效:通过 Write-Through 在写入时更新缓存,同时设置 TTL 使过期数据自动失效。TTL 值根据数据新鲜度需求决定,实时性要求高的数据设短 (数秒到数分钟),主数据设长 (数小时到数天)。通过 CloudWatch 指标持续监控缓存命中率,定期审查 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 的系统化学习可参考专业书籍 (Amazon)。
ElastiCache 费用
ElastiCache 按节点小时计费。Redis 的 cache.r7g.large 每小时约 0.252 美元 (月费约 181 美元)。Serverless 模式按 ECPU (每百万约 0.0034 美元) 和存储 (每 GB 月费约 0.125 美元) 按量计费。流量间歇的工作负载 Serverless 更经济,持续高吞吐的工作负载预置节点更有利。预留节点可享受最高 55% 折扣。
总结
ElastiCache 是直接改善数据库负载和应用响应速度的缓存服务。以 Redis 为默认选择,结合 Lazy Loading 和 Write-Through 设计缓存策略。通过集群模式的分片和只读副本确保可扩展性,利用 Valkey 兼容引擎和 Global Datastore 支持全球部署。从 Serverless 模式轻松起步,工作负载稳定后考虑迁移到预置配置的方法更为有效。