0Pricing
AWS Solutions Architect · 课时

Redis 与 Memcached:选择合适的引擎

比较 Redis(持久化、复制、有序集合、发布/订阅)与 Memcached(简洁性、多线程),并根据使用场景需求进行选择

Redis 与 Memcached:选择合适的引擎 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

什么是 Amazon ElastiCache

Amazon ElastiCache 是一项完全托管的内存缓存服务,可让您轻松地在云中部署、管理和扩展常用的开源内存数据存储。它支持两种引擎:Redis 和 Memcached。ElastiCache 将频繁请求的数据从内存而不是数据库中提供出来,因此可以将数据库负载降低几个数量级,并将响应延迟从毫秒级缩短到微秒级。如何在 Redis 和 Memcached 之间进行选择,是 SAA-C03 考试中的常见问题。

Memcached:纯粹的简洁性

Memcached 是一种分布式内存键值存储,专注于简洁性和水平扩展。其主要特征包括:多线程(可以使用单个节点上的所有 CPU 核心)、简单的键值存储(仅支持字符串,不支持复杂数据结构)、不具备持久化能力(节点重启时数据会丢失)、不支持复制(没有备用节点或副本),以及通过客户端一致性哈希实现的水平分片。当您需要简单的大规模缓存,且不需要持久化、复杂数据类型或高可用性时,Memcached 是合适的选择。

# Create a Memcached cluster with 3 nodes
aws elasticache create-cache-cluster \
  --cache-cluster-id my-memcached \
  --engine memcached \
  --cache-node-type cache.r7g.large \
  --num-cache-nodes 3 \
  --cache-subnet-group-name my-subnet-group

# Memcached auto-discovers nodes via the config endpoint
# Application connects to: my-memcached.cfg.use1.cache.amazonaws.com:11211

Redis:功能丰富的内存存储

Redis(Remote Dictionary Server)是一种单线程(每个实例)且功能丰富的内存数据结构存储,支持字符串、哈希、列表、集合、排序集合、位图、HyperLogLogs、流和地理空间索引。与 Memcached 相比,Redis 的主要优势包括:可选的持久化(AOF 和 RDB 快照)、复制(只读副本和自动故障转移)、发布/订阅消息传递、Lua 脚本、事务(MULTI/EXEC)以及用于水平分片的集群模式。对于大多数实际的缓存场景,Redis 都是合适的选择。

# Redis data structure examples

# String
# SET user:1:name 'Alice'
# GET user:1:name

# Hash (object-like)
# HSET product:42 name 'Widget' price '9.99' stock '100'
# HGETALL product:42

# Sorted set (leaderboard)
# ZADD leaderboard 9500 'alice' 8700 'bob' 9100 'carol'
# ZREVRANGE leaderboard 0 2 WITHSCORES

# Pub/Sub
# PUBLISH notifications 'order_shipped:12345'
# SUBSCRIBE notifications

Redis 持久化:AOF 和 RDB

Redis 支持两种持久化机制:RDB (Redis Database)——按照可配置的时间间隔定期创建并保存磁盘时间点快照(重启速度快,但可能丢失两次快照之间的数据);AOF (Append-Only File)——记录每一次写入操作;重启时,Redis 会重放这些记录以重建状态(以更大的文件和更慢的重启速度为代价来获得持久性)。在 ElastiCache 中,您可以启用 AOF,以便在节点重启后保留数据。当 ElastiCache 不仅用作缓存,还用作主要数据存储(例如存储会话数据)时,这一点至关重要。

# Create an ElastiCache Redis cluster with AOF enabled
aws elasticache create-replication-group \
  --replication-group-id my-redis \
  --replication-group-description 'Redis with persistence' \
  --cache-node-type cache.r7g.large \
  --engine redis \
  --num-cache-clusters 2 \
  --cache-parameter-group-name default.redis7 \
  --snapshot-retention-limit 5

# Note: Enable AOF via parameter group: appendonly=yes

Redis 复制与自动故障转移

Redis 支持复制组,其中包含一个处理所有写入操作的主节点,以及最多 5 个处理读取操作的只读副本。启用 Multi-AZ 和自动故障转移后,如果主节点发生故障,ElastiCache 会自动将一个只读副本提升为主节点,通常可在 60 秒内完成故障转移。这使基于 Redis 的应用具备 Memcached 无法匹敌的高可用性(Memcached 不支持复制)。对于需要高可用缓存的生产应用,请始终使用启用了自动故障转移的 Redis。

# Create a Redis replication group with Multi-AZ failover
aws elasticache create-replication-group \
  --replication-group-id prod-redis \
  --description 'Production Redis with HA' \
  --cache-node-type cache.r7g.xlarge \
  --engine redis \
  --multi-az-enabled \
  --automatic-failover-enabled \
  --num-cache-clusters 3 \
  --cache-subnet-group-name multi-az-subnet-group

# 1 primary + 2 replicas across 3 AZs

使用 Redis 排序集合构建排行榜

Sorted sets 是 Redis 最强大的数据结构之一。每个成员都有一个关联的浮点分数,并且成员始终按排序顺序保存。因此,排序集合非常适合用于排行榜(按分数排名)、优先级队列(优先处理优先级最高的任务)以及速率限制(使用时间戳作为分数的滑动窗口)。ZADD、ZRANGE、ZREVRANGE、ZRANK 和 ZRANGEBYSCORE 的时间复杂度均为 O(log n),即使面对数百万条记录,也极其高效。

# Leaderboard operations using Redis sorted sets

# Add/update scores
# ZADD game:leaderboard 10500 'player:alice'
# ZADD game:leaderboard 9800  'player:bob'
# ZADD game:leaderboard 11200 'player:carol'

# Get top 3 players (highest scores first)
# ZREVRANGE game:leaderboard 0 2 WITHSCORES
# Result: carol 11200, alice 10500, bob 9800

# Get a player's rank (0-indexed)
# ZREVRANK game:leaderboard 'player:alice'
# Result: 1 (second place)

使用 Redis 发布/订阅进行消息传递

Redis 的发布/订阅功能允许发布者向频道广播消息,而无需知道订阅者是谁。订阅者会实时接收发布到其订阅频道的所有消息。发布/订阅消息不会持久化——如果订阅者处于离线状态,就会错过该消息。对于需要持久化且保证送达的消息传递,请使用 Redis Streams(Redis 5 中新增的一种更强大的数据结构),或使用 SQS、SNS 等专用消息服务。对于 SAA-C03 考试,Redis 发布/订阅可用于服务之间的轻量级实时通知。

# Publisher side (broadcasts to 'notifications' channel)
# PUBLISH notifications '{"type":"order_shipped","orderId":"12345"}'

# Subscriber side (listens for messages)
# SUBSCRIBE notifications

# Pattern subscribe (wildcard channel matching)
# PSUBSCRIBE order:*
# Receives messages from: order:created, order:shipped, order:delivered

# Note: Unlike SQS, pub/sub is fire-and-forget — no acknowledgement

Memcached 与 Redis:选择表

在 SAA-C03 考试中,请使用以下框架进行选择:当您需要简单缓存且不要求高可用性、需要多线程性能,或希望通过添加节点进行水平扩展(纯缓存)时,选择 Memcached。当您需要持久化(会话存储)、复制和故障转移(高可用性)、复杂数据类型(用于排行榜的排序集合、集合、列表)、发布/订阅、Lua 事务,或用于多分片水平扩展的集群模式时,选择 Redis。如果考试题目提到简单键值缓存之外的任何功能,答案几乎总是 Redis。

缓存节点类型与系列

ElastiCache 提供多个节点类型系列:r7g(Graviton 3,内存优化型——性价比最佳,是大多数缓存场景的推荐选择)、m7g(计算和内存均衡型)以及 t4g(突发型,成本较低,适合开发/测试)。节点大小范围从 cache.t4g.micro(500 MB)到 cache.r7g.16xlarge(425 GB)。在生产环境中,请选择能够将数据集保存在内存中并预留 20% 至 25% 余量的节点大小。内存耗尽会导致逐出(Memcached)或 OOM 错误(Redis)。

# Get available cache node types
aws elasticache describe-cache-engine-versions \
  --engine redis \
  --query 'CacheEngineVersions[?contains(EngineVersion, '7')].{Engine:Engine,Version:EngineVersion}'

# Check memory and vCPU for a node type
aws elasticache describe-cache-engine-versions \
  --cache-parameter-group-family redis7

# Monitor evictions to detect memory pressure
# CloudWatch: Evictions metric > 0 means cache is full

ElastiCache 安全性

ElastiCache 部署在您的 VPC 内部,由安全组控制访问,默认不允许通过公共互联网访问。对于 Redis,请启用 AUTH 令牌(客户端必须提供的密码)和用于连接的传输中加密(TLS),并使用 KMS 启用静态加密。对于 Memcached,仅支持传输中 TLS(不支持静态加密或 AUTH)。从未加密的 Redis 迁移到加密的 Redis 时,无法进行就地迁移——您必须创建新的加密集群并预热该集群。

# Create a Redis cluster with TLS and AUTH token
aws elasticache create-replication-group \
  --replication-group-id secure-redis \
  --description 'Encrypted Redis' \
  --cache-node-type cache.r7g.large \
  --engine redis \
  --transit-encryption-enabled \
  --at-rest-encryption-enabled \
  --auth-token 'MySecretPassword123!'

# Store the AUTH token in Secrets Manager, not in your app code

逐出策略

当 Redis 或 Memcached 缓存已满时,逐出策略会决定删除哪些键以腾出空间。常见的 Redis 逐出策略包括:noeviction(返回 OOM 错误——当缓存是主要存储时很适用)、allkeys-lru(在所有键中逐出最近最少使用的键——适合一般缓存)、volatile-lru(在设置了 TTL 的键中应用 LRU——保留永不过期的键)、allkeys-random(随机逐出)以及 allkeys-lfu(逐出最不常使用的键)。对于典型的缓存使用场景,建议使用 allkeys-lru 或 allkeys-lfu。

# Set eviction policy via parameter group
aws elasticache create-cache-parameter-group \
  --cache-parameter-group-name redis7-lru \
  --cache-parameter-group-family redis7 \
  --description 'LRU eviction policy'

aws elasticache modify-cache-parameter-group \
  --cache-parameter-group-name redis7-lru \
  --parameter-name-values ParameterName=maxmemory-policy,ParameterValue=allkeys-lru

# Apply the parameter group to your cluster:
aws elasticache modify-replication-group \
  --replication-group-id prod-redis \
  --cache-parameter-group-name redis7-lru

快速检查

测试您对本课 AWS 解决方案架构师(SAA-C03)相关概念的理解。

课程回顾

本课中您学习了:Memcached 简单、支持多线程且不具备高可用性,最适合简单缓存的纯水平扩展;Redis 支持复杂数据结构、持久化、发布/订阅和 Multi-AZ 故障转移,最适合大多数生产缓存场景;而排序集合使 Redis 成为构建排行榜和优先级队列的自然选择。接下来,我们将探索 Redis 复制组和集群模式,以实现水平分片。

常见问题解答

「Redis 与 Memcached:选择合适的引擎」课时是免费的吗?

是的 — 「Redis 与 Memcached:选择合适的引擎」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「Redis 与 Memcached:选择合适的引擎」这节课中我会学到什么?

比较 Redis(持久化、复制、有序集合、发布/订阅)与 Memcached(简洁性、多线程),并根据使用场景需求进行选择 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「Redis 与 Memcached:选择合适的引擎」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Redis 与 Memcached:选择合适的引擎
  2. ElastiCache Redis 复制组与集群模式
  3. 缓存策略:延迟加载与写入直达
  4. 会话存储与排行榜模式
← 返回 AWS Solutions Architect