

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 与 ElastiCache
<a name="WorkingWithElastiCache"></a>

 在本节中，您可以找到有关如何管理 ElastiCache 实施中各个组件的详细信息。

**Topics**
+ [

# 快照和还原
](backups.md)
+ [

# 引擎版本和升级中 ElastiCache
](engine-versions.md)
+ [

# ElastiCache 最佳实践和缓存策略
](BestPractices.md)
+ [

# 在中管理基于节点的集群 ElastiCache
](manage-self-designed-cluster.md)
+ [

# 自动连接 EC2 实例和 ElastiCache 缓存
](compute-connection.md)
+ [

# 缩放 ElastiCache
](Scaling.md)
+ [

# 开始使用 Bloom 筛选条件
](BloomFilters.md)
+ [

# 无服务器版 Watch 入门
](ServerlessWatch.md)
+ [

# 开始使用向量搜索
](vector-search.md)
+ [

# 开始使用 Valkey 和 Redis OSS 的 JSON
](json-gs.md)
+ [

# 为资源添加 ElastiCache 标签
](Tagging-Resources.md)
+ [

# 使用 Amazon ElastiCache Well-Architected Lens
](WellArchitechtedLens.md)
+ [

# 常见故障排除步骤和最佳实践 ElastiCache
](wwe-troubleshooting.md)

# 快照和还原
<a name="backups"></a>

运行 Valkey、Redis OSS 或 Serverless Mem ElastiCache cached 的亚马逊缓存可以通过创建快照来备份其数据。您可以使用备份将缓存或种子数据还原到新缓存。备份包含缓存的元数据以及缓存中的所有数据。所有备份都会写入 Amazon Simple Storage Service (Amazon S3)，该服务提供持久存储。您随时可通过创建新的 Valkey、Redis OSS 或 Serverless Memcached 缓存并向该缓存填充备份中的数据来还原数据。使用 ElastiCache，您可以使用Amazon Web Services 管理控制台、Amazon Command Line Interface(Amazon CLI) 和 ElastiCache API 管理备份。

如果您计划删除缓存并且保留数据很重要，则可以采取额外的预防措施。为此，请先创建手动备份，验证其状态是否为*可用*，然后删除缓存。这样做可确保如果备份失败，您仍然可以使用缓存数据。您可以按照前面概述的最佳实践重新尝试创建备份。

**Topics**
+ [

## 备份约束
](#backups-constraints)
+ [

## 备份基于节点的集群对性能的影响
](#backups-performance)
+ [

# 计划自动备份
](backups-automatic.md)
+ [

# 进行手动备份
](backups-manual.md)
+ [

# 创建最终备份
](backups-final.md)
+ [

# 描述备份
](backups-describing.md)
+ [

# 复制备份
](backups-copying.md)
+ [

# 导出备份
](backups-exporting.md)
+ [

# 从备份还原到新缓存
](backups-restoring.md)
+ [

# 删除备份
](backups-deleting.md)
+ [

# 标记备份
](backups-tagging.md)
+ [

# 教程：使用外部创建的备份为新的基于节点的集群制作种子
](backups-seeding-redis.md)

## 备份约束
<a name="backups-constraints"></a>

在计划或创建备份时考虑以下约束：
+ 只有在 Valkey、Redis OSS 或 Serverless Memcached 上运行的缓存才支持备份和还原。
+ 对于 Valkey 或 Redis OSS（已禁用集群模式）集群，`cache.t1.micro` 节点不支持备份和还原。支持所有其他缓存节点类型。
+ 对于 Valkey 或 Redis OSS（已启用集群模式）集群，所有节点类型均支持备份和还原。
+ 在任何连续的 24 小时内，您可以针对每个无服务器缓存创建最多 24 个手动备份。对于 Valkey 和 Redis OSS 基于节点的集群，您可以针对集群中每个节点创建最多 20 个手动备份。
+ Valkey 或 Redis OSS（已启用集群模式）仅支持在集群级别（对于 API 或 CLI，支持在复制组级别）进行备份。Valkey 或 Redis OSS（已启用集群模式）不支持在分片级别（对于 API 或 CLI，不支持在节点组级别）进行备份。
+ 在备份过程中，您无法在无服务器缓存上运行任何其他 API 或 CLI 操作。备份期间，您可以在基于节点的集群上运行 API 或 CLI 操作。
+ 如果您使用的是带数据分层的 Valkey 或 Redis OSS 缓存，则无法将备份导出到 Amazon S3。
+ 您只能将使用 r6gd 节点类型的集群备份还原到使用 r6gd 节点类型的集群。

## 备份基于节点的集群对性能的影响
<a name="backups-performance"></a>

无服务器缓存上的备份对于应用程序是透明的，并且不会影响性能。但是，在为基于节点的集群创建备份时，可能会对性能产生一些影响，具体取决于可用的预留内存。基于节点的集群的备份不适用于 Memcache ElastiCache d，但可用于 Redis OSS ElastiCache 。

以下是提高基于节点的集群的备份性能的准则。
+ 设置`reserved-memory-percent`参数-为了减少过多的寻呼，我们建议您设置该*reserved-memory-percent*参数。该参数可防止 Valkey 和 Redis OSS 占用节点的所有可用内存，有助于减少分页量。只需使用更大的节点，您也可以获得性能改进。有关*预留内存和*reserved-memory-percent*参数的更多信息，*请参阅。[管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)

   
+ 从读取副本创建备份 – 如果您正在具有多个节点的节点组中运行 Valkey 或 Redis OSS，则可以从主节点或其中一个只读副本进行备份。由于在 BGSAVE 期间需要系统资源，因此我们建议您从一个只读副本上创建备份。从副本创建备份时，主节点不受 BGSAVE 资源要求的影响。主节点可以继续处理请求，而不会降低速度。

  若要执行此操作，请参阅 [创建手动备份（控制台）](backups-manual.md#backups-manual-CON)，并在 **Create Backup（创建备份）**窗口中的 **Cluster Name（集群名称）**字段中，选择副本而不是默认主节点。

如果您删除复制组并请求最终备份，则 ElastiCache 始终从主节点获取备份。这可以确保您在删除复制组之前捕获最新的 Valkey 或 Redis OSS 数据。

# 计划自动备份
<a name="backups-automatic"></a>

您可以为任何 Valkey 或 Redis OSS 无服务器缓存或基于节点的集群启用自动备份。启用自动备份后， ElastiCache 将每天创建缓存的备份。自动备份不会对缓存产生任何影响，而且更改是即时发生的。自动备份可以帮助防止数据丢失。出现故障时，您可以创建新的缓存，并从最新的备份中恢复数据。这样可得到热启动的缓存，其中预先加载了您的数据，已准备好可供使用。有关更多信息，请参阅 [从备份还原到新缓存](backups-restoring.md)。

您可以为任何 Memcached 无服务器缓存启用自动备份。启用自动备份后， ElastiCache 将每天创建缓存的备份。自动备份不会对缓存产生任何影响，而且更改是即时发生的。自动备份可以帮助防止数据丢失。出现故障时，您可以创建新的缓存，并从最新的备份中恢复数据。这样可得到热启动的缓存，其中预先加载了您的数据，已准备好可供使用。有关更多信息，请参阅 [从备份还原到新缓存](backups-restoring.md)。

当您计划自动备份时，应规划以下设置：
+ **备份开始时间** — 一天中 ElastiCache 开始创建备份的时间。您可以将备份时段设置为任何方便的时间。如果您未指定备份窗口，则会自动 ElastiCache 分配一个备份窗口。

   
+ **备份保留期限** – 备份在 Amazon S3 中保留的天数。例如，如果您将保留期限设置为 5，则当天进行的备份将保留 5 天。保留期限过期时，会自动删除备份。

  最大备份保留期限为 35 天。如果备份保留期限设置为 0，则会为缓存禁用自动备份。

当您安排自动备份时， ElastiCache 将开始创建备份。您可以将备份时段设置为任何方便的时间。如果您未指定备份窗口，则会自动 ElastiCache 分配一个备份窗口。

在创建新缓存或更新现有缓存时，您可以使用 ElastiCache 控制台、或 ElastiCache API 启用或禁用自动备份。Amazon CLI对于 Valkey 和 Redis OSS，这可以通过选中**高级 Valkey 设置**或**高级 Redis OSS 设置**部分的**启用自动备份**复选框来实现。对于 Memcached，这可以通过选中**高级 Memcached 设置**部分中的**启用自动备份**复选框来实现。

# 进行手动备份
<a name="backups-manual"></a>

除了自动备份以外，您还可以随时创建*手动* 备份。与在指定保留期之后自动删除的自动备份不同，手动备份并没有在超过之后就会自动删除的保留期。即使您删除缓存，也会保留该缓存中的任何手动备份。如果您不再需要保留某个手动备份，您必须自行显式删除它。

除了直接创建手动备份外，您还可以通过下列方法之一创建手动备份：
+ [复制备份](backups-copying.md)。源备份是自动还是手动创建并不重要。
+ [创建最终备份](backups-final.md)。创建备份，然后立即删除集群或节点。

您可以使用Amazon Web Services 管理控制台、或 ElastiCache API 创建缓存的Amazon CLI手动备份。

您可以从启用了集群模式和禁用了集群模式的副本生成手动备份。



## 创建手动备份（控制台）
<a name="backups-manual-CON"></a>

**创建缓存的备份（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，根据偏好选择 **Valkey 缓存**、**Redis OSS** 缓存或 **Memcached 缓存**。

1. 选择要备份的缓存名称左侧的方框。

1. 选择 **Backup**。

1. 在 **Create Backup** 对话框的 **Backup Name** 框中键入备份的名称。建议该名称指明所备份的集群以及进行备份的日期和时间。

   集群命名约束如下：
   + 必须包含 1 – 40 个字母数字字符或连字符。
   + 必须以字母开头。
   + 不能包含两个连续连字符。
   + 不能以连字符结束。

1. 选择 **Create Backup**。

   集群的状态将变为*快照*。

## 创建手动备份 (Amazon CLI)
<a name="backups-manual-CLI"></a>

**使用手动备份无服务器缓存Amazon CLI**

要使用创建缓存的手动备份Amazon CLI，请使用带有以下参数的`create-serverless-snapshot`Amazon CLI操作：
+ `--serverless-cache-name`：要备份的无服务器缓存的名称。
+ `--serverless-cache-snapshot-name` – 要创建的快照的名称。

对于 Linux、macOS 或 Unix：
+ 

  ```
  aws elasticache create-serverless-snapshot \
                          --serverless-cache-name CacheName \
                          --serverless-cache-snapshot-name bkup-20231127
  ```

对于 Windows：
+ 

  ```
  aws elasticache create-serverless-snapshot ^
      --serverless-cache-name CacheName ^
      --serverless-cache-snapshot-name bkup-20231127
  ```

**使用手动备份基于节点的集群Amazon CLI**

要使用创建基于节点的集群的手动备份Amazon CLI，请使用带有以下参数的`create-snapshot`Amazon CLI操作：
+ `--cache-cluster-id`
  + 例如，如果您要备份的集群没有副本节点，则`--cache-cluster-id`是您要备份的集群的名称*mycluster*。
  + 如果您正备份的集群有一个或多个副本节点，则 `--cache-cluster-id` 是您要用于备份的集群中节点的名称。例如，名称可能是*mycluster-002*。

  仅在备份 Valkey 或 Redis OSS（集群模式已禁用）集群时使用此参数。

   
+ `--replication-group-id` – 要用作备份源的 Valkey 或 Redis OSS（已启用集群模式）集群（CLI/API：复制组）的名称。备份 Valkey 或 Redis OSS（已启用集群模式）集群时使用此参数。

   
+ `--snapshot-name` – 要创建的快照的名称。

  集群命名约束如下：
  + 必须包含 1 – 40 个字母数字字符或连字符。
  + 必须以字母开头。
  + 不能包含两个连续连字符。
  + 不能以连字符结束。

### 示例 1：备份没有副本节点的 Valkey 或 Redis OSS（集群模式已禁用）集群
<a name="backups-manual-CLI-example1"></a>

以下Amazon CLI操作`bkup-20150515`从没有只读副本的 Valkey 或 Redis OSS（已禁用集群模式）集群`myNonClusteredRedis`创建备份。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-snapshot \
    --cache-cluster-id myNonClusteredRedis \
    --snapshot-name bkup-20150515
```

对于 Windows：

```
aws elasticache create-snapshot ^
    --cache-cluster-id myNonClusteredRedis ^
    --snapshot-name bkup-20150515
```

### 示例 2：备份有副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群
<a name="backups-manual-CLI-example2"></a>

以下Amazon CLI操作`bkup-20150515`从 Valkey 或 Redis OSS（已禁用集群模式）集群创建备份。`myNonClusteredRedis`此备份有一个或多个只读副本。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-snapshot \
    --cache-cluster-id myNonClusteredRedis-001 \
    --snapshot-name bkup-20150515
```

对于 Windows：

```
aws elasticache create-snapshot ^
    --cache-cluster-id myNonClusteredRedis-001 ^
    --snapshot-name bkup-20150515
```

**示例输出：备份有副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群**

此操作的输出将类似于下文。

```
{
    "Snapshot": {
        "Engine": "redis", 
        "CacheParameterGroupName": "default.redis6.x", 
        "VpcId": "vpc-91280df6", 
        "CacheClusterId": "myNonClusteredRedis-001", 
        "SnapshotRetentionLimit": 0, 
        "NumCacheNodes": 1, 
        "SnapshotName": "bkup-20150515", 
        "CacheClusterCreateTime": "2017-01-12T18:59:48.048Z", 
        "AutoMinorVersionUpgrade": true, 
        "PreferredAvailabilityZone": "us-east-1c", 
        "SnapshotStatus": "creating", 
        "SnapshotSource": "manual", 
        "SnapshotWindow": "08:30-09:30", 
        "EngineVersion": "6.0", 
        "NodeSnapshots": [
            {
                "CacheSize": "", 
                "CacheNodeId": "0001", 
                "CacheNodeCreateTime": "2017-01-12T18:59:48.048Z"
            }
        ], 
        "CacheSubnetGroupName": "default", 
        "Port": 6379, 
        "PreferredMaintenanceWindow": "wed:07:30-wed:08:30", 
        "CacheNodeType": "cache.m3.2xlarge",
        "DataTiering": "disabled"
    }
}
```

### 示例 3：备份 Valkey 或 Redis OSS 集群（已启用集群模式）
<a name="backups-manual-CLI-example3"></a>

以下Amazon CLI操作`bkup-20150515`从 Valkey 或 Redis OSS（已启用集群模式）集群创建备份。`myClusteredRedis`请注意使用 `--replication-group-id` 而非 `--cache-cluster-id` 来标识源。另请注意，如果存在副本节点， ElastiCache 则使用副本节点进行备份，如果副本节点不可用，则将默认为主节点。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-snapshot \
    --replication-group-id myClusteredRedis \
    --snapshot-name bkup-20150515
```

对于 Windows：

```
aws elasticache create-snapshot ^
    --replication-group-id myClusteredRedis ^
    --snapshot-name bkup-20150515
```

**示例输出：备份 Valkey 或 Redis OSS（已启用集群模式）集群**

此操作的输出将类似于下文。

```
{
    "Snapshot": {
        "Engine": "redis", 
        "CacheParameterGroupName": "default.redis6.x.cluster.on", 
        "VpcId": "vpc-91280df6", 
        "NodeSnapshots": [
            {
                "CacheSize": "", 
                "NodeGroupId": "0001"
            }, 
            {
                "CacheSize": "", 
                "NodeGroupId": "0002"
            }
        ], 
        "NumNodeGroups": 2, 
        "SnapshotName": "bkup-20150515", 
        "ReplicationGroupId": "myClusteredRedis", 
        "AutoMinorVersionUpgrade": true, 
        "SnapshotRetentionLimit": 1, 
        "AutomaticFailover": "enabled", 
        "SnapshotStatus": "creating", 
        "SnapshotSource": "manual", 
        "SnapshotWindow": "10:00-11:00", 
        "EngineVersion": "6.0", 
        "CacheSubnetGroupName": "default", 
        "ReplicationGroupDescription": "2 shards 2 nodes each", 
        "Port": 6379, 
        "PreferredMaintenanceWindow": "sat:03:30-sat:04:30", 
        "CacheNodeType": "cache.r3.large",
        "DataTiering": "disabled"
    }
}
```

### 相关主题
<a name="backups-manual-CLI-see-also"></a>

有关更多信息，请参阅 *Amazon CLI命令参考*中的 [create-snapshot](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-snapshot.html)。

## 使用创建备份Amazon CloudFormation
<a name="backups-CFN"></a>

您可以使用Amazon CloudFormation或属性创建 ElastiCache Redis OSS 或 Valkey 缓存的`AWS::ElastiCache::ServerlessCache`备份。`AWS::ElastiCache::ReplicationGroup`

**使用 `AWS::ElastiCache::ServerlessCache` 资源**

使用此 AWS::ElastiCache::ServerlessCache 资源创建备份：

```
Resources:
                    iotCatalog:
                        Type: AWS::ElastiCache::ServerlessCache
                            Properties:
                            ...
                            ServerlessCacheName: "your-cache-name"
                            Engine: "redis"
                            CacheUsageLimits
```

**使用 AWS::ElastiCache::ReplicationGroup 资源**

使用 `AWS::ElastiCache::ReplicationGroup` 资源：

```
Resources:
                    iotCatalog:
                        Type: AWS::ElastiCache::ReplicationGroup 
                            Properties:
                            ...
                            ReplicationGroupDescription: "Description of your replication group"
                            Engine: "redis"
                            CacheNodeType
                            NumCacheClusters
                            AutomaticFailoverEnabled
                            AtRestEncryptionEnabled
```

# 创建最终备份
<a name="backups-final"></a>

您可以使用 ElastiCache 控制台Amazon CLI、或 ElastiCache API 创建最终备份。

## 创建最终备份（控制台）
<a name="backups-final-CON"></a>

当你使用控制台删除 Valkey、Memcached 或 Redis OSS 无服务器缓存或基于 Valkey 或 Redis OSS 节点的集群时，你可以创建最终备份。 ElastiCache 

要在删除缓存时创建最终备份，请在删除对话框上选择**创建备份**下的**是**，并指定备份的名称。

**相关主题**
+ [使用Amazon Web Services 管理控制台](Clusters.Delete.md#Clusters.Delete.CON)
+ [删除复制组（控制台）](Replication.DeletingRepGroup.md#Replication.DeletingRepGroup.CON)

## 创建最终备份 (Amazon CLI)
<a name="backups-final-CLI"></a>

您可以在删除缓存时使用Amazon CLI创建最终备份。

**Topics**
+ [

### 删除 Valkey 缓存、Memcached 无服务器缓存或 Redis OSS 缓存时
](#w2aac24b7c29b7b1b7)
+ [

### 删除没有读取副本的 Valkey 或 Redis OSS 集群时
](#w2aac24b7c29b7b1b9)
+ [

### 删除有读取副本的 Valkey 或 Redis OSS 集群时
](#w2aac24b7c29b7b1c11)

### 删除 Valkey 缓存、Memcached 无服务器缓存或 Redis OSS 缓存时
<a name="w2aac24b7c29b7b1b7"></a>

要创建最终备份，请使用带有以下参数的`delete-serverless-cache`Amazon CLI操作。
+ `--serverless-cache-name`：要删除的缓存的名称。
+ `--final-snapshot-name` – 备份的名称。

以下代码在删除缓存 `myserverlesscache` 时创建最终备份 `bkup-20231127-final`。

对于 Linux、macOS 或 Unix：

```
aws elasticache delete-serverless-cache \
        --serverless-cache-name myserverlesscache \
        --final-snapshot-name bkup-20231127-final
```

对于 Windows：

```
aws elasticache delete-serverless-cache ^
        --serverless-cache-name myserverlesscache ^
        --final-snapshot-name bkup-20231127-final
```

有关更多信息，请参阅《Amazon CLI Command Reference》**中的 [delete-serverless-cache](https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-serverless-cache.html)。

### 删除没有读取副本的 Valkey 或 Redis OSS 集群时
<a name="w2aac24b7c29b7b1b9"></a>

要为没有只读副本的基于节点的集群创建最终备份，请使用带有以下参数的`delete-cache-cluster`Amazon CLI操作。
+ `--cache-cluster-id` – 要删除的集群的名称。
+ `--final-snapshot-identifier` – 备份的名称。

以下代码在删除集群 `myRedisCluster` 时创建最终备份 `bkup-20150515-final`。

对于 Linux、macOS 或 Unix：

```
aws elasticache delete-cache-cluster \
        --cache-cluster-id myRedisCluster \
        --final-snapshot-identifier bkup-20150515-final
```

对于 Windows：

```
aws elasticache delete-cache-cluster ^
        --cache-cluster-id myRedisCluster ^
        --final-snapshot-identifier bkup-20150515-final
```

有关更多信息，请参阅《Amazon CLI Command Reference》**中的 [delete-cache-cluster](https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-cache-cluster.html)。

### 删除有读取副本的 Valkey 或 Redis OSS 集群时
<a name="w2aac24b7c29b7b1c11"></a>

要在删除复制组时创建最终备份，请使用带有以下参数的`delete-replication-group`Amazon CLI操作：
+ `--replication-group-id` – 要删除的复制组的名称。
+ `--final-snapshot-identifier` – 最终备份的名称。

以下代码在删除复制组 `myReplGroup` 时创建最终备份 `bkup-20150515-final`。

对于 Linux、macOS 或 Unix：

```
aws elasticache delete-replication-group \
        --replication-group-id myReplGroup \
        --final-snapshot-identifier bkup-20150515-final
```

对于 Windows：

```
aws elasticache delete-replication-group ^
        --replication-group-id myReplGroup ^
        --final-snapshot-identifier bkup-20150515-final
```

有关更多信息，请参阅**《Amazon CLI命令参考》中的 [delete-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-replication-group.html)。

# 描述备份
<a name="backups-describing"></a>

以下过程演示如何显示备份列表。如果需要，您还可以查看特定备份的详细信息。

## 描述备份（控制台）
<a name="backups-describing-CON"></a>

**要显示备份，请使用Amazon Web Services 管理控制台**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 从导航窗格中，选择 **Backups**（备份）。

1. 要查看特定备份的详细信息，请选择备份名称左侧的复选框。

## 描述无服务器备份（Amazon CLI）
<a name="backups-describing-serverless-CLI"></a>

要显示无服务器备份列表以及（可选）特定备份的详细信息，请使用 `describe-serverless-cache-snapshots` CLI 操作。

**示例**

以下操作使用参数 `--max-records` 列出与您的账户关联的最多 20 个备份。忽略参数 `--max-records` 最多可列出 50 个备份。

```
aws elasticache describe-serverless-cache-snapshots --max-records 20
```

以下操作使用参数 `--serverless-cache-name`，以仅列出与缓存 `my-cache` 关联的备份。

```
aws elasticache describe-serverless-cache-snapshots --serverless-cache-name my-cache
```

以下操作使用参数 `--serverless-cache-snapshot-name` 显示备份 `my-backup` 的详细信息。

```
aws elasticache describe-serverless-cache-snapshots --serverless-cache-snapshot-name my-backup
```

有关更多信息，请参阅《Amazon CLI命令参考》[describe-serverless-cache-snapshots](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-serverless-cache-snapshots.html)中的。

## 描述基于节点的集群备份（Amazon CLI）
<a name="backups-describing-CLI"></a>

要显示基于节点的集群备份列表及特定备份的可选详情，请使用 `describe-snapshots` CLI 操作。

**示例**

以下操作使用参数 `--max-records` 列出与您的账户关联的最多 20 个备份。忽略参数 `--max-records` 最多可列出 50 个备份。

```
aws elasticache describe-snapshots --max-records 20
```

以下操作使用参数 `--cache-cluster-id` 仅列出与集群 `my-cluster` 关联的备份。

```
aws elasticache describe-snapshots --cache-cluster-id my-cluster
```

以下操作使用参数 `--snapshot-name` 显示备份 `my-backup` 的详细信息。

```
aws elasticache describe-snapshots --snapshot-name my-backup
```

有关更多信息，请参阅《命令参考》中的 d [escribe-snapsh](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-snapshots.html) ots Amazon CLI。

# 复制备份
<a name="backups-copying"></a>

您可以创建任意备份的副本，无论它是自动还是手动创建的。您也可以导出备份，以便从外部进行访问 ElastiCache。有关导出备份的指南，请参阅[导出备份](backups-exporting.md)。

以下步骤演示如何复制备份。

## 复制备份（控制台）
<a name="backups-copying-CON"></a>

**复制备份（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 要查看您的备份列表，请从左侧导航窗格中，选择 **Backups**。

1. 从备份列表中，选择要复制的备份名称左侧的复选框。

1. 选择**操作**和**复制**。

1. 在 **New backup name** 框中键入新备份的名称。

1. 选择**复制**。

## 复制无服务器备份（Amazon CLI）
<a name="backups-copying-CLI"></a>

要复制无服务器缓存的备份，请使用 `copy-serverless-cache-snapshot` 操作。

**Parameters**
+ `--source-serverless-cache-snapshot-name` – 要复制的备份的名称。
+ `--target-serverless-cache-snapshot-name` – 备份副本的名称。

以下示例复制自动备份。

对于 Linux、macOS 或 Unix：

```
aws elasticache copy-serverless-cache-snapshot \
    --source-serverless-cache-snapshot-name automatic.my-cache-2023-11-27-03-15 \
    --target-serverless-cache-snapshot-name my-backup-copy
```

对于 Windows：

```
aws elasticache copy-serverless-cache-snapshot ^
    --source-serverless-cache-snapshot-name automatic.my-cache-2023-11-27-03-15 ^
    --target-serverless-cache-snapshot-name my-backup-copy
```

有关更多信息，请参阅*Amazon CLI* 中的 [https://docs.amazonaws.cn/cli/latest/reference/elasticache/copy-serverless-cache-snapshot.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/copy-serverless-cache-snapshot.html)。

## 复制基于节点的集群备份（Amazon CLI）
<a name="backups-copying-self-designed-CLI"></a>

要复制基于节点的集群的备份，请使用 `copy-snapshot` 操作。

**Parameters**
+ `--source-snapshot-name` – 要复制的备份的名称。
+ `--target-snapshot-name` – 备份副本的名称。
+ `--target-bucket` – 为导出备份预留。在复制备份时，请勿使用此参数。有关更多信息，请参阅 [导出备份](backups-exporting.md)。

以下示例复制自动备份。

对于 Linux、macOS 或 Unix：

```
aws elasticache copy-snapshot  \
    --source-snapshot-name automatic.my-redis-primary-2014-03-27-03-15 \
    --target-snapshot-name amzn-s3-demo-bucket
```

对于 Windows：

```
aws elasticache copy-snapshot ^
    --source-snapshot-name automatic.my-redis-primary-2014-03-27-03-15 ^
    --target-snapshot-name amzn-s3-demo-bucket
```

有关更多信息，请参阅*Amazon CLI* 中的 [https://docs.amazonaws.cn/cli/latest/reference/elasticache/copy-snapshot.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/copy-snapshot.html)。

# 导出备份
<a name="backups-exporting"></a>

亚马逊 ElastiCache 支持将您 ElastiCache 的 Redis OSS 备份导出到亚马逊简单存储服务 (Amazon S3) 存储桶，这样您就可以从外部访问该存储桶。 ElastiCache您可以使用 ElastiCache 控制台Amazon CLI、或 ElastiCache API 导出备份。

如果您需要在其他Amazon区域启动集群，则导出备份会很有帮助。您可以将数据导出到一个Amazon区域，将.rdb 文件复制到新Amazon区域，然后使用该.rdb 文件为新缓存做种子，而不必等待新集群通过使用进行填充。有关为新集群做种的信息，请参阅 [教程：使用外部创建的备份为新的基于节点的集群制作种子](backups-seeding-redis.md)。您可能希望导出缓存数据的另一个原因是将 .rdb 文件用于脱机处理。

**重要**  
 ElastiCache 备份和您要将其复制到的 Amazon S3 存储桶必须位于同一Amazon区域。  
尽管复制到 Amazon S3 存储桶的备份已加密，但我们强烈建议您不要将要存储备份的 Amazon S3 存储桶的访问权限授予他人。
使用数据分层功能的集群不支持将备份导出到 Amazon S3。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。
导出备份适用于：基于节点的 Valkey 集群、基于节点的 Redis OSS 集群以及 Valkey、Memcached 和 Redis OSS 无服务器缓存。导出备份不适用于基于节点的 Memcached 集群。

在将备份导出到 Amazon S3 存储桶之前，您必须将 Amazon S3 存储桶与备份位于同一Amazon区域。授予对存储桶的 ElastiCache 访问权限。前两个步骤向您演示了如何执行此操作。

## 创建 Amazon S3 存储桶
<a name="backups-exporting-create-s3-bucket"></a>

以下步骤使用 Amazon S3 控制台创建用于导出和存储 ElastiCache 备份的 Amazon S3 存储桶。

**创建 Amazon S3 存储桶**

1. 登录Amazon Web Services 管理控制台并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择**创建存储桶**。

1. 在 **Create a Bucket - Select a Bucket Name and Region** 中，执行以下操作：

   1. 在 **Bucket Name（存储桶名称）**中键入 Amazon S3 存储桶的名称。

      Amazon S3 存储桶的名称必须符合 DNS 标准。否则，将 ElastiCache 无法访问您的备份文件。DNS 合规性规则包括：
      + 名称的长度必须为至少 3 个字符，且不能超过 63 个字符。
      + 名称必须是由句点（.）分隔的一个或多个标签组成的系列，其中每个标签：
        + 以小写字母或数字开头。
        + 以小写字母或数字结尾。
        + 仅包含小写字母、数字和短划线。
      + 名称不能采用 IP 地址格式（例如 192.0.2.0）。

   1. 从**区域**列表中，为您的 Amazon S3 存储桶选择一个Amazon区域。此Amazon区域必须与您要导出的 ElastiCache 备份位于同一Amazon区域。

   1. 选择**创建**。

有关创建 Amazon S3 存储桶的更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[创建存储桶](https://docs.amazonaws.cn/AmazonS3/latest/userguide/CreatingaBucket.html)。

## 授予对您的 Amazon S3 存储桶的 ElastiCache 访问权限
<a name="backups-exporting-grant-access"></a>

 ElastiCache 为了能够将快照复制到 Amazon S3 存储桶，您必须更新您的 IAM 存储桶策略以授予对该存储桶的 ElastiCache 访问权限。

**警告**  
虽然复制到 Amazon S3 存储桶的备份已加密，但是对您的 Amazon S3 存储桶拥有访问权限的任何人都可以访问您的数据。因此，我们强烈建议您设置 IAM 策略来防止未经授权访问此 Amazon S3 存储桶。有关更多信息，请参阅《Amazon S3 用户指南》**中的[管理访问权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-access-control.html)。

要创建 Amazon S3 存储桶的适当权限，请执行以下步骤。

**授予 ElastiCache 对 S3 存储桶的访问权限**

1. 登录Amazon Web Services 管理控制台并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择要将备份复制到其中的 Amazon S3 存储桶的名称。这应该是您在[创建 Amazon S3 存储桶](#backups-exporting-create-s3-bucket)中创建的 S3 存储桶。

1. 选择 **Permissions**（权限）选项卡，然后在 **Permissions**（权限）下，选择 **Access control list（ACL）**[访问控制列表（ACL）]，再选择 **Edit**（编辑）。

1. 使用以下选项为被授权者添加规范 ID `540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353`：
   + **Objects: List, Write**（对象：列出、写入）
   + **Bucket ACL: Read, Write**（存储桶 ACL：读取、写入）
**注意**  
对于太平洋夏令时 GovCloud 区域，规范 ID 为。`40fa568277ad703bd160f66ae4f83fc9dfdfd06c2f1b5060ca22442ac3ef8be6`
对于俄勒冈州立大学 GovCloud 区域，规范 ID 为。`c54286759d2a83da9c480405349819c993557275cf37d820d514b42da6893f5c`

1. 选择**保存**。

## 导出备 ElastiCache 份
<a name="backups-exporting-procedures"></a>

现在，您已经创建了 S3 存储桶并授予了访问该存储桶的 ElastiCache 权限。接下来，您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 将快照导出到控制台。

以下是更新策略具体形式的示例。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "Policy15397346",
    "Statement": [
        {
            "Sid": "Stmt15399484",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::hkg-elasticache-backup",
                "arn:aws:s3:::hkg-elasticache-backup/*"
            ]
        }
    ]
}
```

------

对于选择加入型区域，以下是 S3 存储桶的更新后 IAM 策略具体形式的示例。[此示例使用亚太地区（香港）区域。]

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "Policy15397346",
    "Statement": [
        {
            "Sid": "Stmt15399483",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::hkg-elasticache-backup",
                "arn:aws:s3:::hkg-elasticache-backup/*"
            ]
        },
        {
            "Sid": "Stmt15399484",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::hkg-elasticache-backup",
                "arn:aws:s3:::hkg-elasticache-backup/*"
            ]
        }
    ]
}
```

------

### 导出备 ElastiCache 份（控制台）
<a name="backups-exporting-CON"></a>

以下步骤使用 ElastiCache 控制台将备份导出到 Amazon S3 存储桶，以便您可以从外部访问该存储桶 ElastiCache。Amazon S3 存储桶必须与 ElastiCache 备份位于同一Amazon区域。

**将 ElastiCache 备份导出到 Amazon S3 存储桶**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 要查看您的备份列表，请从左侧导航窗格中，选择 **Backups**。

1. 从备份列表中，选择要导出的备份名称左侧的复选框。

1. 选择**复制**。

1. 在 **Create a Copy of the Backup?（创建备份副本?）**中，执行以下操作：

   1. 在 **New backup name** 框中键入新备份的名称。

      名称必须在 1 到 1000 个字符之间，并能够以 UTF-8 编码。

      ElastiCache 将实例标识符和`.rdb`添加到您在此处输入的值中。例如，如果您输入 `my-exported-backup`，则 ElastiCache 创建 `my-exported-backup-0001.rdb`。

   1. 从 **Target S3 Location（目标 S3 位置）**列表中，选择要将备份复制到其中的 Amazon S3 存储桶（您在 [创建 Amazon S3 存储桶](#backups-exporting-create-s3-bucket) 中创建的存储桶）的名称。

      **目标 S3 位置**必须是备份Amazon区域中具有以下权限的 Amazon S3 存储桶，导出过程才能成功。
      + 对象访问 – **Read（读取）**和 **Write（写入）**。
      + 权限访问 – **Read（读取）**。

      有关更多信息，请参阅 [授予对您的 Amazon S3 存储桶的 ElastiCache 访问权限](#backups-exporting-grant-access)。

   1. 选择**复制**。

**注意**  
如果您的 S3 存储桶没有 ElastiCache 向其导出备份所需的权限，则会收到以下错误消息之一。返回到[授予对您的 Amazon S3 存储桶的 ElastiCache 访问权限](#backups-exporting-grant-access)，添加指定权限并重试导出备份的操作。  
ElastiCache 尚未被授予 S3 存储桶上的 %s 读取权限。  
**解决方案：**在存储桶上添加 Read 权限。
ElastiCache 尚未被授予 S3 存储桶上的 %s 写入权限。  
**解决方案：**在存储桶上添加 Write 权限。
ElastiCache 尚未被授予 S3 存储桶上的 READ\$1ACP 权限 %s。  
**解决方案：**为存储桶的权限访问添加 **Read**。

如果您想将备份复制到其他Amazon区域，请使用 Amazon S3 将其复制。有关更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[复制对象](https://docs.amazonaws.cn/AmazonS3/latest/userguide/MakingaCopyofanObject.html)。

### 导出 ElastiCache 无服务器备份 ()Amazon CLI
<a name="backups-exporting-CLI"></a>

**导出无服务器缓存的备份**

使用带有以下参数的 `export-serverless-cache-snapshot` CLI 操作将备份导出到 Amazon S3 存储桶：

**Parameters**
+ `--serverless-cache-snapshot-name` – 要复制的备份的名称。
+ `--s3-bucket-name` – 您要将备份导出到其中的 Amazon S3 存储桶的名称。在指定存储桶中生成备份的副本。

  `--s3-bucket-name`必须是备份Amazon区域中具有以下权限的 Amazon S3 存储桶，导出过程才能成功。
  + 对象访问 – **Read（读取）**和 **Write（写入）**。
  + 权限访问 – **Read（读取）**。

以下操作将备份复制到 my-s3-bucket。

对于 Linux、macOS 或 Unix：

```
aws elasticache export-serverless-cache-snapshot \
    --serverless-cache-snapshot-name automatic.my-redis-2023-11-27 \
    --s3-bucket-name my-s3-bucket
```

对于 Windows：

```
aws elasticache export-serverless-cache-snapshot ^
    --serverless-cache-snapshot-name automatic.my-redis-2023-11-27 ^
    --s3-bucket-name my-s3-bucket
```

### 导出基于节点的 ElastiCache 集群备份 ()Amazon CLI
<a name="backups-exporting-self-designed-CON"></a>

**导出基于节点的集群的备份**

使用带有以下参数的 `copy-snapshot` CLI 操作将备份导出到 Amazon S3 存储桶：

**Parameters**
+ `--source-snapshot-name` – 要复制的备份的名称。
+ `--target-snapshot-name` – 备份副本的名称。

  名称必须在 1 到 1000 个字符之间，并能够以 UTF-8 编码。

  ElastiCache 将实例标识符和`.rdb`添加到您在此处输入的值中。例如，如果您输入 `my-exported-backup`，则 ElastiCache 创建 `my-exported-backup-0001.rdb`。
+ `--target-bucket` – 您要将备份导出到其中的 Amazon S3 存储桶的名称。在指定存储桶中生成备份的副本。

  `--target-bucket`必须是备份Amazon区域中具有以下权限的 Amazon S3 存储桶，导出过程才能成功。
  + 对象访问 – **Read（读取）**和 **Write（写入）**。
  + 权限访问 – **Read（读取）**。

  有关更多信息，请参阅 [授予对您的 Amazon S3 存储桶的 ElastiCache 访问权限](#backups-exporting-grant-access)。

以下操作将备份复制到 my-s3-bucket。

对于 Linux、macOS 或 Unix：

```
aws elasticache copy-snapshot \
    --source-snapshot-name automatic.my-redis-primary-2016-06-27-03-15 \
    --target-snapshot-name my-exported-backup \
    --target-bucket my-s3-bucket
```

对于 Windows：

```
aws elasticache copy-snapshot ^
    --source-snapshot-name automatic.my-redis-primary-2016-06-27-03-15 ^
    --target-snapshot-name my-exported-backup ^
    --target-bucket my-s3-bucket
```

# 从备份还原到新缓存
<a name="backups-restoring"></a>

您可以将现有的 Valkey 备份还原到新的 Valkey 缓存或基于节点的集群中，也可以将现有的 Redis OSS 备份还原到新的 Redis OSS 缓存或基于节点的集群中。您还可以将现有的 Memcached 无服务器缓存备份还原到新的 Memcached 无服务器缓存中。

## 将备份还原到无服务器缓存（控制台）
<a name="backups-restoring-CON"></a>

**注意**  
ElastiCache Serverless 支持与 Valkey 7.2 及更高版本兼容的 RDB 文件，以及 5.0 和最新可用版本之间的 Redis OSS 版本。

**将备份还原到无服务器缓存（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 从导航窗格中，选择 **Backups**（备份）。

1. 在备份列表中，选中要还原的备份名称左侧的框。

1. 选择**操作**，然后选择**还原**。

1. 输入新无服务器缓存的名称和可选描述。

1. 单击**创建**以创建新的缓存并从备份中导入数据。

## 将备份还原到基于节点的集群中（控制台）
<a name="backups-restoring-self-designedCON"></a>

**将备份还原到基于节点的集群中（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 从导航窗格中，选择 **Backups**（备份）。

1. 在备份列表中，选择您要从中进行还原的备份名称左侧的复选框。

1. 选择**操作**，然后选择**还原**。

1. 选择**基于节点的缓存**并自定义集群设置，例如节点类型、大小、分片数量、副本、可用区放置和安全设置。

1. 单击**创建**以创建新的基于节点的集群，并从备份中导入数据。

## 将备份还原到无服务器缓存（Amazon CLI）
<a name="backups-restoring-CLI"></a>

**注意**  
ElastiCache Serverless 支持与 Valkey 7.2 及更高版本兼容的 RDB 文件，以及 5.0 和最新可用版本之间的 Redis OSS 版本。

**将备份还原到新的无服务器缓存（Amazon CLI）**

以下Amazon CLI示例使用备份创建新缓存`create-serverless-cache`并从备份中导入数据。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-serverless-cache \

    --serverless-cache-name CacheName \
    --engine redis
    --snapshot-arns-to-restore Snapshot-ARN
```

对于 Windows：

```
aws elasticache create-serverless-cache ^

    --serverless-cache-name CacheName ^
    --engine redis ^
    --snapshot-arns-to-restore Snapshot-ARN
```

# 删除备份
<a name="backups-deleting"></a>

自动备份会在其保留期限过期时自动删除。如果您删除某个集群，则会删除其所有的自动备份。如果您删除某个复制组，则也会删除该组中集群的所有自动备份。

ElastiCache 提供了删除 API 操作，允许您随时删除备份，无论备份是自动创建还是手动创建。由于手动备份没有保留期限，所以手动删除是移除备份的唯一方法。

您可以使用 ElastiCache 控制台Amazon CLI、或 ElastiCache API 删除备份。

## 删除备份（控制台）
<a name="backups-deleting-CON"></a>

以下过程使用 ElastiCache 控制台删除备份。

**删除备份**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择**备份**。

   此时会显示“Backups”屏幕，其中包含您的备份的列表。

1. 选择要删除的备份名称左侧的复选框。

1. 选择**删除**。

1. 如果要删除此备份，在 **Delete Backup** 确认屏幕中选择 **Delete**。状态将变为*正在删除*。

## 删除无服务器备份（Amazon CLI）
<a name="backups-deleting-serverless-CLI"></a>

使用带有以下参数的删除快照Amazon CLI操作来删除无服务器备份。
+ `--serverless-cache-snapshot-name` – 要删除的备份的名称。

以下代码删除备份 `myBackup`。

```
aws elasticache delete-serverless-cache-snapshot --serverless-cache-snapshot-name myBackup
```

有关更多信息，请参阅《Amazon CLI Command Reference》**中的 [delete-serverless-cache-snapshot](https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-serverless-cache-snapshot.html)。

## 删除基于节点的集群备份（Amazon CLI）
<a name="backups-deleting-CLI"></a>

使用带有以下参数的删除快照Amazon CLI操作来删除基于节点的集群备份。
+ `--snapshot-name` – 要删除的备份的名称。

以下代码删除备份 `myBackup`。

```
aws elasticache delete-snapshot --snapshot-name myBackup
```

有关更多信息，请参阅 *Amazon CLI命令参考*中的 [delete-snapshot](https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-snapshot.html)。

# 标记备份
<a name="backups-tagging"></a>

您可以标签形式将自己的元数据分配给各个备份。标签可让您按各种标准（例如用途、拥有者或环境）对备份进行分类。这在您具有相同类型的很多资源时会很有用 – 您可以根据分配给特定资源的标签快速识别该资源。有关更多信息，请参阅 [您可以为之添加标签的资源](Tagging-Resources.md#Tagging-your-resources)。

成本分配标签是一种通过按标签值对发票上的费用进行分组来跨多种 Amazon 服务跟踪成本的方式。要了解有关成本分配标签的更多信息，请参阅[使用成本分配标签](https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。

通过使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API，您可以在备份上添加、列出、修改、删除或复制成本分配标签。有关更多信息，请参阅 [使用成本分配标签监控成本](Tagging.md)。

# 教程：使用外部创建的备份为新的基于节点的集群制作种子
<a name="backups-seeding-redis"></a>

创建新的 Valkey 或 Redis OSS 基于节点的集群时，您可以使用 Valkey 或 Redis OSS .rdb 备份文件中的数据为其制作种子。如果您目前正在管理外部的 Valkey 或 Redis OSS 实例， ElastiCache 并希望使用现有的 Valkey 或 Redis OSS 数据填充新的基于 Redis OSS 节点的集群，则 ElastiCache 为集群播种很有用。

要从亚马逊内部创建的 Valkey 或 Redis OSS 备份中播种新的基于 Valkey 或 Redis OSS 节点的集群，请参阅。 ElastiCache [从备份还原到新缓存](backups-restoring.md)

使用 Valkey 或 Redis OSS .rdb 文件为新的基于节点的集群制作种子时，您可以执行以下操作：
+ 从未分区的集群升级到运行 Redis OSS v3.2.4 的 Valkey 或 Redis OSS（已启用集群模式）基于节点的集群。
+ 指定新的基于节点的集群中的分片（在 API 和 CLI 中称为节点组）数量。此数量可以与用于创建备份文件的基于节点的集群中的分片数量不同。
+ 为新的基于节点的集群指定不同的节点类型 – 大于或小于创建备份的集群中使用的节点类型。如果您决定缩减到较小的节点类型，则必须确保新节点类型拥有足量内存以适应您的数据和 Valkey 或 Redis OSS 开销。有关更多信息，请参阅 [确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)。
+ 以不同于创建备份文件时所用集群中的方法将您的键分发到新的 Valkey 或 Redis OSS（已启用集群模式）集群的槽中。

**注意**  
无法从 Valkey 或 Redis OSS（已启用集群模式）集群中创建的 .rdb 文件为 Valkey 或 Redis OSS（已禁用集群模式）集群制作种子。

**重要**  
您必须确保 Valkey 或 Redis OSS 备份数据不超过节点的资源容量。例如，您无法将具有 5GB Valkey 或 Redis OSS 数据的 .rdb 文件上传到具有 2.9GB 内存的 cache.m3.medium 节点。  
如果备份太大，则所生成集群的状态将为 `restore-failed`。如果发生这种情况，您必须删除集群，从头再来。  
有关节点类型和规格的完整列表，请参阅[特定于 Redis OSS 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.NodeSpecific)和 [Amazon ElastiCache 产品功能和详情](https://www.amazonaws.cn/elasticache/details/)。
您只能使用 Amazon S3 服务器端加密（SSE-S3）对 Valkey 或 Redis OSS .rdb 文件进行加密。有关更多信息，请参阅[使用服务器端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/dev/serv-side-encryption.html)。

接下来，你可以找到一些主题，这些主题将引导你完成将集群从 Valkey 或 Redis OSS ElastiCache 的外部迁移到适用于 Redis OSS ElastiCache 的集群。

**Topics**
+ [

## 步骤 1：创建 Valkey 或 Redis OSS 备份
](#backups-seeding-redis-create-backup)
+ [

## 步骤 2：创建 Amazon S3 存储桶和文件夹
](#backups-seeding-redis-create-s3-bucket)
+ [

## 步骤 3：将备份上传到 Amazon S3
](#backups-seeding-redis-upload)
+ [

## 步骤 4：授予对.rdb 文件的 ElastiCache 读取权限
](#backups-seeding-redis-grant-access)

**Topics**
+ [

## 步骤 1：创建 Valkey 或 Redis OSS 备份
](#backups-seeding-redis-create-backup)
+ [

## 步骤 2：创建 Amazon S3 存储桶和文件夹
](#backups-seeding-redis-create-s3-bucket)
+ [

## 步骤 3：将备份上传到 Amazon S3
](#backups-seeding-redis-upload)
+ [

## 步骤 4：授予对.rdb 文件的 ElastiCache 读取权限
](#backups-seeding-redis-grant-access)

## 步骤 1：创建 Valkey 或 Redis OSS 备份
<a name="backups-seeding-redis-create-backup"></a>

**创建 Valkey 或 Redis OSS 备份来 ElastiCache 为你的 Redis OSS 实例做种子**

1. 连接到现有 Valkey 或 Redis OSS 实例。

1. 运行 `BGSAVE` 或 `SAVE` 操作以创建备份。记录 .rdb 文件的位置。

   `BGSAVE` 是异步的，在处理期间不阻止其他客户端。有关更多信息，请参阅 Valkey 网站上的 [BGSAVE](https://valkey.io/commands/bgsave)。

   `SAVE` 同步的，在完成之前会阻止其他进程。有关更多信息，请参阅 Valkey 网站上的 [SAVE](https://valkey.io/commands/save)。

有关创建备份的其他信息，请参阅 Valkey 网站上的[持久化](https://valkey.io/topics/persistence)。

## 步骤 2：创建 Amazon S3 存储桶和文件夹
<a name="backups-seeding-redis-create-s3-bucket"></a>

创建备份文件后，您需要将其上传到 Amazon S3 存储桶中的文件夹。要执行该操作，您必须先拥有 Amazon S3 存储桶以及该存储桶中的文件夹。如果您已有 Amazon S3 存储桶和文件夹并具备相应权限，则可以跳到 [步骤 3：将备份上传到 Amazon S3](#backups-seeding-redis-upload)。

**创建 Amazon S3 存储桶**

1. 登录Amazon Web Services 管理控制台并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 按照 *Amazon Simple Storage Service 用户指南*中的[创建存储桶](https://docs.amazonaws.cn/AmazonS3/latest/userguide/create-bucket.html)的说明，创建 Amazon S3 存储桶。

   Amazon S3 存储桶的名称必须符合 DNS 标准。否则，将 ElastiCache 无法访问您的备份文件。DNS 合规性规则包括：
   + 名称的长度必须为至少 3 个字符，且不能超过 63 个字符。
   + 名称必须是由句点（.）分隔的一个或多个标签组成的系列，其中每个标签：
     + 以小写字母或数字开头。
     + 以小写字母或数字结尾。
     + 仅包含小写字母、数字和短划线。
   + 名称不能采用 IP 地址格式（例如 192.0.2.0）。

   您必须在与新 ElastiCache 的 Redis OSS 集群相同的Amazon区域中创建 Amazon S3 存储桶。这种方法可确保从 Amazon S3 ElastiCache 读取您的.rdb 文件时达到最高的数据传输速度。
**注意**  
为了使您的数据尽可能安全，请尽可能限制您的 Amazon S3 存储桶的权限。同时，权限仍然需要允许存储桶及其内容用于为新的 Valkey 或 Redis OSS 集群制作种子。

**向 Amazon S3 存储桶添加文件夹**

1. 登录Amazon Web Services 管理控制台并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择将 .rdb 文件上传到的存储桶的名称。

1. 请选择 **Create folder**（创建文件夹）。

1. 输入新文件夹的名称。

1. 选择**保存**。

   记录存储桶名称和文件夹名称。

## 步骤 3：将备份上传到 Amazon S3
<a name="backups-seeding-redis-upload"></a>

现在，上传您在[步骤 1：创建 Valkey 或 Redis OSS 备份](#backups-seeding-redis-create-backup)中创建的 .rdb 文件。将其上传到您在 [步骤 2：创建 Amazon S3 存储桶和文件夹](#backups-seeding-redis-create-s3-bucket) 中创建的 Amazon S3 存储桶和文件夹。有关此任务的更多信息，请参阅[将对象添加到存储桶](https://docs.amazonaws.cn/AmazonS3/latest/userguide/upload-objects.html)。在步骤 2 和 3 之间，选择您创建的文件夹的名称。

**将 .rdb 文件上传到 Amazon S3 文件夹**

1. 登录Amazon Web Services 管理控制台并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择您在步骤 2 中创建的 Amazon S3 存储桶的名称。

1. 选择您在步骤 2 中创建的文件夹的名称。

1. 选择**上传**。

1. 选择**添加文件**。

1. 浏览查找要上传的一个或多个文件，然后选择文件。要选择多个文件，请在选择每个文件名时按住 Ctrl 键。

1. 选择 **Open（打开）**。

1. 确认 **Upload** 对话框中列出了正确的文件，然后选择 **Upload**。

记下 .rdb 文件的路径。例如，如果存储桶名称为 `myBucket` 并且路径为 `myFolder/redis.rdb`，请输入 `myBucket/myFolder/redis.rdb`。使用此备份中的数据为新集群做种时需要此路径。

有关更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[存储桶限制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/BucketRestrictions.html)。

## 步骤 4：授予对.rdb 文件的 ElastiCache 读取权限
<a name="backups-seeding-redis-grant-access"></a>

现在，授予对.rdb 备份文件的 ElastiCache 读取权限。您可以通过不同的方式授予对备份文件的 ElastiCache 访问权限，具体取决于您的存储桶位于默认Amazon区域还是选择加入Amazon区域。

Amazon 2019 年 3 月 20 日之前推出的区域默认处于启用状态。您可以立即开始在这些Amazon地区工作。2019 年 3 月 20 日之后推出的区域默认处于禁用状态，如亚太地区（香港）和中东（巴林）。您必须按照 *Amazon Web Services 一般参考*中的[管理Amazon区域](https://docs.amazonaws.cn/general/latest/gr/rande-manage.html)所述，先启用或选择加入这些区域，然后才能使用它们。

根据您所在的Amazon地区选择您的方法：
+ 对于默认区域，请使用 [授予对默认区域中.rdb 文件的 ElastiCache 读取权限](#backups-seeding-redis-default-region) 中的过程。
+ 对于选择加入的区域，请使用 [在可 ElastiCache 选区域中授予对.rdb 文件的读取权限](#backups-seeding-opt-in-region) 中的过程。

### 授予对默认区域中.rdb 文件的 ElastiCache 读取权限
<a name="backups-seeding-redis-default-region"></a>

Amazon 2019 年 3 月 20 日之前推出的区域默认处于启用状态。您可以立即开始在这些Amazon地区工作。2019 年 3 月 20 日之后推出的区域默认处于禁用状态，如亚太地区（香港）和中东（巴林）。您必须按照 *Amazon Web Services 一般参考*中的[管理Amazon区域](https://docs.amazonaws.cn/general/latest/gr/rande-manage.html)所述，先启用或选择加入这些区域，然后才能使用它们。

**授予对默认启用的Amazon区域中备份文件的 ElastiCache 读取权限**

1. 登录Amazon Web Services 管理控制台并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择包含您 .rdb 文件的 S3 存储桶的名称。

1. 选择包含 .rdb 文件的文件夹的名称。

1. 选择 .rdb 备份文件的名称。所选文件的名称将显示在页面顶部的选项卡上方。

1. 选择**权限**。

1. 如果 **aws-scs-s3-readonly** 或以下列表 IDs 中的某个规范未列为用户，请执行以下操作：

   1. 在 “**其他Amazon账户的访问权限**” 下，选择**添加被授权者**。

   1. 在框中，添加该Amazon地区的规范 ID，如下所示：
      + 中国（北京）和中国（宁夏）区域：

        ```
        b14d6a125bdf69854ed8ef2e71d8a20b7c490f252229b806e514966e490b8d83
        ```

         
      + Amazon GovCloud （美国西部）区域：

        ```
        40fa568277ad703bd160f66ae4f83fc9dfdfd06c2f1b5060ca22442ac3ef8be6
        ```
**重要**  
备份必须位于中的 S3 存储桶中，您才能将其下载到中的 Valkey 或 Redis OSS 集群中Amazon GovCloud (US)。Amazon GovCloud (US)

   1. 通过为以下对象选择 **Yes（是）**对存储桶设置权限：
      + **List/write object**（列出/写入对象）
      + **Read/write object ACL permissions**（读/写对象 ACL 权限）

   1. 选择**保存**。

1. 选择 **Overview（概述）**，然后选择 **Download（下载）**。

### 在可 ElastiCache 选区域中授予对.rdb 文件的读取权限
<a name="backups-seeding-opt-in-region"></a>

Amazon 2019 年 3 月 20 日之前推出的区域默认处于启用状态。您可以立即开始在这些Amazon地区工作。2019 年 3 月 20 日之后推出的区域默认处于禁用状态，如亚太地区（香港）和中东（巴林）。您必须按照 *Amazon Web Services 一般参考*中的[管理Amazon区域](https://docs.amazonaws.cn/general/latest/gr/rande-manage.html)所述，先启用或选择加入这些区域，然后才能使用它们。

现在，授予对.rdb 备份文件的 ElastiCache 读取权限。

**授予对备份文件的 ElastiCache 读取权限**

1. 登录Amazon Web Services 管理控制台并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 选择包含您 .rdb 文件的 S3 存储桶的名称。

1. 选择包含 .rdb 文件的文件夹的名称。

1. 选择 .rdb 备份文件的名称。所选文件的名称将显示在页面顶部的选项卡上方。

1. 选择**权限**选项卡。

1. 在 **Permissions**（权限）下，选择 **Bucket policy**（存储桶策略），然后选择 **Edit**（编辑）。

1. 更新策略以授予执行操作 ElastiCache 所需的权限：
   + 将 `[ "Service" : "region-full-name.elasticache-snapshot.amazonaws.com" ]` 添加到 `Principal`。
   + 添加将快照导出到 Amazon S3 存储桶所需的以下权限：
     + `"s3:GetObject"`
     + `"s3:ListBucket"`
     + `"s3:GetBucketAcl"`

   以下是更新策略具体形式的示例。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "Policy15397346",
       "Statement": [
           {
               "Sid": "Stmt15399483",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:ListBucket",
                   "s3:GetBucketAcl"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket",
                   "arn:aws:s3:::amzn-s3-demo-bucket/backup1.rdb",
                   "arn:aws:s3:::amzn-s3-demo-bucket/backup2.rdb"
               ]
           }
       ]
   }
   ```

------

1. 选择**保存更改**。

### 使用.rdb 文件数据为 ElastiCache 集群播种
<a name="backups-seeding-redis-seed-cluster"></a>

现在，您可以创建 ElastiCache 集群并使用.rdb 文件中的数据为其做种子了。要创建集群，请按照[创建 Valkey 或 Redis OSS 集群](Clusters.Create.md)或[从头开始创建 Valkey 或 Redis OSS 复制组](Replication.CreatingReplGroup.NoExistingCluster.md)中的说明操作。请确保选择 Valkey 或 Redis OSS 作为集群引擎。

您用来判断 ElastiCache 在哪里可以找到上传到 Amazon S3 的备份的方法取决于您创建集群时使用的方法：

**ElastiCache 使用.rdb 文件数据为 Redis OSS 集群或复制组做种子**
+ **使用控制 ElastiCache 台**

  选择**集群设置**时，请选择 **Restore from backups**（从备份中恢复）作为集群创建方法，然后在 **Backup source**（备份源）部分中选择 **Other backups**（其他备份）作为您的 **Source**（源）。在 **Seed RDB file S3 location（使用 RDB 文件 S3 位置设定种子）**框中，键入文件的 Amazon S3 路径。如果您有多个 .rdb 文件，则以逗号分隔的列表形式键入各文件的路径。Amazon S3 路径类似于 `myBucket/myFolder/myBackupFilename.rdb`。
+ **使用Amazon CLI**

  如果您使用 `create-cache-cluster` 或 `create-replication-group` 操作，请使用参数 `--snapshot-arns` 为各 .rdb 文件指定完全限定的 ARN。例如 `arn:aws:s3:::myBucket/myFolder/myBackupFilename.rdb`。ARN 必须解析为您存储在 Amazon S3 中的备份文件。
+ **使用 ElastiCache API**

  如果您使用`CreateCacheCluster`或 `CreateReplicationGroup` ElastiCache API 操作，请使用参数`SnapshotArns`为每个.rdb 文件指定完全限定的 ARN。例如 `arn:aws:s3:::myBucket/myFolder/myBackupFilename.rdb`。ARN 必须解析为您存储在 Amazon S3 中的备份文件。

**重要**  
在为 Valkey 或 Redis OSS（已启用集群模式）集群制作种子时，您必须在新集群或复制组中配置每个节点组（分片）。为此，请使用参数 `--node-group-configuration`（API：`NodeGroupConfiguration`）。有关更多信息，请参阅下列内容：  
CLI：[create-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-replication-group.html)在Amazon CLI参考资料中
API：[CreateReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateReplicationGroup.html)在 ElastiCache API 参考中

在创建集群的过程中，Valkey 或 Redis OSS 备份中的数据将写入集群。您可以通过查看 ElastiCache 事件消息来监控进度。为此，请访问 ElastiCache 控制台并选择 “**缓存事件**”。您也可以使用Amazon ElastiCache 命令行界面或 ElastiCache API 来获取事件消息。有关更多信息，请参阅 [查看 ElastiCache 事件](ECEvents.Viewing.md)。

# 引擎版本和升级中 ElastiCache
<a name="engine-versions"></a>

本节介绍了受支持的 Valkey、Memcached 和 Redis OSS 引擎以及如何升级。请注意，Redis OSS 7.2 提供的所有功能在 Valkey 7.2 及更高版本中默认可用。你也可以从现有 ElastiCache 的 Redis OSS 引擎升级到 Valkey 引擎。

# 升级引擎版本，包括跨引擎升级
<a name="VersionManagement.HowTo"></a>

**Valkey 和 Redis OSS**

对于 Valkey 和 Redis OSS，您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 修改集群或复制组并指定较新的引擎版本，从而启动集群或复制组的版本升级。

您也可以从 Redis OSS 跨越升级到 Valkey。有关跨越升级的更多信息，请参阅[如何从 Redis OSS 升级到 Valkey](#VersionManagement.HowTo.cross-engine-upgrade)。

**Topics**
+ [

## 如何从 Redis OSS 升级到 Valkey
](#VersionManagement.HowTo.cross-engine-upgrade)
+ [

## 解决 Valkey 或 Redis OSS 引擎升级受阻问题
](#resolving-blocked-engine-upgrades)


****  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/VersionManagement.HowTo.html)

**Memcached**

对于 Memcached，要启动对集群的版本升级，请对其进行修改并指定较新的引擎版本。您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 执行此步骤：
+ 要使用 Amazon Web Services 管理控制台，请参阅 – [使用 ElastiCache Amazon Web Services 管理控制台](Clusters.Modify.md#Clusters.Modify.CON)。
+ 要使用 Amazon CLI，请参阅[使用 ElastiCache Amazon CLI](Clusters.Modify.md#Clusters.Modify.CLI)。
+ 要使用 ElastiCache API，请参阅 [使用 ElastiCache API](Clusters.Modify.md#Clusters.Modify.API)。

## 如何从 Redis OSS 升级到 Valkey
<a name="VersionManagement.HowTo.cross-engine-upgrade"></a>

Valkey 是 Redis OSS 7 的简易替代。您可以使用控制台、API 或 CLI 从 Redis OSS 升级到 Valkey，方法是指定新的引擎和主要引擎版本。升级不会更改端点 IP 地址和应用程序的所有其他方面。从 Redis OSS 5.0.6 及更高版本升级时，您不会遇到停机。

**注意**  
**从 Redis OSS 升级到 Valkey 的 Amazon CLI 版本要求：**  
对于 Amazon CLI v1：最低要求版本 1.35.2（当前版本：1.40.22）
对于 Amazon CLI v2：最低要求版本 2.18.2（当前版本：2.27.22）

**注意**  
从低于 5.0.6 的 Redis OSS 版本升级时，在 DNS 传播期间，您可能会经历 30 到 60 秒的失效转移。
要将现有的 Redis OSS（已禁用集群模式）单节点集群升级到 Valkey 引擎，请先按照以下步骤操作：[使用现有集群创建复制组](Replication.CreatingReplGroup.ExistingCluster.md)。将 Redis OSS（已禁用集群模式）单节点集群添加到复制组后，您就可以跨引擎升级到 Valkey。

### 将复制组从 Redis OSS 升级到 Valkey
<a name="cross-engine-upgrades.replication-group"></a>

如果您有一个使用默认缓存参数组的 Redis OSS 复制组，则可以通过 modify-replication-group API 指定新的引擎和引擎版本来升级到 Valkey。

对于 Linux、macOS 或 Unix：

```
aws elasticache modify-replication-group \
   --replication-group-id myReplGroup \
   --engine valkey \
   --engine-version 8.0
```

对于 Windows：

```
aws elasticache modify-replication-group ^
   --replication-group-id myReplGroup ^
   --engine valkey ^
   --engine-version 8.0
```

如果您对要升级的现有 Redis OSS 复制组应用了自定义缓存参数组，则还需要在请求中传递自定义 Valkey 缓存参数组。输入 Valkey 自定义参数组必须具有与现有 Redis OSS 自定义参数组相同的 Redis OSS 静态参数值。

对于 Linux、macOS 或 Unix：

```
aws elasticache modify-replication-group \
   --replication-group-id myReplGroup \
   --engine valkey \
   --engine-version 8.0 \
   --cache-parameter-group-name myParamGroup
```

对于 Windows：

```
aws elasticache modify-replication-group ^
   --replication-group-id myReplGroup ^
   --engine valkey ^
   --engine-version 8.0 ^
   --cache-parameter-group-name myParamGroup
```

### 使用 CLI 将 Redis OSS 无服务器缓存升级到 Valkey
<a name="cross-engine-upgrades.cli"></a>

对于 Linux、macOS 或 Unix：

```
aws elasticache modify-serverless-cache \
   --serverless-cache-name myCluster \
   --engine valkey \
   --major-engine-version 8
```

对于 Windows：

```
aws elasticache modify-serverless-cache ^
   --serverless-cache-name myCluster ^
   --engine valkey ^
   --major-engine-version 8
```

### 使用控制台将 Redis OSS 升级到 Valkey
<a name="cross-engine-upgrades.console"></a>

**从 Redis OSS 5 升级到 Valkey**

1. 选择要升级的 Redis OSS 缓存。

1. 这时会出现**升级到 Valkey** 窗口。选择**升级到 Valkey** 按钮。

1. 转至**缓存设置**，然后选择**引擎版本**。建议使用最新版本的 Valkey。

1. 如果此缓存是无服务器的，则需要更新参数组。转至**缓存设置**的**参数组**区域，选择相应的参数组，例如 *default.valkey8*。

1. 选择**升级**。

该缓存现在将在控制台的 Valkey 区域中列出。

**注意**  
直接从 Redis OSS 4 或更低版本升级到 Valkey 可能会导致在 DNS 传播期间出现 30 到 60 秒的较长失效转移时间。

### 如何从 Valkey 降级到 Redis OSS
<a name="cross-engine-downgrades.console"></a>

 若因任何原因需要回滚已升级的集群，Amazon ElastiCache 支持将 Valkey 7.2 缓存回滚至 Redis OSS 7.1。您可以使用与引擎升级相同的控制台、API 或 CLI 步骤执行回滚，并将 Redis OSS 7.1 指定为目标引擎版本。回滚过程与升级过程相同。回滚不会更改端点 IP 地址和应用程序的所有其他方面，也不会出现停机。

 此外，您可以将从 Valkey 7.2 缓存创建的快照还原为 Redis OSS 7.1 缓存。从快照还原时，您可以将 Redis OSS 7.1 指定为目标引擎版本。使用此选项时，系统将根据快照创建新的缓存。从快照还原不会影响创建快照时所基于的 Valkey 缓存。

 执行回滚时存在以下要求和限制：
+  ElastiCache 仅支持从 Redis OSS 7.1 回滚到 Valkey 7.2。即使您从低于 Redis OSS 7.1 的版本升级到 Valkey 7.2，也是如此。
+  任何与正在回滚的复制组或无服务器缓存关联的用户组和用户都必须配置引擎类型 `REDIS`。

## 解决 Valkey 或 Redis OSS 引擎升级受阻问题
<a name="resolving-blocked-engine-upgrades"></a>

如下表所示，如果您有待处理的纵向扩展操作，则 Valkey 或 Redis OSS 引擎升级操作将会被阻止。


****  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/VersionManagement.HowTo.html)

**解决 Valkey 或 Redis OSS 引擎升级受阻问题**
+ 请执行以下操作之一：
  + 通过取消选中**立即应用**复选框，将 Redis OSS 或 Valkey 引擎升级操作安排在下一维护时段内。

    对于 CLI，请使用 `--no-apply-immediately`。对于 API，请使用 `ApplyImmediately=false`。
  + 等到下一维护时段（或之后）再执行 Redis OSS 引擎升级操作。
  + 将 Redis OSS 纵向扩展操作添加到选中了**立即应用**复选框的集群修改中。

    对于 CLI，请使用 `--apply-immediately`。对于 API，请使用 `ApplyImmediately=true`。

    此方法将立即执行引擎升级，从而有效地在下一维护时段内取消该操作。

# ElastiCache 扩展支持
<a name="extended-support"></a>

借助 ElastiCache 扩展支持，您可以在标准支持终止日期后，继续在主要引擎版本上运行缓存，但需要额外付费。如果您在标准支持终止日期后仍未升级，则需要支付费用。

扩展支持提供以下更新和技术支持：
+ 针对缓存和缓存引擎的关键 CVE 和高 CVE 的安全更新
+ 针对关键问题的错误修复和补丁
+ 能够在标准 ElastiCache 服务等级协议范围内建立支持案例并获得故障排除帮助

这项付费服务让您有更多时间升级到支持的主要引擎版本。

例如，Redis OSS 4.0.10 的 ElastiCache 标准支持终止日期为 2026 年 1 月 31 日。如果您在该日期之前未手动升级到 Valkey 或 Redis OSS 6 或更高版本，ElastiCache 会自动为您的缓存注册扩展支持，届时您可以继续运行 Redis OSS 4.0.10。从标准支持终止后的当月第一天（2026 年 2 月 1 日）开始，ElastiCache 会自动向您收取扩展支持费用。

对于主要引擎版本，在标准支持终止日期后，扩展支持可提供长达 3 年的服务。对于 ElastiCache for Redis OSS v4 和 v5，将服务到 2029 年 1 月 31 日。在此日期之后，所有仍在运行 Redis OSS v4 和 v5 的缓存都将自动升级到最新版本的 Valkey。

一旦引擎的支持周期终止，继续运行该旧版本的缓存将立即自动过渡到扩展支持。您将在扩展支持定价开始日期之前收到通知，因此您可以改为升级实例。您也可以随时通过升级到支持的版本来明确选择退出。

有关标准支持终止日期和扩展支持终止日期的更多信息，请参阅适用于 Valkey、Memcached 或 Redis OSS 的 [ElastiCache 适用于 Redis OSS 的版本生命周期终止时间表](engine-versions.md#deprecated-engine-versions)。

**Topics**
+ [

# ElastiCache 扩展支持费用
](extended-support-charges.md)
+ [

# 提供 ElastiCache 扩展支持的版本
](extended-support-versions.md)
+ [

# ElastiCache 和客户在 ElastiCache 扩展支持方面的责任
](extended-support-responsibilities.md)

# ElastiCache 扩展支持费用
<a name="extended-support-charges"></a>

从 ElastiCache 标准支持终止日期的第二天开始，您将为在 ElastiCache 扩展支持中注册的所有引擎付费。有关 ElastiCache 标准支持终止日期，请参阅 [提供 ElastiCache 扩展支持的版本](extended-support-versions.md)。

当您执行以下操作之一时，ElastiCache 扩展支持的额外费用将自动停止：
+ 升级到标准支持涵盖范围内的引擎版本。
+ 删除在 ElastiCache 标准支持终止日期之后运行主要版本的缓存。

如果您的目标引擎版本将来进入扩展支持，将重新开始收费。

例如，假设 ElastiCache for Redis OSS v4 于 2026 年 2 月 1 日进入扩展支持，而您在 2027 年 1 月 1 日将缓存从 v4 升级到 v6。对于 ElastiCache for Redis OSS v4，您只需支付 11 个月的扩展支持费用。如果您在 2027 年 1 月 31 日标准支持终止日期之后继续运行 ElastiCache for Redis OSS v6，那么从 2027 年 2 月 1 日起，这些缓存将再次产生扩展支持费用。

您可以通过阻止 ElastiCache 在标准支持终止日期后创建或还原缓存，避免支付 ElastiCache 扩展支持费用。

有关更多信息，请参阅 [Amazon ElastiCache 定价](https://www.amazonaws.cn/elasticache/pricing/)。

# 提供 ElastiCache 扩展支持的版本
<a name="extended-support-versions"></a>

Redis 开源软件（OSS）v4 和 v5 分别于 2020 年和 2022 年进入其社区生命周期终止日期。这意味着社区不再发布更新、错误修复或安全补丁。ElastiCache for Redis OSS v4 和 v5 的 ElastiCache 标准支持将于 2026 年 1 月 31 日终止。继续使用不支持的 Redis OSS 版本可能会导致您的数据遇到已知[常见漏洞和风险](https://nvd.nist.gov/vuln-metrics/cvss)（CVE）。

从 2026 年 2 月 1 日起，仍在 Redis OSS v4 和 v5 上运行的 ElastiCache 缓存将自动注册扩展支持，以提供持续的可用性和安全性。虽然扩展支持提供了灵活性，但我们建议将标准支持终止日期视为生产工作负载的规划里程碑。我们强烈建议您在标准支持终止日期之前，将 Redis OSS v4 和 v5 缓存升级到 ElastiCache for Valkey 或 ElastiCache for Redis OSS v6 或更高版本。

下表汇总了 Amazon ElastiCache 标准支持终止日期和扩展支持日期。

**扩展支持和生命周期终止时间表**


| 主要引擎版本 | 标准支持终止日期 | 扩展支持开始日期（第 1 年 Premium） | 扩展支持开始日期（第 2 年 Premium） | 扩展支持开始日期（第 3 年 Premium） | 扩展支持终止日期和版本 EOL | 
| --- | --- | --- | --- | --- | --- | 
| Redis OSS v4 | 2026 年 1 月 31 日 | 2026 年 2 月 1 日 | 2027 年 2 月 1 日 | 2028 年 2 月 1 日 | 2029 年 1 月 31 日 | 
| Redis OSS v5 | 2026 年 1 月 31 日 | 2026 年 2 月 1 日 | 2027 年 2 月 1 日 | 2028 年 2 月 1 日 | 2029 年 1 月 31 日 | 
| Redis OSS v6 | 2027 年 1 月 31 日 | 2027 年 2 月 1 日 | 2028 年 2 月 1 日 | 2029 年 2 月 1 日 | 2030 年 1 月 31 日 | 

扩展支持仅适用于每个主要 Redis OSS 版本支持的最新补丁版本。当扩展支持于 2026 年 2 月 1 日开始时，如果您的 Redis OSS v4 和 v5 集群尚未安装最新补丁版本，则在注册扩展支持之前，它们将自动升级到 Redis OSS v4 的 v4.0.10 以及 Redis OSS v5 的 v5.0.6。这可确保您通过扩展支持获得安全更新和错误修复。在扩展支持过渡期间，您不需要执行任何操作即可升级到这些最新补丁版本。

# ElastiCache 和客户在 ElastiCache 扩展支持方面的责任
<a name="extended-support-responsibilities"></a>

以下是 Amazon ElastiCache 的责任以及您在 ElastiCache 扩展支持方面的责任。

**Amazon ElastiCache 的责任**

在 ElastiCache 标准支持终止日期之后，Amazon ElastiCache 将为注册了 ElastiCache 扩展支持的引擎提供补丁、错误修复和升级。这将持续长达 3 年，或者直到您停止使用扩展支持中的引擎为止，以先发生者为准。

**您的责任**

您负责应用针对 ElastiCache 扩展支持中的缓存提供的补丁、错误修复和升级。Amazon ElastiCache 保留随时更改、替换或撤回此类补丁、错误修复和升级的权利。如果需要某个补丁来解决安全或关键稳定性问题，Amazon ElastiCache 将保留使用该补丁更新您的缓存或要求您安装该补丁的权利。

您还负责在 ElastiCache 扩展支持终止日期之前，将引擎升级到更高的引擎版本。ElastiCache 扩展支持终止日期通常是 ElastiCache 标准支持终止日期之后 3 年。

如果您不升级引擎，则在 ElastiCache 扩展支持终止日期之后，Amazon ElastiCache 会尝试将您的引擎升级到 ElastiCache 标准支持所支持的更新引擎版本。如果升级失败，那么 Amazon ElastiCache 将保留删除在 ElastiCache 标准支持终止日期后运行引擎的缓存的权利。但是，在这样做之前，Amazon ElastiCache 将保留您来自该引擎的数据。

# 的版本管理 ElastiCache
<a name="VersionManagement"></a>

管理您希望如何更新针对 Valkey、Mem ElastiCache cached 和 Redis OSS 引擎更新的缓存和基于节点的集群。

## ElastiCache 无服务器缓存的版本管理
<a name="VersionManagement-serverless"></a>

管理是否以及何时升级 ElastiCache 无服务器缓存，并根据自己的条件和时间表执行版本升级。

ElastiCache Serverless 会自动将最新的次要版本和补丁软件版本应用到您的缓存，而不会对您的应用程序造成任何影响或停机。在您的末端不需要执行任何操作。

当有新的主要版本可用时， ElastiCache Serverless 将在控制台中向您发送通知，并在中 EventBridge向您发送事件。您可以选择使用控制台、CLI 或 API 修改缓存并选择最新的引擎版本，将缓存升级到最新的主要版本。与次要升级和补丁升级类似，主要版本升级无需应用程序停机即可执行。

## 基于节点 ElastiCache 的集群的版本管理
<a name="VersionManagement-clusters"></a>

使用基于节点的 ElastiCache 集群时，您可以控制为集群提供支持的软件何时升级到支持的新版本。 ElastiCache您可以控制何时将缓存升级到最新的主要、次要和补丁版本。可以通过修改集群或复制组并指定新的引擎版本，对您的集群或复制组启动引擎版本升级。

您可以控制为集群提供支持的符合协议的软件是否以及何时升级到支持的新版本。 ElastiCache此级别的控制使您能够与特定版本保持兼容、在生产中部署进行之前使用应用程序测试新版本以及根据自己的条件和时间表执行版本升级。

因为版本升级可能会涉及到某些兼容性风险，因此版本升级不会自动发生。您必须启动它们。

**Valkey 和 Redis OSS 集群**

**注意**  
如果跨一个或多个区域复制 Valkey 或 Redis OSS 集群，则会先升级辅助区域的引擎版本，然后再升级主区域的引擎版本。
 ElastiCache 对于 Redis，OSS 版本以语义版本标识，语义版本包括主要和次要组件。例如，在 Redis OSS 6.2 中，主要版本为 6，次要版本为 2。在操作基于节点的集群时， ElastiCache 适用于 Redis 的 OSS 还会公开补丁组件，例如 Redis OSS 6.2.1，补丁版本为 1。  
主要版本针对 API 不兼容的更改，而次要版本针对以向后兼容的方式添加的新功能。补丁版本针对向后兼容的错误修复和非功能性更改。

对于 Valkey 和 Redis OSS，您可以通过修改集群或复制组并指定新的引擎版本来对启动集群或复制组的版本升级。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

**Memcached**

对于 Memcached，要升级到更新的版本，您必须修改集群，并指定要使用的新引擎版本。升级到更新的 Memcached 版本是一个破坏性过程 – 您会丢失数据并以冷缓存开始。有关更多信息，请参阅 [修改 ElastiCache 集群](Clusters.Modify.md)。

从旧版本的 Memcached 升级到 1.4.33 版本或更新版本的 Memcached 时，您应注意以下要求。`CreateCacheCluster` 和 `ModifyCacheCluster` 在下列情况下将失败：
+ 如果 `slab_chunk_max > max_item_size`。
+ 如果 `max_item_size modulo slab_chunk_max != 0`。
+ 如果 `max_item_size > ((max_cache_memory - memcached_connections_overhead) / 4)`。

  `(max_cache_memory - memcached_connections_overhead)` 值是可用于数据的节点内存。有关更多信息，请参阅 [Memcached 连接开销](ParameterGroups.Engine.md#ParameterGroups.Memcached.Overhead)。

## 支持的引擎和版本
<a name="supported-engine-versions"></a>

ElastiCache Valkey 及更高 ElastiCache 版本的无服务器缓存支持 7.2 版，Memcached 及更高 ElastiCache 版本支持 1.6 版，Redis OSS 及更高版本支持 ElastiCache 7.0 版。

基于节点的 ElastiCache 集群支持 Valkey 及更高 ElastiCache 版本的 7.2 版，Memcached 及更高 ElastiCache 版本支持 1.4.5 版，Redis OSS 及更高版本支持 ElastiCache 4.0.10。

**Topics**
+ [支持的 Valkey 版本](#supported-engine-versions.valkey)
+ [Valkey 8.2](#valkey-version-8.2)
+ [Valkey 8.1](#valkey-version-8.1)
+ [Valkey 8.0](#valkey-version-8)
+ [

### ElastiCache 适用于 Valkey 的 7.2.6 版
](#valkey-version-7.2.6)

### 支持的 Valkey 版本
<a name="supported-engine-versions.valkey"></a>

支持的 Valkey 版本如下。请注意，默认情况下，Valkey 支持 Redis OSS 7.2 ElastiCache 版本中提供的大多数功能。
+ 您也可以使用低于 5.0.6 的版本升级 ElastiCache 集群。所涉及的过程相同，但在 DNS 传播期间可能会导致更长的故障转移时间（30 秒 - 1 分钟）。
+ 从 Redis OSS 7 开始， ElastiCache 支持在 Valkey 或 Redis OSS（已禁用集群模式）和 Valkey 或 Redis OSS（启用集群模式）之间切换。
+ Amazon ElastiCache for Redis OSS 引擎升级过程旨在尽最大努力保留您的现有数据，并且需要成功复制 Redis OSS。
+ 升级引擎时， ElastiCache 将终止现有的客户端连接。为了最大限度地减少引擎升级期间的停机时间，我们建议您实施[关于 Redis OSS 客户端的最佳实践](BestPractices.Clients.redis.md)，包括错误重试和指数回退，以及关于[维护期间最大限度减少停机时间](BestPractices.MinimizeDowntime.md)的最佳实践。
+ 升级引擎时，您无法从 Valkey 或 Redis OSS（已禁用集群模式）直接升级到 Valkey 或 Redis OSS（已启用集群模式）。以下过程演示了如何从 Valkey 或 Redis OSS（已禁用集群模式）升级到 Valkey 或 Redis OSS（已启用集群模式）。

**从 Valkey 或 Redis OSS（已禁用集群模式）升级到 Valkey 或 Redis OSS（已启用集群模式）引擎版本**

  1. 备份 Valkey 或 Redis OSS（已禁用集群模式）集群或复制组。有关更多信息，请参阅 [进行手动备份](backups-manual.md)。

  1. 使用备份创建具有一个分片（节点组）的 Valkey 或 Redis OSS（已启用集群模式）集群并为其制作种子。在创建集群或复制组时，指定新的引擎版本并启用集群模式。有关更多信息，请参阅 [教程：使用外部创建的备份为新的基于节点的集群制作种子](backups-seeding-redis.md)。

  1. 删除旧 Valkey 或 Redis OSS（已禁用集群模式）集群或复制组。有关更多信息，请参阅 [删除中的集群 ElastiCache](Clusters.Delete.md)或 [删除复制组](Replication.DeletingRepGroup.md)。

  1. 将新的 Valkey 或 Redis OSS（已启用集群模式）集群或复制组扩展到所需的分片（节点组）数。有关更多信息，请参阅 [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)。
+ 升级主要引擎版本（例如从 5.0.6 升级到 6.0）时，还需要选择一个与新引擎版本兼容的新参数组。
+ 对于单个 Redis OSS 集群以及禁用了多可用区的集群，建议有足够的内存可供 Redis OSS 使用，如[确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)中所述。在这些情况下，主项在升级过程中不可用于处理服务请求。
+ 对于启用了多可用区的 Redis OSS 集群，我们还建议您在传入的写流量较低期间安排引擎升级。升级到 Redis OSS 5.0.6 或更高版本时，主集群在升级过程中仍可用于服务请求。

  将处理和修补带多个分片的集群和复制组，如下所示：
  + 将并行处理所有分片。在任何时候，仅在分片上执行一次升级操作。
  + 在每个分片中，在处理主副本之前，会先处理所有其他副本。如果一个分片中的副本较少，则可能会在处理完其他分片中的副本之前处理该分片中的主副本。
  + 在所有分片中，主节点都是按顺序处理的。一次只升级一个主节点。
+ 如果已对当前集群或复制组启用了加密，则无法升级到不支持加密的引擎版本，例如，从 3.2.6 升级到 3.2.10。

**Memcached 注意事项**

在升级基于节点的 Memcached 集群时，请注意以下事项。
+ 引擎版本管理的设计使您可以尽可能多地控制修补的发生方式。但是，如果系统或缓存软件中出现严重安全漏洞，则 ElastiCache 保留代表您修补集群的权利。
+ 由于 Memcached 引擎不支持持久化，因此 Memcached 引擎版本升级始终是一个中断性过程，将清除集群中的所有缓存数据。

### ElastiCache 适用于 Valkey 的 8.2 版
<a name="valkey-version-8.2"></a>

以下是 Valkey 8.2 中引入的一些新功能（与 Valke ElastiCache y 8.1 相比）：
+ 对[向量搜索](vector-search.md)的原生支持，使您能够以低至微秒级延迟在内存中存储、索引、搜索和更新数十亿个高维向量嵌入。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)。

有关引入了向量搜索的 Valkey 8.2 版本的更多信息，请参阅 [Valkey Search](https://github.com/valkey-io/valkey-search)。

### ElastiCache 适用于 Valkey 的 8.1 版
<a name="valkey-version-8.1"></a>

以下是 Valkey 8.1 中引入的一些新功能（与 Valke ElastiCache y 8.0 相比）：
+ 一种[新的哈希表](https://valkey.io/blog/new-hash-table/)实现，可减少内存开销，将常见 key/value 模式的内存使用量降低多达20％。
+ 对 [Bloom 筛选条件](https://valkey.io/topics/bloomfilters/)的原生支持，这是一种新的数据类型，与使用 Set 数据类型相比，允许您使用多达 98% 的内存执行查找。
+ 新命令 [COMMANDLOG](https://valkey.io/commands/commandlog-get/)，用于记录执行缓慢情况、大型请求及大型回复。
+ 新增对 SET 命令的条件更新支持（使用 IFEQ 参数）。
+ 性能改进，包括 ZRANK 命令的延迟降低多达 45%，PFMERGE 和 PFCOUNT 的性能提高多达 12 倍，BITCOUNT 的吞吐量提高多达 514%。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)

有关 Valkey 8.1 版本的更多信息，请参阅 [Valkey 8.1 Release Notes](https://github.com/valkey-io/valkey/blob/8.1/00-RELEASENOTES)

### ElastiCache 适用于 Valkey 的 8.0 版
<a name="valkey-version-8"></a>

以下是 Valkey 8.0 中引入的一些新功能（与 Valkey 7.2.6 相比）： ElastiCache 
+ 内存效率提高，允许用户在不进行任何应用程序更改的情况下在每个节点上存储多达 20% 的数据。
+ 针对基于节点的集群新推出的每插槽指标基础设施，可供详细了解各个插槽的性能和资源使用情况。
+ ElastiCache 适用于 Valkey 8.0 的无服务器可以每 2-3 分钟将支持的每秒请求数 (RPS) 翻一番，在不到 13 分钟的时间内从零达到每个缓存 500 万 RPS，读取延迟始终保持亚毫秒 p50。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)

有关 Valkey 8 版本的更多信息，请参阅 [Valkey 8 Release Notes](https://github.com/valkey-io/valkey/blob/8.0/00-RELEASENOTES)

### ElastiCache 适用于 Valkey 的 7.2.6 版
<a name="valkey-version-7.2.6"></a>

2024 年 10 月 10 日，Valkey ElastiCache 的 7.2.6 版本发布。以下是 7.2 中引入的一些新功能（与 Redis OSS 的 7.1 ElastiCache 版本相比）：
+ 各种数据类型的性能和内存优化：列表和集合类型键的内存优化、排序集命令的速度优化、集群模式下具有多个键的命令的性能优化、 pub/sub 性能改进、SCAN、HSCAN、ZSCAN 命令的性能优化以及许多其他较小的优化。
+ ZRANK 和 ZREVRANK 命令有新的 WITHSCORE 选项
+ CLIENT NO-TOUCH 允许客户端在不影响按键的情况下运行命令 LRU/LFU 。
+ 新命令 CLUSTER MYSHARDID 返回节点的分片 ID，以便根据复制在集群模式下对节点进行逻辑分组。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)

有关 Valkey ElastiCache 版本 7.2 的更多信息，请参阅 [Redis OSS 7.2.4 发行说明（Valkey 的](https://github.com/valkey-io/valkey/blob/d2c8a4b91e8c0e6aefd1f5bc0bf582cddbe046b7/00-RELEASENOTES) 7.2 ElastiCache 版本包括从 Redis OSS 的 7.1 ElastiCache 版到 Redis OSS 的 7.2.4 ElastiCache 版的所有更改）。[Valkey 上的 Valkey 7.2 发行说明](https://github.com/valkey-io/valkey/blob/7.2/00-RELEASENOTES) GitHub

## ElastiCache 适用于 Valkey 的 8.2 版
<a name="valkey-version-8.2.main"></a>

以下是 Valkey 8.2 中引入的一些新功能（与 Valke ElastiCache y 8.1 相比）：
+ 对[向量搜索](vector-search.md)的原生支持，使您能够以低至微秒级延迟在内存中存储、索引、搜索和更新数十亿个高维向量嵌入。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)。

有关引入了向量搜索的 Valkey 8.2 版本的更多信息，请参阅 [Valkey Search](https://github.com/valkey-io/valkey-search)。

## ElastiCache 适用于 Valkey 的 8.1 版
<a name="valkey-version-8.1.main"></a>

以下是 Valkey 8.1 中引入的一些新功能（与 Valke ElastiCache y 8.0 相比）：
+ 一种[新的哈希表](https://valkey.io/blog/new-hash-table/)实现，可减少内存开销，将常见 key/value 模式的内存使用量降低多达20％。
+ 对 [Bloom 筛选条件](https://valkey.io/topics/bloomfilters/)的原生支持，这是一种新的数据类型，与使用 Set 数据类型相比，允许您使用多达 98% 的内存执行查找。
+ 新命令 [COMMANDLOG](https://valkey.io/commands/commandlog-get/)，用于记录执行缓慢情况、大型请求及大型回复。
+ 新增对 SET 命令的条件更新支持（使用 IFEQ 参数）。
+ 性能改进，包括 ZRANK 命令的延迟降低多达 45%，PFMERGE 和 PFCOUNT 的性能提高多达 12 倍，BITCOUNT 的吞吐量提高多达 514%。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)

有关 Valkey 8.1 版本的更多信息，请参阅 [Valkey 8.1 Release Notes](https://github.com/valkey-io/valkey/blob/8.1/00-RELEASENOTES)

## ElastiCache 适用于 Valkey 的 8.0 版
<a name="valkey-version-8.main"></a>

以下是 Valkey 8.0 中引入的一些新功能（与 Valkey 7.2.6 相比）： ElastiCache 
+ 内存效率提高，允许用户在不进行任何应用程序更改的情况下在每个节点上存储多达 20% 的数据。
+ 针对基于节点的集群新推出的每插槽指标基础设施，可供详细了解各个插槽的性能和资源使用情况。
+ ElastiCache 适用于 Valkey 8.0 的无服务器可以每 2-3 分钟将支持的每秒请求数 (RPS) 翻一番，在不到 13 分钟的时间内从零达到每个缓存 500 万 RPS，读取延迟始终保持亚毫秒 p50。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)

有关 Valkey 8 版本的更多信息，请参阅 [Valkey 8 Release Notes](https://github.com/valkey-io/valkey/blob/8.0/00-RELEASENOTES)

## ElastiCache 适用于 Valkey 的 7.2.6 版
<a name="valkey-version-7.2.6.main"></a>

2024 年 10 月 10 日，Valkey ElastiCache 的 7.2.6 版本发布。以下是 7.2 中引入的一些新功能（与 Redis OSS 的 7.1 ElastiCache 版本相比）：
+ 各种数据类型的性能和内存优化：列表和集合类型键的内存优化、排序集命令的速度优化、集群模式下具有多个键的命令的性能优化、 pub/sub 性能改进、SCAN、HSCAN、ZSCAN 命令的性能优化以及许多其他较小的优化。
+ ZRANK 和 ZREVRANK 命令有新的 WITHSCORE 选项
+ CLIENT NO-TOUCH 允许客户端在不影响按键的情况下运行命令 LRU/LFU 。
+ 新命令 CLUSTER MYSHARDID 返回节点的分片 ID，以便根据复制在集群模式下对节点进行逻辑分组。

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)

有关 Valkey ElastiCache 版本 7.2 的更多信息，请参阅 [Redis OSS 7.2.4 发行说明（Valkey 的](https://github.com/valkey-io/valkey/blob/d2c8a4b91e8c0e6aefd1f5bc0bf582cddbe046b7/00-RELEASENOTES) 7.2 ElastiCache 版本包括从 Redis OSS 的 7.1 ElastiCache 版到 Redis OSS 的 7.2.4 ElastiCache 版的所有更改）。[Valkey 上的 Valkey 7.2 发行说明](https://github.com/valkey-io/valkey/blob/7.2/00-RELEASENOTES) GitHub

## 支持的 Redis OSS 引擎版本
<a name="supported-engine-versions.redis"></a>

ElastiCache 无服务器缓存和基于节点的集群支持所有 Redis OSS 7.1 及更低版本。
+ [ElastiCache 适用于 Redis OSS 的 7.1 版（增强版）](#redis-version-7.1)

**Topics**
+ [

### ElastiCache 适用于 Redis OSS 的 7.1 版（增强版）
](#redis-version-7.1)
+ [

### ElastiCache 适用于 Redis OSS 的 7.0 版（增强版）
](#redis-version-7.0)
+ [

### ElastiCache 适用于 Redis OSS 的 6.2 版（增强版）
](#redis-version-6.2)
+ [

### ElastiCache 适用于 Redis OSS 的 6.0 版（增强版）
](#redis-version-6.0)
+ [

### ElastiCache 适用于 Redis OSS 的 5.0.6 版（增强版）
](#redis-version-5-0.6)
+ [

### ElastiCache 适用于 Redis OSS 的 5.0.5 版（已弃用，使用版本 5.0.6）
](#redis-version-5-0.5)
+ [

### ElastiCache 适用于 Redis OSS 的 5.0.4 版（已弃用，使用版本 5.0.6）
](#redis-version-5-0.4)
+ [

### ElastiCache 适用于 Redis OSS 的 5.0.3 版（已弃用，使用版本 5.0.6）
](#redis-version-5-0.3)
+ [

### ElastiCache 适用于 Redis OSS 的 5.0.0 版（已弃用，使用版本 5.0.6）
](#redis-version-5-0)
+ [

### ElastiCache 适用于 Redis OSS 的 4.0.10 版（增强版）
](#redis-version-4-0-10)
+ [已经终止生命期周期（EOL）版本（3.x）](#redis-version-3-2-10-scheduled-eol)
+ [已经终止生命期周期（EOL）版本（2.x）](#redis-version-2-x-eol)

### ElastiCache 适用于 Redis OSS 的 7.1 版（增强版）
<a name="redis-version-7.1"></a>

此版本包含性能改进，使工作负载能够推动更高的吞吐量和更低的操作延迟。 ElastiCache 适用于 Redis OSS 的 7.1 版本引入了[两个主要的增强功能](https://www.amazonaws.cn/blogs/database/achieve-over-500-million-requests-per-second-per-cluster-with-amazon-elasticache-for-redis-7-1/)：

我们扩展了增强的 I/O 话题功能，使其也能处理表示层逻辑。对于表示层，这是指增强型 I/O 线程现在不仅可以读取客户端输入，还可以将输入解析为 Redis OSS 二进制命令格式。然后将其转发到主线程用于执行，从而提高性能。改进了 Redis OSS 内存访问模式。许多数据结构操作的执行步骤是交错的，以确保并行内存访问并减少内存访问延迟。在基于 Graviton3 `R7g.4xlarge` 或更高版本 ElastiCache 上运行时，客户每个节点每秒可以实现超过 100 万个请求。随着Redis OSS v7.1 ElastiCache 的性能改进，与Redis OSS v7.0相比，客户可以将吞吐量提高多达100％，P99延迟降低50％。 ElastiCache 这些增强功能适用于具有至少 8 个物理内核的节点大小（采用 Graviton 时为 `2xlarge`，采用 x86 时为 `4xlarge`），不受 CPU 类型的限制，并且无需更改客户端。

**注意**  
ElastiCache v7.1 与 Redis OSS v7.0 兼容。

### ElastiCache 适用于 Redis OSS 的 7.0 版（增强版）
<a name="redis-version-7.0"></a>

ElastiCache 适用于 Redis 的 OSS 7.0 增加了许多改进和对新功能的支持：
+ [功能](https://valkey.io/topics/functions-intro/)：适用 ElastiCache 于 Redis 的 OSS 7 增加了对 Redis OSS 函数的支持，并提供了托管体验，使开发人员能够使用存储在 ElastiCache集群中的应用程序逻辑执行 [LUA 脚本](https://valkey.io/topics/eval-intro/)，而无需客户端在每次连接时都将脚本重新发送到服务器。
+ [ACL 改进](https://valkey.io/topics/acl/)：Valkey 和 Redis OSS 7 增加了对下一版本访问控制列表 () ACLs 的支持。客户端现在可以为 Valkey 和 Redis OSS 中的特定键或键空间指定多组权限。
+ [Sharded Pub/Sub](https://valkey.io/topics/pubsub/)： ElastiCache 适用于 Valkey 和 Redis 的 OSS 7 增加了对运行Pub/Sub functionality in a sharded way when running ElastiCache in Cluster Mode Enabled (CME). Pub/Sub的支持，使发布者能够向频道上的任意数量的订阅者发布消息。通道绑定到 ElastiCache 集群中的分片，无需在分片之间传播通道信息，从而提高了可扩展性。
+ 增强的 I/O 多路复用： ElastiCache 对于 Valkey 和 Redis，OSS 7 引入了增强的 I/O 多路复用，可为具有许多并行客户端连接到集群的高吞吐量工作负载提供更高的吞吐量和更短的延迟。 ElastiCache 例如，与 Redis OSS 的版本 6 相比，使用由 r6g.xlarge 节点组成的集群并运行 5200 个并发客户端时，吞吐量（每秒读取和写入操作数）最多可提高 72%，P99 延迟最多可减少 71%。 ElastiCache 

有关 Valkey 的更多信息，请参阅 [Valkey](https://valkey.io/)。有关 Redis OSS 7.0 版本的更多信息，请参阅 Redis OSS 上[的 Redis OSS 7.0 发行说明](https://github.com/redis/redis/blob/7.0/00-RELEASENOTES)。 GitHub

### ElastiCache 适用于 Redis OSS 的 6.2 版（增强版）
<a name="redis-version-6.2"></a>

ElastiCache 适用于 Redis 的 OSS 6.2 包括支持 TLS 的集群的性能改进，这些集群使用 8 v CPUs 或更高的 x86 节点类型或具有 4 v 或更高的 Graviton2 节点类型。CPUs 这些增强功能通过将加密转移到其他 v CPUs 来提高吞吐量并缩短客户端连接建立时间。 在 Redis OSS 6.2 中，您还可以使用访问控制列表 (ACL) 规则管理对 Pub/Sub 频道的访问权限。

 在此版本中，我们还引入了对包含本地连接的 NVMe SSD 的群集节点上的数据分层支持。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

Redis OSS 引擎版本 6.2.6 还引入了对原生 JavaScript 对象表示法 (JSON) 格式的支持，这是一种在 Redis OSS 集群中对复杂数据集进行编码的简单、无架构的方法。借助 JSON 支持，您可以将性能和 Redis OSS APIs 用于通过 JSON 运行的应用程序。有关更多信息，请参阅 [JSON 入门](json-gs.md)。还包括与 JSON 相关的指标，`JsonBasedCmds`以及`JsonBasedCmdsLatency`，这些指标被合并到中 CloudWatch 以监控此数据类型的使用情况。有关更多信息，请参阅 [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)。

您可以使用 6.2 来指定引擎版本。 ElastiCache 将自动调用可用的 Redis OSS 6.2 的首选补丁版本。例如，您可在创建/修改集群时将 `--engine-version` 参数设置为 6.2。集群将使用当前可用的首选补丁版本 Redis OSS 6.2 启动。 creation/modification 如果您在 API 中指定引擎版本 6.x，系统将会使用 Redis OSS 6 的最新次要版本。

对于现有 6.0 集群，您可以通过在、或中将`AutoMinorVersionUpgrade`参数设置为，选择加入下一次 auto `yes` 次要版本升级。`CreateCacheCluster` `ModifyCacheCluster` `CreateReplicationGroup` `ModifyReplicationGroup` APIs ElastiCache 将使用自助服务更新将现有 6.0 集群的次要版本升级到 6.2。有关更多信息，请参阅 [Amazon 中的自助服务更新 ElastiCache](Self-Service-Updates.md)。

调用 DescribeCacheEngineVersions API 时，`EngineVersion`参数值将设置为 6.2，`CacheEngineVersionDescription`字段中将返回带有补丁版本的实际引擎版本。 

有关 Redis OSS 6.2 版本的更多信息，请参阅 [Redis OSS 上的 Redis OSS 6.2 发行说明](https://github.com/redis/redis/blob/6.2/00-RELEASENOTES)。 GitHub

### ElastiCache 适用于 Redis OSS 的 6.0 版（增强版）
<a name="redis-version-6.0"></a>

Amazon ElastiCache 推出了下一版本的 Redis OSS 引擎，其中包括使用[基于角色的访问控制对用户进行身份验证](Clusters.RBAC.md)、客户端缓存和显著的操作改进。 ElastiCache 

 从 Redis OSS 6.0 开始， ElastiCache 将为每个 Redis OSS 次要版本提供一个版本，而不是提供多个补丁版本。 ElastiCache 将自动管理正在运行的集群的补丁版本，从而确保提高性能和增强安全性。

您还可以通过将`AutoMinorVersionUpgrade`参数设置为来选择下一次 auto 次要版本升级，`yes` ElastiCache并将通过自助服务更新来管理次要版本升级。有关更多信息，请参阅 [中的服务更新 ElastiCache](Self-Service-Updates.md)。

您可以通过使用来指定引擎版本`6.0`。 ElastiCache 将自动调用可用的 Redis OSS 6.0 的首选补丁版本。例如，如果您 create/modify 是群集，则将`--engine-version`参数设置为 6.0。则在集群创建/修改时，系统将会使用当前可用的 Redis OSS 6.0 首选补丁版本启动集群。任何包含特定补丁版本值的请求都将被拒绝，同时引发异常且进程会失败。

调用 DescribeCacheEngineVersions API 时，`EngineVersion`参数值将设置为 6.0，`CacheEngineVersionDescription`字段中将返回带有补丁版本的实际引擎版本。 

有关 Redis OSS 6.0 版本的更多信息，请参阅 Redis OSS 上[的 Redis OSS 6.0 发行说明](https://github.com/redis/redis/blob/6.0/00-RELEASENOTES)。 GitHub

### ElastiCache 适用于 Redis OSS 的 5.0.6 版（增强版）
<a name="redis-version-5-0.6"></a>

Amazon ElastiCache 推出了 Redis OSS 引擎的下一个版本，其中包括错误修复和以下累积更新： ElastiCache 
+ 特殊情况下的引擎稳定性保证。
+ 改进的 Hyperloglog 错误处理。
+ 增强的握手命令以进行可靠的复制。
+ 通过 `XCLAIM` 命令进行一致的消息交付跟踪。
+ 对象中改进的 `LFU `字段管理。
+ 使用 `ZPOP` 时增强的事务管理。
+ 能够重命名命令：一个名为 `rename-commands` 的参数，让您可以重命名可能导致意外数据丢失的潜在危险或成本高昂的 Redis OSS 命令，例如 `FLUSHALL` 或 `FLUSHDB`。这与开源 Redis OSS 中的重命名命令配置类似。但是 ElastiCache，通过提供完全托管的工作流程改善了体验。命令名称更改将立即应用，并自动在集群中包含命令列表的所有节点上传播。您无需干预，例如重新启动节点。

  以下示例演示了如何修改现有参数组。它们包括 `rename-commands` 参数，该参数是要重命名的以空格分隔的命令列表：

  ```
  aws elasticache modify-cache-parameter-group --cache-parameter-group-name custom_param_group
  --parameter-name-values "ParameterName=rename-commands,  ParameterValue='flushall restrictedflushall'" --region region
  ```

  在本示例中，*rename-commands* 参数用于将 `flushall` 命令重命名为 `restrictedflushall`。

  要重命名多个命令，请使用以下操作：

  ```
  aws elasticache modify-cache-parameter-group --cache-parameter-group-name custom_param_group
  --parameter-name-values "ParameterName=rename-commands,  ParameterValue='flushall restrictedflushall flushdb restrictedflushdb''" --region region
  ```

  要还原任何更改，请重新运行该命令并从要保留的 `ParameterValue` 列表中排除任何重命名的值，如下所示：

  ```
  aws elasticache modify-cache-parameter-group --cache-parameter-group-name custom_param_group
  --parameter-name-values "ParameterName=rename-commands,  ParameterValue='flushall restrictedflushall'" --region region
  ```

  在本示例中，`flushall` 命令将重命名为 `restrictedflushall`，而任何其他重命名的命令将恢复为其原始命令名称。
**注意**  
在重命名命令时，您将受到以下限制：  
所有重命名的命令都应该是字母数字。
新命令名称的最大长度为 20 个字母数字字符。
重命名命令时，请确保更新与集群关联的参数组。
要完全阻止命令的使用，请使用关键字 `blocked`，如下所示：  

    ```
    aws elasticache modify-cache-parameter-group --cache-parameter-group-name custom_param_group
    --parameter-name-values "ParameterName=rename-commands,  ParameterValue='flushall blocked'" --region region
    ```

  有关参数更改以及有资格重命名的命令列表的更多信息，请参阅[Redis OSS 5.0.3 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.5-0-3)。
+ Redis OSS Streams：这模拟日志数据结构，允许创建者实时追加新项目。它还允许使用者以阻塞或非阻塞方式使用消息。Streams 还允许代表一组客户端的使用者组以合作方式使用同一消息流的不同部分，类似于 [Apache Kafka](https://kafka.apache.org/documentation/)。有关更多信息，请参阅[流](https://valkey.io/topics/streams-intro)。
+ 支持一系列流命令，例如 `XADD`、`XRANGE` 和 `XREAD`。有关更多信息，请参阅[流命令](https://valkey.io/commands/#stream)。
+ 大量新参数和重命名的参数。有关更多信息，请参阅 [Redis OSS 5.0.0 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.5.0)。
+ 一个新的 Redis OSS 指标 `StreamBasedCmds`。
+ Redis OSS 节点的快照时间略快一些。

**重要**  
ElastiCache 已从 [Redis OSS 开源版本](https://github.com/redis/redis/blob/5.0/00-RELEASENOTES) 5.0.1 向后移植了两个严重的错误修复。下面列出了它们：  
在一些密钥过期后，RESTORE 将不匹配回复。
`XCLAIM` 命令可能会返回错误的条目或使协议不同步。
这两个错误修复都包含在 ElastiCache 对 Redis OSS 引擎版本 5.0.0 的 Redis OSS 支持中，并将在未来的版本更新中使用。

有关更多信息，请参阅 [Redis OSS 上的 Redis OSS 5.0.6 发行说明](https://github.com/redis/redis/blob/5.0/00-RELEASENOTES)。 GitHub

### ElastiCache 适用于 Redis OSS 的 5.0.5 版（已弃用，使用版本 5.0.6）
<a name="redis-version-5-0.5"></a>

亚马逊 ElastiCache 推出了 ElastiCache 适用于 Redis OSS 引擎的下一个版本；。它包括在所有计划内操作期间 ElastiCache 对自动故障转移群集的在线配置更改。现在您可以扩展集群，升级 Redis OSS 引擎版本，并应用补丁和维护更新，同时集群可保持在线并继续处理传入请求。它还包括错误修复。

有关更多信息，请参阅 [Redis OSS 上的 Redis OSS 5.0.5 发行说明](https://github.com/redis/redis/blob/5.0/00-RELEASENOTES)。 GitHub

### ElastiCache 适用于 Redis OSS 的 5.0.4 版（已弃用，使用版本 5.0.6）
<a name="redis-version-5-0.4"></a>

亚马逊 ElastiCache 推出了支持的 Redis OSS 引擎的下一个版本。 ElastiCache其中包含以下增强功能：
+ 特殊情况下的引擎稳定性保证。
+ 改进的 Hyperloglog 错误处理。
+ 增强的握手命令以进行可靠的复制。
+ 通过 `XCLAIM` 命令进行一致的消息交付跟踪。
+ 对象中改进的 `LFU `字段管理。
+ 使用 `ZPOP` 时增强的事务管理。

有关更多信息，请参阅 [Redis OSS 上的 Redis OSS 5.0.4 发行说明](https://github.com/redis/redis/blob/5.0/00-RELEASENOTES)。 GitHub

### ElastiCache 适用于 Redis OSS 的 5.0.3 版（已弃用，使用版本 5.0.6）
<a name="redis-version-5-0.3"></a>

亚马逊 ElastiCache 推出了 ElastiCache 适用于Redis OSS引擎的下一个版本，其中包括错误修复。

### ElastiCache 适用于 Redis OSS 的 5.0.0 版（已弃用，使用版本 5.0.6）
<a name="redis-version-5-0"></a>

亚马逊 ElastiCache 推出了 Redis OSS 引擎 ElastiCache 的下一个主要版本。 ElastiCache 适用于 Redis OSS 的 5.0.0 版本支持以下改进：
+ Redis OSS Streams：这模拟日志数据结构，允许创建者实时追加新项目。它还允许使用者以阻塞或非阻塞方式使用消息。Streams 还允许代表一组客户端的使用者组以合作方式使用同一消息流的不同部分，类似于 [Apache Kafka](https://kafka.apache.org/documentation/)。有关更多信息，请参阅[流](https://valkey.io/topics/streams-intro)。
+ 支持一系列流命令，例如 `XADD`、`XRANGE` 和 `XREAD`。有关更多信息，请参阅[流命令](https://valkey.io/commands/#stream)。
+ 大量新参数和重命名的参数。有关更多信息，请参阅 [Redis OSS 5.0.0 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.5.0)。
+ 一个新的 Redis OSS 指标 `StreamBasedCmds`。
+ Redis OSS 节点的快照时间略快一些。

### ElastiCache 适用于 Redis OSS 的 4.0.10 版（增强版）
<a name="redis-version-4-0-10"></a>

亚马逊 ElastiCache 推出了 Redis OSS 引擎 ElastiCache 的下一个主要版本。 ElastiCache 适用于 Redis OSS 的 4.0.10 版本支持以下改进：
+ 在线集群大小调整和加密都集中在一个 ElastiCache 版本中。有关更多信息，请参阅下列内容：
  + [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)
  + [Valkey 或 Redis OSS（已启用集群模式）的离线重新分片](scaling-redis-cluster-mode-enabled.md#redis-cluster-resharding-online)
  + [Amazon ElastiCache 中的数据安全性](encryption.md)
+ 许多新参数。有关更多信息，请参阅 [Redis OSS 4.0.10 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.4-0-10)。
+ 支持内存命令系列，如 `MEMORY`。有关更多信息，请参阅[命令](https://valkey.io/commands)（在 MEMO 上搜索）。
+ 支持在线内存碎片整理，从而可实现更高效的内存使用率并可为您的数据提供更多内存。
+ Support 支持异步刷新和删除。 ElastiCache for Redis OSS 支持诸如`FLUSHDB`和之类的命令`UNLINK`，`FLUSHALL`以便在与主线程不同的线程中运行。这样做可以异步释放内存，从而有助于提高应用程序的性能和响应速度。
+ 一个新的 Redis OSS 指标 `ActiveDefragHits`。有关更多信息，请参阅 [Redis OSS 的指标](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/CacheMetrics.Redis.html)。

运行 Redis OSS ElastiCache 版本 3.2.10 的 Redis OSS（已禁用集群模式）用户可以使用控制台通过在线升级来升级其集群。


**比较 ElastiCache 集群大小调整和加密支持**  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/engine-versions.html)

### 已经终止生命期周期（EOL）版本（3.x）
<a name="redis-version-3-2-10-scheduled-eol"></a>

#### ElastiCache 适用于 Redis OSS 的 3.2.10 版（增强版）
<a name="redis-version-3-2-10"></a>

亚马逊 ElastiCache 推出了 Redis OSS 引擎 ElastiCache 的下一个主要版本。 ElastiCache 适用于 Redis OSS 的 3.2.10 版（增强）引入了在线集群大小调整功能，以便在集群继续处理传入请求的同时向集群添加或删除分片。 I/O ElastiCache 对于 Redis OSS 3.2.10，用户除了能够加密数据外，还拥有早期 Redis OSS 版本的所有功能。此功能目前仅在版本 3.2.6 中可用。


**比较 R ElastiCache edis OSS 的 3.2.6 和 3.2.10 版本**  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/engine-versions.html)

有关更多信息，请参阅下列内容：
+ [Valkey 或 Redis OSS（已启用集群模式）的离线重新分片](scaling-redis-cluster-mode-enabled.md#redis-cluster-resharding-online)
+ [在线集群大小调整](best-practices-online-resharding.md)

#### ElastiCache 适用于 Redis OSS 的 3.2.6 版（增强版）
<a name="redis-version-3-2-6"></a>

亚马逊 ElastiCache 推出了 Redis OSS 引擎 ElastiCache 的下一个主要版本。 ElastiCache 适用于 Redis OSS 的 3.2.6 版用户可以访问早期 Redis OSS 版本的所有功能，还可以选择加密其数据。有关更多信息，请参阅下列内容：
+ [ElastiCache 传输中加密 (TLS)](in-transit-encryption.md)
+ [静态加密 ElastiCache](at-rest-encryption.md)
+ [Amazon 合规性验证 ElastiCache](elasticache-compliance.md)

#### ElastiCache 适用于 Redis OSS 的 3.2.4 版（增强版）
<a name="redis-version-3-2-4"></a>

亚马逊 ElastiCache 版本 3.2.4 引入了 Redis OSS 引 ElastiCache 擎的下一个主要版本。 ElastiCache 3.2.4 用户可以使用早期 Redis OSS 版本的所有功能，还可以选择在*集群模式或*非*集群模式下*运行。下表进行了汇总。


**Redis OSS 3.2.4 非集群模式与集群模式对比**  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/engine-versions.html)

**备注：**
+ **分区** – 将数据拆分到 2 到 500 个节点组（分片），为每个节点组提供复制支持的能力。
+ **地理空间索引** – Redis OSS 3.2.4 推出了对通过 6 条 GEO 命令执行地理空间索引的支持。有关更多信息，请参阅“Valkey 命令”页面（针对 GEO 进行筛选）上的 Redis OSS GEO\$1 命令文档[命令：GEO](http://valkey.io/commands#geo)。

有关其他的 Redis OSS 3 功能的信息，请参阅 [Redis OSS 3.2 发布说明](https://github.com/redis/redis/blob/3.2/00-RELEASENOTES)和 [Redis OSS 3.0 发布说明](https://github.com/redis/redis/blob/3.0/00-RELEASENOTES)。

当前 ElastiCache 托管的 Valkey 或 Redis OSS（已启用集群模式）不支持以下 Redis OSS 3.2 功能：
+ 副本迁移
+ 集群重新平衡
+ Lua 调试程序

ElastiCache 禁用以下 Redis OSS 3.2 管理命令：
+ `cluster meet`
+ `cluster replicate`
+ `cluster flushslots`
+ `cluster addslots`
+ `cluster delslots`
+ `cluster setslot`
+ `cluster saveconfig`
+ `cluster forget`
+ `cluster failover`
+ `cluster bumpepoch`
+ `cluster set-config-epoch`
+ `cluster reset`

有关 Redis OSS 3.2.4 参数的信息，请参阅[Redis OSS 3.2.4 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.3-2-4)。

### 已经终止生命期周期（EOL）版本（2.x）
<a name="redis-version-2-x-eol"></a>

#### ElastiCache 适用于 Redis OSS 的 2.8.24 版（增强版）
<a name="redis-version-2-8-24"></a>

自版本 2.8.23 起增加的 Redis OSS 改进功能包括错误修复和针对错误内存访问地址的记录功能。有关更多信息，请参阅 [Redis OSS 2.8 发布说明](https://github.com/redis/redis/blob/2.8/00-RELEASENOTES)。

#### ElastiCache 适用于 Redis OSS 的 2.8.23 版（增强版）
<a name="redis-version-2-8-23"></a>

自版本 2.8.22 起增加的 Redis OSS 改进功能包括错误修复。有关更多信息，请参阅 [Redis OSS 2.8 发布说明](https://github.com/redis/redis/blob/2.8/00-RELEASENOTES)。此版本还包括对新参数 `close-on-slave-write` 的支持；如果启用该参数，尝试写入只读副本的客户端将会断开连接。

有关 Redis OSS 2.8.23 参数的更多信息，请参阅用户指南[Redis OSS 2.8.23（加强版）增加的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.2-8-23)中的。 ElastiCache 

#### ElastiCache 适用于 Redis OSS 的 2.8.22 版（增强版）
<a name="redis-version-2-8-22"></a>

自版本 2.8.21 起增加的 Redis OSS 改进功能包括：
+ 支持无分支备份和同步，使您能够为备份开销分配更少内存并为应用程序分配更多内存。有关更多信息，请参阅 [如何实施同步和备份](Replication.Redis.Versions.md)。此无分支过程会影响延迟和吞吐量。当存在高写入吞吐量时，如果副本重新同步，则在整个同步过程中将无法访问副本。
+ 如果存在故障转移，由于副本将尽可能执行与主集群的部分同步而不是执行完整同步，因此复制组现在能够更快地恢复。此外，主集群和副本在同步期间不再使用磁盘，并将进一步加快速度。
+ Support 支持两个新 CloudWatch 指标。
  + `ReplicationBytes` – 复制组的主集群发送到只读副本的字节数。
  + `SaveInProgress` – 一个指示是否有后台保存进程正在运行的二进制值。

   有关更多信息，请参阅 [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)。
+ 修复了复制 PSYNC 行为中的许多关键 Bug。有关更多信息，请参阅 [Redis OSS 2.8 发布说明](https://github.com/redis/redis/blob/2.8/00-RELEASENOTES)。
+ 为了在多可用区复制组中保持增强的复制性能并提高集群稳定性，不再支持非ElastiCache 副本。
+ 为了提高主集群与复制组中的副本之间的数据一致性，该副本不再移出独立于主集群的密钥。
+ Redis OSS 版本 2.8.22 及更高版本不支持 Redis OSS 配置变量 `appendonly` 和 `appendfsync`。
+ 在内存不足的情况下，具有较大的输出缓冲区的客户端可能会与副本集群断开。如果已断开连接，则客户端需要重新连接。此类情况最有可能在 PUBSUB 客户端上出现。

#### ElastiCache 适用于 Redis OSS 的 2.8.21 版
<a name="redis-version-2-8-21"></a>

自版本 2.8.19 起增加的 Redis OSS 改进功能包括大量错误修复。有关更多信息，请参阅 [Redis OSS 2.8 发布说明](https://github.com/redis/redis/blob/2.8/00-RELEASENOTES)。

#### ElastiCache 适用于 Redis OSS 的 2.8.19 版本
<a name="redis-version-2-8-19"></a>

自版本 2.8.6 起增加的 Redis OSS 改进功能包括：
+ Support fo HyperLogLog r. 有关更多信息，请参阅 [Redis OSS 新数据结构：HyperLogLog](http://antirez.com/news/75)。
+ 现在，经过排序的集数据类型通过新命令 `ZRANGEBYLEX`、`ZLEXCOUNT` 和 `ZREMRANGEBYLEX` 支持字典顺序范围查询。
+ 为了防止主节点向副本节点发送陈旧数据，如果后台保存 (`bgsave`) 子进程中止，则主同步会失败。
+ 对*HyperLogLogBasedCommands* CloudWatch指标的 Support。有关更多信息，请参阅 [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)。

#### ElastiCache 适用于 Redis OSS 的 2.8.6 版本
<a name="redis-version-2-8-6"></a>

自版本 2.6.13 起增加的 Redis OSS 改进功能包括：
+ 提高了只读副本的弹性和容错性能。
+ 支持部分重新同步。
+ 支持必须始终可用的只读副本的用户定义最小数目。
+ 完全支持发布/订阅 – 就服务器上发生的事件通知客户端。
+ 自动检测主节点故障并将主节点故障转移至辅助节点。

#### ElastiCache 适用于 Redis OSS 的 2.6.13 版本
<a name="redis-version-2-6-13"></a>

ElastiCache Redis OSS 的 2.6.13 版本是支持 Redis OSS ElastiCache 的初始版本。Redis OSS ElastiCache 版本 2.6.13 不支持多可用区。

## ElastiCache 适用于 Redis OSS 的版本生命周期终止时间表
<a name="deprecated-engine-versions"></a>

本部分定义了较早的主要版本在宣布时的生命周期终止（EOL）日期。这样有助于您为将来做出版本和升级决策。

**注意**  
ElastiCache 不推荐使用 Redis OSS 的 5.0.0 到 5.0.5 版本。使用版本 5.0.6 或更高版本。

下表显示了 Redis OSS 引擎 ElastiCache 的[扩展支持](extended-support.md)时间表。

**扩展支持和生命周期终止时间表**


| 主要引擎版本 | 标准支持终止日期 | 扩展支持开始日期（第 1 年 Premium） | 扩展支持开始日期（第 2 年 Premium） | 扩展支持开始日期（第 3 年 Premium） | 扩展支持终止日期和版本 EOL | 
| --- | --- | --- | --- | --- | --- | 
| Redis OSS v4 | 1/31/2026 | 2026 年 1 月 2 日 | 2027 年 1 月 2 日 | 2028 年 1 月 2 日 | 1/31/2029 | 
| Redis OSS v5 | 1/31/2026 | 2026 年 1 月 2 日 | 2027 年 1 月 2 日 | 2028 年 1 月 2 日 | 1/31/2029 | 
| Redis OSS v6 | 1/31/2027 | 2027 年 1 月 2 日 | 2028 年 1 月 2 日 | 2029 年 1 月 2 日 | 1/31/2030 | 

下表汇总了每个版本及其宣布的生命周期终止日期，以及推荐的升级目标版本。

**已经终止生命周期**


| 源主要版本 | 源次要版本 | 建议升级目标 | 生命周期终止日期 | 
| --- | --- | --- | --- | 
|  版本 3 |  3.2.4、3.2.6 和 3.2.10  |  v6.2 或更高版本  对于 US-ISO-EAST -1、 US-ISO-WEST -1 和 US-ISOB-EAST -1 区域，我们建议使用 5.0.6 或更高版本。   |  2023 年 7 月 31 日  | 
|  版本 2  |  2.8.24、2.8.23、2.8.22、2.8.21、2.8.19、2.8.12、2.8.6、2.6.13  |  v6.2 或更高版本  对于 US-ISO-EAST -1、 US-ISO-WEST -1 和 US-ISOB-EAST -1 区域，我们建议使用 5.0.6 或更高版本。   |  2023 年 1 月 13 日  | 

## 支持 Mem ElastiCache cached 版本
<a name="supported-engine-versions-mc"></a>

ElastiCache 支持以下 Memcached 版本和升级到更新的版本。如果升级到更新的版本，请关注那些会导致升级失败的先决条件。

**Topics**
+ [

### ElastiCache 适用于 Memcached 的 1.6.22 版
](#memcached-version-1-6-22)
+ [

### ElastiCache 适用于 Memcached 的 1.6.17 版
](#memcached-version-1-6-17)
+ [

### ElastiCache 适用于 Memcached 的 1.6.12 版
](#memcached-version-1-6-12)
+ [

### ElastiCache 适用于 Memcached 的 1.6.6
](#memcached-version-1-6-6)
+ [

### ElastiCache 适用于 Memcached 的 1.5.16 版本
](#memcached-version-1-5-16)
+ [

### ElastiCache 适用于 Memcached 的 1.5.10 版
](#memcached-version-1-5-10)
+ [

### ElastiCache 适用于 Memcached 的 1.4.34 版
](#memcached-version-1-4-34)
+ [

### ElastiCache 适用于 Memcached 的 1.4.33 版
](#memcached-version-1-4-33)
+ [

### ElastiCache 适用于 Memcached 的 1.4.24 版
](#memcached-version-1-4-24)
+ [

### ElastiCache 适用于 Memcached 的 1.4.14 版
](#memcached-version-1-4-14)
+ [

### ElastiCache 适用于 Memcached 的 1.4.5
](#memcached-version-1-4-5)

### ElastiCache 适用于 Memcached 的 1.6.22 版
<a name="memcached-version-1-6-22"></a>

ElastiCache 对于适用于 Memcached 的 Memcached 版本 1.6.22，增加了对 Memcached 版本 1.6.22 的支持。该版本未包含任何新功能，但包含对 [Memcached 1.6.18](https://github.com/memcached/memcached/wiki/ReleaseNotes1618) 的错误修复和累积更新。

欲了解更多信息，请参阅 Memcached 上的 [ReleaseNotes1622](https://github.com/memcached/memcached/wiki/ReleaseNotes1622)。 GitHub

### ElastiCache 适用于 Memcached 的 1.6.17 版
<a name="memcached-version-1-6-17"></a>

ElastiCache 对于适用于 Memcached 的 Memcached 版本 1.6.17，增加了对 Memcached 引擎版本 1.6.17 的支持。该版本未包含任何新功能，但包含对 [Memcached 1.6.17](https://github.com/memcached/memcached/wiki/ReleaseNotes1617) 的错误修复和累积更新。

欲了解更多信息，请参阅 Memcached 上的 [ReleaseNotes1617](https://github.com/memcached/memcached/wiki/ReleaseNotes1617)。 GitHub

### ElastiCache 适用于 Memcached 的 1.6.12 版
<a name="memcached-version-1-6-12"></a>

ElastiCache 对于适用于 Memcached 的 Memcached 版本 1.6.12，增加了对 Memcached 引擎 1.6.12 和传输中加密的支持。它包括 [Memcached 1.6.6](https://github.com/memcached/memcached/wiki/ReleaseNotes166) 中的错误修复和累积更新。

有关更多信息，请参阅 Memcached 上的 [ReleaseNotes1612](https://github.com/memcached/memcached/wiki/ReleaseNotes1612)。 GitHub

### ElastiCache 适用于 Memcached 的 1.6.6
<a name="memcached-version-1-6-6"></a>

ElastiCache 适用于 Memcached 版本 1.6.6 的 Memcached 增加了对 Memcached 版本 1.6.6 的支持。它不包含任何新功能，但确实包含错误修复和来自 [Memcached 1.](https://github.com/memcached/memcached/wiki/ReleaseNotes1.5.16) 5.16 的累积更新。 ElastiCache 适用于 Memcached 不包括对 [Ext](https://memcached.org/extstore) store 的支持。

有关更多信息，请参阅 Memcached 上 GitHub的 [ReleaseNotes166](https://github.com/memcached/memcached/wiki/ReleaseNotes166)。

### ElastiCache 适用于 Memcached 的 1.5.16 版本
<a name="memcached-version-1-5-16"></a>

ElastiCache 适用于 Memcached 的 1.5.16 版本增加了对 Memcached 版本 1.5.16 的支持。它没有包含任何新功能，但包含了 [Memcached 1.5.14](https://github.com/memcached/memcached/wiki/ReleaseNotes1514) 和 [Memcached 1.5.15](https://github.com/memcached/memcached/wiki/ReleaseNotes1515) 中的错误修复和累积更新。

有关更多信息，请参阅 [Memcached 上的 Memcached 1.5.16 版本说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1516)。 GitHub

### ElastiCache 适用于 Memcached 的 1.5.10 版
<a name="memcached-version-1-5-10"></a>

ElastiCache 适用于 Memcached 的 1.5.10 版本支持以下 Memcached 功能：
+ 自动 Slab 重新平衡。
+ 使用 `murmur3` 算法实现更快的哈希表查找。
+ 经过分段的 LRU 算法。
+ LRU 爬网程序到后台回收内存。
+ `--enable-seccomp`：一个编译时选项。

它还引入了 `no_modern` 和 `inline_ascii_resp` 参数。有关更多信息，请参阅 [Memcached 1.5.10 参数更改](ParameterGroups.Engine.md#ParameterGroups.Memcached.1-5-10)。

自 1.4.34 ElastiCache 版本以来，为 Memcached 添加的内存缓存改进包括以下内容：
+ 累积修复，例如 ASCII multigets、CVE-2017-9951 和 `metadumper` 的限制爬网。
+ 通过在达到连接限制时关闭连接来改善连接管理。
+ 改进了超过 1MB 的项大小的项大小管理。
+ 通过将每个项的内存需求减少几个字节来提高性能和减少内存开销。

有关更多信息，请参阅 [Memcached 上的 Memcached 1.5.10 版本说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1510)。 GitHub

### ElastiCache 适用于 Memcached 的 1.4.34 版
<a name="memcached-version-1-4-34"></a>

ElastiCache 适用于 Memcached 的 1.4.34 版本未在 1.4.33 版本中添加任何新功能。1.4.34 版是一个错误修复版本，它大于一般的此类版本。

有关更多信息，请参阅 [Memcached 上的 Memcached 1.4.34 版本说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1434)。 GitHub

### ElastiCache 适用于 Memcached 的 1.4.33 版
<a name="memcached-version-1-4-33"></a>

自 v1.4.24 起增加的改进功能包括：
+ 能够为特定 slab 类、slab 类列表或所有 slab 类转储所有元数据。有关更多信息，请参阅 [Memcached 1.4.31 发布说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1431)。
+ 改进对超过 1 MB 默认值的大项目的支持。有关更多信息，请参阅 [Memcached 1.4.29 发布说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1429)。
+ 能够指定在要求关闭客户端之前，客户端可以保持空闲的时间长度。

  能够动态增加可供 Memcached 使用的内存量而无需重新启动集群。有关更多信息，请参阅 [Memcached 1.4.27 发布说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1427)。
+ 现在支持 `fetchers`, `mutations` 和 `evictions` 的日志记录。有关更多信息，请参阅 [Memcached 1.4.26 发布说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1426)。
+ 释放的内存可回收到全局池中并重新分配到新的 slab 类。有关更多信息，请参阅 [Memcached 1.4.25 发布说明](https://github.com/memcached/memcached/wiki/ReleaseNotes1425)。
+ 修复了几个 Bug。
+ 一些新的命令和参数。有关列表，请参阅[Memcached 1.4.33 增加的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached.1-4-33)。

### ElastiCache 适用于 Memcached 的 1.4.24 版
<a name="memcached-version-1-4-24"></a>

自 v1.4.14 起增加的改进功能包括：
+ 使用后台进程的最近最少使用（LRU）的管理。
+ 增加了使用 *jenkins* 或 *murmur3* 作为哈希算法的选项。
+ 一些新的命令和参数。有关列表，请参阅[Memcached 1.4.24 增加的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached.1-4-24)。
+ 修复了几个 Bug。

### ElastiCache 适用于 Memcached 的 1.4.14 版
<a name="memcached-version-1-4-14"></a>

自 v1.4.5 起增加的改进功能包括：
+ 增强了 Slab 重新平衡功能。
+ 性能和可扩展性方面的改进。
+ 引入了 *touch* 命令，可在不获取的情况下更新现有项目的过期时间。
+ Auto Discovery – 客户端程序功能，可以自动确定集群中的所有缓存节点，以及启动和维护与所有这些节点的连接。

### ElastiCache 适用于 Memcached 的 1.4.5
<a name="memcached-version-1-4-5"></a>

ElastiCache 适用于 Memcached 的 1.4.5 版本是亚马逊支持的 Memcached 的初始引擎和版本 ElastiCache 。

# Valkey 的主要引擎版本行为和兼容性差异
<a name="VersionManagementConsiderations-valkey"></a>

Valkey 7.2.6 与 Redis OSS 7.2.4 之前的版本存在类似的兼容性差异。有关支持的最新版本支持的 Valkey，请参阅[支持的引擎和版本](VersionManagement.md#supported-engine-versions)。

有关 Valkey 7.2 版本的更多信息，请参阅 GitHub 上有关 Valkey 的 [Redis OSS 7.2.4 发布说明](https://github.com/valkey-io/valkey/blob/d2c8a4b91e8c0e6aefd1f5bc0bf582cddbe046b7/00-RELEASENOTES)（Valkey 7.2 包括从 Redis OSS 到 7.2.4 版本的所有更改）和 [Valkey 7.2 发布说明](https://github.com/valkey-io/valkey/blob/7.2/00-RELEASENOTES)。

以下是 Valkey 7.2 和 Redis OSS 7.1（或 7.0）之间可能发生的重大行为变化：
+ 冻结时间采样在命令执行期间和在脚本中进行。
+ 当对应的键不再存在时，阻塞的流命令在解除阻塞时会返回不同的错误代码（返回 -NOGROUP 或 -WRONGTYPE，而不是返回 -UNBLOCKED）。
+ 脚本的客户端跟踪现在可以跟踪脚本读取的键值，而不是由 EVAL/FCALL 调用方声明的键。

# Redis OSS 的主要引擎版本行为和兼容性差异
<a name="VersionManagementConsiderations"></a>

**重要**  
以下页面的结构设计为指出版本之间的所有不兼容性差异，并告知您在升级到较新版本时应考虑的任何注意事项。此列表包含升级时可能遇到的任何版本不兼容问题。  
您可以直接从当前 Redis OSS 版本升级到可用的最新 Redis OSS 版本，无需连续升级。例如，您可以直接从 Redis OSS 版本 3.0 升级到版本 7.0。

Redis OSS 版本由包含主要、次要和补丁组件的语义版本标识。例如，在 Redis OSS 4.0.10 中，主要版本为 4，次要版本为 0，补丁版本为 10。这些值通常根据以下约定递增：
+ 主要版本针对 API 不兼容的更改
+ 次要版本针对以向后兼容的方式添加的新功能
+ 补丁版本针对向后兼容的错误修复和非功能性更改

我们建议始终使用给定 **major.minor** 版本中的最新补丁版本，以获得最新的性能和稳定性改进。从 Redis OSS 的 6.0 ElastiCache 版本开始， ElastiCache 将为每个 Redis OSS 次要版本提供一个版本，而不是提供多个补丁版本。 ElastiCache将自动管理正在运行的集群的补丁版本，从而确保提高性能和增强安全性。

我们还建议定期升级到最新的主要版本，因为大多数主要改进都不会向后移植到旧版本。随着新Amazon区域的可用性 ElastiCache 扩展， ElastiCache 对于 Redis，OSS 支持新区域当时最新的两个**主要.minor** 版本。**例如，如果启动了一个新Amazon区域，而 Redis OSS 的最新主要.minor ElastiCache 版本**为 7.0** 和 **6.2**，则 ElastiCache 将在新区域中支持 Redis OSS **7.0** 和 6.2 版本。**Amazon随着适用于 Redis OSS ElastiCache 的较新 major.minor 版本的发布， ElastiCache 将继续增加对新发布版本的支持。要了解有关为其选择区域的更多信息 ElastiCache，请参阅[选择区域和可用区](https://docs.amazonaws.cn/AmazonElastiCache/latest/red-ug/RegionsAndAZs.html#SupportedRegions)。

在进行跨主版本或次版本的升级时，请考虑以下列表，其中包括随着时间的推移随 Redis OSS 发布的行为和向后不兼容更改。

## Redis OSS 7.0 行为和向后不兼容更改
<a name="VersionManagementConsiderations-redis70"></a>

有关更改的完整列表，请参阅 [Redis OSS 7.0 发布说明](https://raw.githubusercontent.com/redis/redis/7.0/00-RELEASENOTES)。
+ `SCRIPT LOAD` 和 `SCRIPT FLUSH` 不再传播到副本。如果您需要脚本具有一定的持久性，我们建议您考虑使用 [Redis OSS 函数](https://valkey.io/topics/functions-intro/)。
+ 现在，对于新的 ACL 用户，发布订阅通道默认处于屏蔽状态。
+ `STRALGO` 命令已替换为 `LCS` 命令。
+ `ACL GETUSER` 的格式已更改，因此所有字段都显示标准访问字符串模式。如果您使用 `ACL GETUSER` 实现了自动化，则应验证它是否可以处理任何一种格式。
+ `SELECT`、`WAIT`、`ROLE`、`LASTSAVE`、`READONLY`、`READWRITE` 和 `ASKING` 的 ACL 类别已更改。
+ `INFO` 命令现在显示每个子命令的命令统计信息，而不是在顶级容器命令中显示命令统计信息。
+ 在某些边缘情况下，`LPOP`、`RPOP`、`ZPOPMIN` 和 `ZPOPMAX` 命令的返回值已更改。如果您使用这些命令，则应查看发布说明并评估是否受到影响。
+ `SORT` 和 `SORT_RO` 命令现在需要访问整个键空间才能使用 `GET` 和 `BY` 参数。

## Redis OSS 6.2 行为和向后不兼容更改
<a name="VersionManagementConsiderations-redis62"></a>

有关更改的完整列表，请参阅 [Redis OSS 6.2 发布说明](https://raw.githubusercontent.com/redis/redis/6.2/00-RELEASENOTES)。
+ `TIME`、`ECHO`、`ROLE` 和 `LASTSAVE` 命令的 ACL 标志已更改。这可能会导致先前允许的命令被拒绝，反之亦然。
**注意**  
这些命令不会修改或授予对数据的访问权限。
+ 从 Redis OSS 6.0 升级时，从 lua 脚本的地图响应返回的 key/value 配对的顺序会发生变化。如果您的脚本使用 `redis.setresp()` 或返回映射（Redis OSS 6.0 中的新功能），请考虑脚本可能会在升级时发生中断所带来的影响。

## Redis OSS 6.0 行为和向后不兼容更改
<a name="VersionManagementConsiderations-redis60"></a>

有关更改的完整列表，请参阅 [Redis OSS 6.0 发布说明](https://raw.githubusercontent.com/redis/redis/6.0/00-RELEASENOTES)。
+ 允许的最大数据库数量已从 120 万减少到 1 万个。默认值为 16，我们不鼓励使用比这大许多的值，因为我们发现这样会带来性能和内存问题。
+ 将`AutoMinorVersionUpgrade`参数设置为 yes， ElastiCache 将通过自助更新管理次要版本升级。这将通过自助服务更新活动借助标准客户通知渠道进行处理。有关更多信息，请参阅[中的自助服务更新 ElastiCache](Self-Service-Updates.md)。

## Redis OSS 5.0 行为和向后不兼容更改
<a name="VersionManagementConsiderations-redis50"></a>

有关更改的完整列表，请参阅 [Redis OSS 5.0 发布说明](https://raw.githubusercontent.com/redis/redis/5.0/00-RELEASENOTES)。
+ 脚本由效果复制，而不是在副本上重新执行脚本。这通常可以提高性能，但可能会增加主副本和副本之间复制的数据量。可以选择恢复到之前的行为，该选项仅在 Redis OSS 的 5.0 ElastiCache 版本中可用。
+ 如果您是从 Redis OSS 4.0 升级，LUA 脚本中的某些命令将以与早期版本不同的顺序返回参数。在 Redis OSS 4.0 中，为了使响应具有确定性，Redis OSS 会按字典顺序对某些响应进行排序，当脚本通过效果复制时，这种排序不适用。
+ 在 Redis OSS 5.0.3 及更高版本中， ElastiCache 对于 Redis，OSS 会将一些 IO 工作卸载到实例类型超过 4 的后台内核。 VCPUs这可能会改变 Redis OSS 的性能特性并更改某些指标的值。有关更多信息，请参阅 [应监控哪些指标？](CacheMetrics.WhichShouldIMonitor.md)，以了解您是否需要更改要关注的指标。

## Redis OSS 4.0 行为和向后不兼容更改
<a name="VersionManagementConsiderations-redis40"></a>

有关更改的完整列表，请参阅 [Redis OSS 4.0 发布说明](https://raw.githubusercontent.com/redis/redis/4.0/00-RELEASENOTES)。
+ 慢日志现在记录两个额外参数，即客户端名称和地址。除非您明确依赖包含 3 个值的每个慢日志条目，否则此更改应向后兼容。
+ `CLUSTER NODES` 命令现在返回的格式略有不同，不向后兼容。我们建议客户端不要使用此命令来了解集群中存在的节点，而应使用 `CLUSTER SLOTS`。

## 已经终止生命周期
<a name="VersionManagementConsiderations-redis3x-scheduled"></a>

### Redis OSS 3.2 行为和向后不兼容更改
<a name="VersionManagementConsiderations-redis32"></a>

有关更改的完整列表，请参阅 [Redis OSS 3.2 发布说明](https://raw.githubusercontent.com/redis/redis/3.2/00-RELEASENOTES)。
+ 此版本没有兼容性更改需要调用。

有关更多信息，请参阅 [ElastiCache 适用于 Redis OSS 的版本生命周期终止时间表](engine-versions.md#deprecated-engine-versions)。

### Redis OSS 2.8 行为和向后不兼容更改
<a name="VersionManagementConsiderations-redis28"></a>

有关更改的完整列表，请参阅 [Redis OSS 2.8 发布说明](https://raw.githubusercontent.com/redis/redis/2.8/00-RELEASENOTES)。
+ 从 Redis OSS 2.8.22 开始，Redis OSS 不再支持 Redis OSS AOF。 ElastiCache 当数据需要持久保存时，我们建议使用 MemoryDB。
+ 从 Redis OSS 2.8.22 开始， ElastiCache 适用于 Redis 的 OSS 不再支持将副本附加到其中托管的主服务器。 ElastiCache升级时，外部副本将断开连接，且无法重新连接。我们建议使用 Redis OSS 6.0 中提供的客户端缓存作为外部副本的替代方案。
+ 如果键不存在，`TTL` 和 `PTTL` 命令现在返回 -2；如果键存在但没有关联的过期时间，则返回 -1。Redis OSS 2.6 和以前的版本曾经在这两种情况下都返回 -1。
+ 如果未使用任何 `STORE` 选项，`SORT` 和 `ALPHA` 现在将根据本地排序规则语言环境进行排序。

有关更多信息，请参阅 [ElastiCache 适用于 Redis OSS 的版本生命周期终止时间表](engine-versions.md#deprecated-engine-versions)。

# 使用基于节点的集群时的升级注意事项
<a name="VersionManagement-upgrade-considerations"></a>

**注意**  
以下注意事项仅在升级基于节点的集群时适用。它们不适用于 ElastiCache 无服务器。

**Valkey 和 Redis OSS 注意事项**

在升级基于节点的 Valkey 或 Redis OSS 集群时，请注意以下事项。
+ 引擎版本管理的设计使您可以尽可能多地控制修补的发生方式。但是，如果系统或缓存软件中出现严重安全漏洞，则 ElastiCache 保留代表您修补集群的权利。
+ 从 Valkey ElastiCache 的 7.2 ElastiCache 版和 Redis OSS 的 6.0 版开始， ElastiCache 将为每个次要版本提供一个版本，而不是提供多个补丁版本。
+ 从 Redis OSS 引擎版本 5.0.6 开始，您可以在最短的停机时间内升级集群版本。集群在整个升级过程中可供读取，并在大部分升级持续时间内可供写入，但在只持续几秒钟的故障转移操作期间则例外。
+ 您也可以使用低于 5.0.6 的版本升级 ElastiCache 集群。所涉及的过程相同，但在 DNS 传播期间可能会导致更长的故障转移时间（30 秒 - 1 分钟）。
+ 从 Redis OSS 7 开始， ElastiCache 支持在 Valkey 或 Redis OSS（已禁用集群模式）和 Valkey 或 Redis OSS（启用集群模式）之间切换。
+ Amazon ElastiCache for Redis OSS 引擎升级过程旨在尽最大努力保留您的现有数据，并且需要成功复制 Redis OSS。
+ 升级引擎时， ElastiCache 将终止现有的客户端连接。为了最大限度地减少引擎升级期间的停机时间，我们建议您实施[关于 Redis OSS 客户端的最佳实践](BestPractices.Clients.redis.md)，包括错误重试和指数回退，以及关于[维护期间最大限度减少停机时间](BestPractices.MinimizeDowntime.md)的最佳实践。
+ 升级引擎时，您无法从 Valkey 或 Redis OSS（已禁用集群模式）直接升级到 Valkey 或 Redis OSS（已启用集群模式）。以下过程演示了如何从 Valkey 或 Redis OSS（已禁用集群模式）升级到 Valkey 或 Redis OSS（已启用集群模式）。

**从 Valkey 或 Redis OSS（已禁用集群模式）升级到 Valkey 或 Redis OSS（已启用集群模式）引擎版本**

  1. 备份 Valkey 或 Redis OSS（已禁用集群模式）集群或复制组。有关更多信息，请参阅 [进行手动备份](backups-manual.md)。

  1. 使用备份创建具有一个分片（节点组）的 Valkey 或 Redis OSS（已启用集群模式）集群并为其制作种子。在创建集群或复制组时，指定新的引擎版本并启用集群模式。有关更多信息，请参阅 [教程：使用外部创建的备份为新的基于节点的集群制作种子](backups-seeding-redis.md)。

  1. 删除旧 Valkey 或 Redis OSS（已禁用集群模式）集群或复制组。有关更多信息，请参阅 [删除中的集群 ElastiCache](Clusters.Delete.md)或 [删除复制组](Replication.DeletingRepGroup.md)。

  1. 将新的 Valkey 或 Redis OSS（已启用集群模式）集群或复制组扩展到所需的分片（节点组）数。有关更多信息，请参阅 [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)。
+ 升级主要引擎版本（例如从 5.0.6 升级到 6.0）时，还需要选择一个与新引擎版本兼容的新参数组。
+ 对于单个 Redis OSS 集群以及禁用了多可用区的集群，建议有足够的内存可供 Redis OSS 使用，如[确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)中所述。在这些情况下，主项在升级过程中不可用于处理服务请求。
+ 对于启用了多可用区的 Redis OSS 集群，我们还建议您在传入的写流量较低期间安排引擎升级。升级到 Redis OSS 5.0.6 或更高版本时，主集群在升级过程中仍可用于服务请求。

  将处理和修补带多个分片的集群和复制组，如下所示：
  + 将并行处理所有分片。在任何时候，仅在分片上执行一次升级操作。
  + 在每个分片中，在处理主副本之前，会先处理所有其他副本。如果一个分片中的副本较少，则可能会在处理完其他分片中的副本之前处理该分片中的主副本。
  + 在所有分片中，主节点都是按顺序处理的。一次只升级一个主节点。
+ 如果已对当前集群或复制组启用了加密，则无法升级到不支持加密的引擎版本，例如，从 3.2.6 升级到 3.2.10。

**Memcached 注意事项**

在升级基于节点的 Memcached 集群时，请注意以下事项。
+ 引擎版本管理的设计使您可以尽可能多地控制修补的发生方式。但是，如果系统或缓存软件中出现严重安全漏洞，则 ElastiCache 保留代表您修补集群的权利。
+ 由于 Memcached 引擎不支持持久化，因此 Memcached 引擎版本升级始终是一个中断性过程，将清除集群中的所有缓存数据。

# ElastiCache 最佳实践和缓存策略
<a name="BestPractices"></a>

您可以在下面找到建议的 Amazon ElastiCache 最佳实践。遵循这些最佳实践可提高您的缓存的性能和可靠性。

**Topics**
+ [

# 整体最佳实践
](WorkingWithRedis.md)
+ [

# 使用只读副本的最佳实践
](ReadReplicas.md)
+ [

# 支持的和限制的 Valkey、Memcached 和 Redis OSS 命令
](SupportedCommands.md)
+ [

# Valkey 和 Redis OSS 配置和限制
](RedisConfiguration.md)
+ [

# Valkey、Memcached 和 Redis OSS 的 IPv6 客户端示例
](network-type-best-practices.md)
+ [

# 客户端最佳实践（Valkey 和 Redis OSS）
](BestPractices.Clients.redis.md)
+ [

# 客户端最佳实践（Memcached）
](BestPractices.Clients.memcached.md)
+ [

## 启用 TLS 的双栈 ElastiCache 集群
](#network-type-configuring-tls-enabled-dual-stack)
+ [

# 管理 Valkey 和 Redis OSS 的预留内存
](redis-memory-management.md)
+ [

# 使用 Valkey 和 Redis OSS 基于节点的集群时的最佳实践
](BestPractices.SelfDesigned.md)
+ [

# Memcached 缓存策略
](Strategies.md)

# 整体最佳实践
<a name="WorkingWithRedis"></a>

您可以在下面找到有关使用 Valkey、Memcached 和 Redis OSS 接口的最佳实践的信息。 ElastiCache
+ **使用启用集群模式的配置 — 启用**集群模式允许缓存水平扩展，以实现比禁用集群模式的配置更高的存储和吞吐量。 ElastiCache serverless 仅在启用集群模式的配置中可用。
+ **使用长时间生存的连接** – 创建新连接的成本很高，而且需要花费时间和缓存中的 CPU 资源。尽可能重复使用连接（例如，使用连接池），以将此成本分摊到多条命令上。
+ **从副本读取**-如果您使用的是ElastiCache 无服务器或已预配置只读副本（基于节点的集群），请直接读取副本以实现更好的可扩展性，降低延迟。 and/or 从副本中读取的数据最终与主节点是一致的。

  在基于节点的集群中，避免将读取请求定向到单个只读副本，因为在节点出现故障时，可能暂时无法读取。将您的客户端配置为将读取请求定向到至少两个只读副本，或将读取定向到单个副本和主节点。

  在 ElastiCache 无服务器中，从副本端口 (6380) 读取会尽可能将读取定向到客户端的本地可用区，从而减少检索延迟。在故障期间，它将自动回退到其他节点。
+ **避免使用昂贵的命令** — 避免运行任何计算密 I/O 集型和密集型操作，例如`KEYS`和`SMEMBERS`命令。我们推荐此方法是因为这些操作可增加集群上的负载并能对集群的性能产生影响。改用 `SCAN` 和 `SSCAN` 命令。
+ **遵循 Lua 最佳实践** – 避免长时间运行 Lua 脚本并始终预先声明在 Lua 脚本中使用的密钥。我们建议使用此方法确定 Lua 脚本未使用跨槽命令。请确保 Lua 脚本中使用的密钥属于同一槽。
+ **使用分片 pub/sub** — 使用 Valkey 或 Redis OSS 支持高吞吐量 pub/sub 的工作负载时，我们建议你使用[分片 pub/sub](https://valkey.io/topics/pubsub/)（在 Valkey 和 Redis OSS 7 或更高版本中可用）。 pub/sub 在启用集群模式的集群中，传统模式会向集群中的所有节点广播消息，这可能会导致高电平。`EngineCPUUtilization`请注意，在 ElastiCache 无服务器的传统pub/sub commands internally use sharded pub/sub命令中。

**Topics**

# 使用只读副本的最佳实践
<a name="ReadReplicas"></a>

许多应用程序（例如会话存储、排行榜和推荐引擎）都需要高可用性，且处理的读取操作要远多于写入操作。这类应用程序通常可以容忍稍微陈旧的数据（最终一致性），意味着如果不同用户在短时间内看到相同数据的不同版本，这是可以接受的。例如：
+ 缓存的查询结果通常可以容忍稍微陈旧的数据，特别是对于可信来源位于外部的旁路缓存模式。
+ 在游戏排行榜中，分数更新延迟几秒钟通常不会对用户体验产生重大影响。
+ 对于会话存储，跨副本传播会话数据时出现一些轻微延迟通常不会影响应用程序的功能。
+ 推荐引擎通常使用历史数据分析，因此对实时一致性要求较低。

最终一致性意味着在复制过程完成后，所有副本节点最终都将返回相同的数据，且通常在毫秒内完成。对于此类用例，实现只读副本是减少从 ElastiCache实例读取时延迟的有效策略。

在 Amazon 中使用只读副本 ElastiCache 可通过以下方式显著提高性能：

**增强的读取可扩展性**
+ 将读取操作分配到多个副本节点
+ 从主节点卸载读取流量
+ 通过处理来自地理位置较近的副本的请求来降低读取延迟

**优化的主节点性能**
+ 将主节点资源专门用于写入操作
+ 减少主节点连接开销
+ 提高写入性能，并在流量高峰期保持较短的响应时间

## 在 ElastiCache 无服务器中使用从副本读取
<a name="ReadReplicas.serverless"></a>

ElastiCache serverless 为不同的一致性要求提供了两个不同的端点。这两个端点使用相同的 DNS 名称，但采用不同的端口。要使用该 read-from-replica端口，您必须通过[配置您的 VPC 的安全组和网络访问控制列表来授权从您的客户端应用程序访问](set-up.md#elasticache-install-grant-access-VPN)这两个端口。

**主端点（端口 6379）**
+ 用于需要即时一致性的操作
+ 保证读取最多的 up-to-date数据
+ 最适合关键事务和写入操作
+ 对于写入操作是必需的
+ 示例：`test-12345.serverless.use1.cache.amazonaws.com:6379`

**针对延迟进行了优化的端点（端口 6380）**
+ 针对可容忍最终一致性的读取操作进行了优化
+ 如果可能， ElastiCache Serverless 会自动将读取请求路由到客户端本地可用区中的副本节点。这种优化避免了从不同可用区的节点检索数据时产生的额外网络延迟，从而降低了整体延迟。
+ ElastiCache 如果本地节点不可用，serverless 会自动选择其他区域中的可用节点
+ 示例：`test-12345.serverless.use1.cache.amazonaws.com:6380`
+ 如果您提供“从副本读取”配置，Glide 和 Lettuce 等客户端将自动检测读取操作，并将其路由至针对延迟进行了优化的端点。如果您的客户端不支持路由配置（例如 valkey-java 和旧版 jedis），则必须定义正确的端口和客户端配置才能从副本读取。

## 在 ElastiCache Serverless 中连接到只读副本-Valkey 和 Glide
<a name="ReadReplicas.connecting-primary"></a>

以下代码片段显示了如何在 Valkey glide 库中为 ElastiCache Serverless 配置从副本读取。您无需为“从副本读取”指定端口，但需要配置路由配置 `ReadFrom.PREFER_REPLICA`。

```
package glide.examples;

import glide.api.GlideClusterClient;
import glide.api.logging.Logger;
import glide.api.models.configuration.GlideClusterClientConfiguration;
import glide.api.models.configuration.NodeAddress;
import glide.api.models.exceptions.ClosingException;
import glide.api.models.exceptions.ConnectionException;
import glide.api.models.exceptions.TimeoutException;
import glide.api.models.configuration.ReadFrom;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class ClusterExample {

    public static void main(String[] args) {
        // Set logger configuration
        Logger.setLoggerConfig(Logger.Level.INFO);

        GlideClusterClient client = null;

        try {
            System.out.println("Connecting to Valkey Glide...");

            // Configure the Glide Client
            GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder()
                .address(NodeAddress.builder()
                    .host("your-endpoint")
                    .port(6379)
                    .build())
                .useTLS(true)
                .readFrom(ReadFrom.PREFER_REPLICA)
                .build();

            // Create the GlideClusterClient
            client = GlideClusterClient.createClient(config).get();
            System.out.println("Connected successfully.");

            // Perform SET operation
            CompletableFuture<String> setResponse = client.set("key", "value");
            System.out.println("Set key 'key' to 'value': " + setResponse.get());

            // Perform GET operation
            CompletableFuture<String> getResponse = client.get("key");
            System.out.println("Get response for 'key': " + getResponse.get());

            // Perform PING operation
            CompletableFuture<String> pingResponse = client.ping();
            System.out.println("PING response: " + pingResponse.get());

        } catch (ClosingException | ConnectionException | TimeoutException | ExecutionException e) {
            System.err.println("An exception occurred: ");
            e.printStackTrace();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // Close the client connection
            if (client != null) {
                try {
                    client.close();
                    System.out.println("Client connection closed.");
                } catch (ClosingException | ExecutionException e) {
                    System.err.println("Error closing client: " + e.getMessage());
                }
            }
        }
    }
}
```

# 支持的和限制的 Valkey、Memcached 和 Redis OSS 命令
<a name="SupportedCommands"></a>

## 支持的 Valkey 和 Redis OSS 命令
<a name="SupportedCommandsRedis"></a>

**支持的 Valkey 和 Redis OSS 命令**

无服务器缓存支持以下 Valkey 和 Redis OSS 命令。除了这些命令外，还支持这些 [支持的 Valkey 和 Redis OSS 命令JSON 命令](json-list-commands.md) 命令。

有关 Bloom Filter 命令的信息，请参阅[Bloom 筛选命令](BloomFilters.md#SupportedCommandsBloom)

**位图命令**
+ `BITCOUNT`

  计算字符串中的设置位数（群体计数）。

  [了解详情](https://valkey.io/commands/bitcount/)
+ `BITFIELD`

  对字符串执行任意位字段整数运算。

  [了解详情](https://valkey.io/commands/bitfield/)
+ `BITFIELD_RO`

  对字符串执行任意只读位字段整数运算。

  [了解详情](https://valkey.io/commands/bitfield_ro/)
+ `BITOP`

  对多个字符串执行按位运算，并存储结果。

  [了解详情](https://valkey.io/commands/bitop/)
+ `BITPOS`

  查找字符串中的第一个设置（1）或清除（0）位。

  [了解详情](https://valkey.io/commands/bitpos/)
+ `GETBIT`

  按偏移量返回位值。

  [了解详情](https://valkey.io/commands/getbit/)
+ `SETBIT`

  设置或清除字符串值中偏移量处的位。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/setbit/)

**集群管理命令**
+ `CLUSTER COUNTKEYSINSLOT`

  返回哈希槽中的键数。

  [了解详情](https://valkey.io/commands/cluster-countkeysinslot/)
+ `CLUSTER GETKEYSINSLOT`

  返回哈希槽中的键名称。

  [了解详情](https://valkey.io/commands/cluster-getkeysinslot/)
+ `CLUSTER INFO`

  返回有关节点状态的信息。在无服务器缓存中，返回有关显示给客户端的单个虚拟“分片”的状态。

  [了解详情](https://valkey.io/commands/cluster-info/)
+ `CLUSTER KEYSLOT`

  返回键的哈希槽。

  [了解详情](https://valkey.io/commands/cluster-keyslot/)
+ `CLUSTER MYID`

  返回节点的 ID。在无服务器缓存中，返回有关显示给客户端的单个虚拟“分片”的状态。

  [了解详情](https://valkey.io/commands/cluster-myid/)
+ `CLUSTER NODES`

  返回节点的集群配置。在无服务器缓存中，返回有关显示给客户端的单个虚拟“分片”的状态。

  [了解详情](https://valkey.io/commands/cluster-nodes/)
+ `CLUSTER REPLICAS`

  列出主节点的副本节点。在无服务器缓存中，返回有关显示给客户端的单个虚拟“分片”的状态。

  [了解详情](https://valkey.io/commands/cluster-replicas/)
+ `CLUSTER SHARDS`

  返回集群槽与分片的映射。在无服务器缓存中，返回有关显示给客户端的单个虚拟“分片”的状态。

  [了解详情](https://valkey.io/commands/cluster-shards/)
+ `CLUSTER SLOTS`

  返回集群槽与节点的映射。在无服务器缓存中，返回有关显示给客户端的单个虚拟“分片”的状态。

  [了解详情](https://valkey.io/commands/cluster-slots/)
+ `CLUSTER SLOT-STATS`

  允许跟踪每个槽的指标，包括键数、CPU 利用率、网络输入字节数和网络输出字节数。

  [了解详情](https://valkey.io/commands/cluster-slot-stats/)
+ `READONLY`

  为与 Valkey 和 Redis OSS 集群副本节点的连接启用只读查询。

  [了解详情](https://valkey.io/commands/readonly/)
+ `READWRITE`

  为与 Valkey 或 Redis OSS 集群副本节点的连接启用只写查询。

  [了解详情](https://valkey.io/commands/readwrite/)
+ `SCRIPT SHOW`

  返回脚本缓存中脚本的原始源代码。

  [了解详情](https://valkey.io/commands/script-show/)

**连接管理命令**
+ `AUTH`

  对连接进行身份验证。

  [了解详情](https://valkey.io/commands/auth/)
+ `CLIENT GETNAME`

  返回连接的名称。

  [了解详情](https://valkey.io/commands/client-getname/)
+ `CLIENT REPLY`

  指示服务器是否回复命令。

  [了解详情](https://valkey.io/commands/client-reply/)
+ `CLIENT SETNAME`

  设置连接名称。

  [了解详情](https://valkey.io/commands/client-setname/)
+ `ECHO`

  返回给定字符串。

  [了解详情](https://valkey.io/commands/echo/)
+ `HELLO`

  与 Valkey 或 Redis OSS 服务器握手。

  [了解详情](https://valkey.io/commands/hello/)
+ `PING`

  返回服务器的活跃度响应。

  [了解详情](https://valkey.io/commands/ping/)
+ `QUIT`

  关闭连接。

  [了解详情](https://valkey.io/commands/quit/)
+ `RESET`

  重置连接。

  [了解详情](https://valkey.io/commands/reset/)
+ `SELECT`

  更改所选数据库。

  [了解详情](https://valkey.io/commands/select/)

**通用命令**
+ `COPY`

  将键的值复制到新键中。

  [了解详情](https://valkey.io/commands/copy/)
+ `DEL`

  删除一个或多个键。

  [了解详情](https://valkey.io/commands/del/)
+ `DUMP`

  返回存储在某个键上的值的序列化表示形式。

  [了解详情](https://valkey.io/commands/dump/)
+ `EXISTS`

  确定是否存在一个或多个键。

  [了解详情](https://valkey.io/commands/exists/)
+ `EXPIRE`

  以秒为单位设置键的过期时间。

  [了解详情](https://valkey.io/commands/expire/)
+ `EXPIREAT`

  以 Unix 时间戳的格式设置键的过期时间。

  [了解详情](https://valkey.io/commands/expireat/)
+ `EXPIRETIME`

  以 Unix 时间戳的格式返回键的过期时间。

  [了解详情](https://valkey.io/commands/expiretime/)
+ `PERSIST`

  移除键的过期时间。

  [了解详情](https://valkey.io/commands/persist/)
+ `PEXPIRE`

  以毫秒为单位设置键的过期时间。

  [了解详情](https://valkey.io/commands/pexpire/)
+ `PEXPIREAT`

  以 Unix 毫秒时间戳的格式设置键的过期时间。

  [了解详情](https://valkey.io/commands/pexpireat/)
+ `PEXPIRETIME`

  以 Unix 毫秒时间戳的格式返回键的过期时间。

  [了解详情](https://valkey.io/commands/pexpiretime/)
+ `PTTL`

  以毫秒为单位返回键的过期时间。

  [了解详情](https://valkey.io/commands/pttl/)
+ `RANDOMKEY`

  从数据库中返回随机键名称。

  [了解详情](https://valkey.io/commands/randomkey/)
+ `RENAME`

  重命名键并覆盖目标。

  [了解详情](https://valkey.io/commands/rename/)
+ `RENAMENX`

  仅在目标键名称不存在时重命名键。

  [了解详情](https://valkey.io/commands/renamenx/)
+ `RESTORE`

  根据值的序列化表示形式创建键。

  [了解详情](https://valkey.io/commands/restore/)
+ `SCAN`

  遍历数据库中的键名。

  [了解详情](https://valkey.io/commands/scan/)
+ `SORT`

  对列表、集或排序集中的元素进行排序，可以选择将结果存储起来。

  [了解详情](https://valkey.io/commands/sort/)
+ `SORT_RO`

  返回列表、集或排序集的排序元素。

  [了解详情](https://valkey.io/commands/sort_ro/)
+ `TOUCH`

  返回在更新最后一次访问键的时间后，指定键中现有键的数量。

  [了解详情](https://valkey.io/commands/touch/)
+ `TTL`

  以秒为单位返回键的过期时间。

  [了解详情](https://valkey.io/commands/ttl/)
+ `TYPE`

  确定存储在键中的值的类型。

  [了解详情](https://valkey.io/commands/type/)
+ `UNLINK`

  异步删除一个或多个键。

  [了解详情](https://valkey.io/commands/unlink/)

**地理空间命令**
+ `GEOADD`

  将一个或多个成员添加到地理空间索引。如果键不存在，则创建它。

  [了解详情](https://valkey.io/commands/geoadd/)
+ `GEODIST`

  返回地理空间索引的两个成员之间的距离。

  [了解详情](https://valkey.io/commands/geodist/)
+ `GEOHASH`

  以地理哈希字符串的格式返回地理空间索引中的成员。

  [了解详情](https://valkey.io/commands/geohash/)
+ `GEOPOS`

  从地理空间索引返回成员的经度和纬度。

  [了解详情](https://valkey.io/commands/geopos/)
+ `GEORADIUS`

  查询与坐标相隔一定距离内的成员的地理空间索引，可以选择将结果存储起来。

  [了解详情](https://valkey.io/commands/georadius/)
+ `GEORADIUS_RO`

  从地理空间索引中返回与坐标相隔一定距离内的成员。

  [了解详情](https://valkey.io/commands/georadius_ro/)
+ `GEORADIUSBYMEMBER`

  查询与某个成员相隔一定距离内的成员的地理空间索引，可以选择将结果存储起来。

  [了解详情](https://valkey.io/commands/georadiusbymember/)
+ `GEORADIUSBYMEMBER_RO`

  从地理空间索引中返回与成员相隔一定距离内的成员。

  [了解详情](https://valkey.io/commands/georadiusbymember_ro/)
+ `GEOSEARCH`

  查询方框或圆圈区域内成员的地理空间索引。

  [了解详情](https://valkey.io/commands/geosearch/)
+ `GEOSEARCHSTORE`

  查询方框或圆圈区域内成员的地理空间索引，可以选择将结果存储起来。

  [了解详情](https://valkey.io/commands/geosearchstore/)

**哈希命令**
+ `HDEL`

  从哈希中删除一个或多个字段及其值。如果没有字段剩余，则删除哈希。

  [了解详情](https://valkey.io/commands/hdel/)
+ `HEXISTS`

  确定哈希中是否存在某个字段。

  [了解详情](https://valkey.io/commands/hexists/)
+ `HGET`

  返回哈希中某个字段的值。

  [了解详情](https://valkey.io/commands/hget/)
+ `HGETALL`

  返回哈希中的所有字段和值。

  [了解详情](https://valkey.io/commands/hgetall/)
+ `HINCRBY`

  将哈希中某个字段的整数值增加一个数字。如果该字段不存在，则使用 0 作为初始值。

  [了解详情](https://valkey.io/commands/hincrby/)
+ `HINCRBYFLOAT`

  将某个字段的浮点值增加一个数字。如果该字段不存在，则使用 0 作为初始值。

  [了解详情](https://valkey.io/commands/hincrbyfloat/)
+ `HKEYS`

  返回哈希中的所有字段。

  [了解详情](https://valkey.io/commands/hkeys/)
+ `HLEN`

  返回哈希中的字段数。

  [了解详情](https://valkey.io/commands/hlen/)
+ `HMGET`

  返回哈希中的所有字段的值。

  [了解详情](https://valkey.io/commands/hmget/)
+ `HMSET`

  设置多个字段的值。

  [了解详情](https://valkey.io/commands/hmset/)
+ `HRANDFIELD`

  从哈希返回一个或多个随机字段。

  [了解详情](https://valkey.io/commands/hrandfield/)
+ `HSCAN`

  遍历哈希的字段和值。

  [了解详情](https://valkey.io/commands/hscan/)
+ `HSET`

  在哈希中创建或修改某个字段的值。

  [了解详情](https://valkey.io/commands/hset/)
+ `HSETNX`

  仅当哈希中不存在某个字段时才设置该字段的值。

  [了解详情](https://valkey.io/commands/hsetnx/)
+ `HSTRLEN`

  返回某个字段的值的长度。

  [了解详情](https://valkey.io/commands/hstrlen/)
+ `HVALS`

  返回哈希中的所有值。

  [了解详情](https://valkey.io/commands/hvals/)

**HyperLogLog 命令**
+ `PFADD`

  向 HyperLogLog 密钥添加元素。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/pfadd/)
+ `PFCOUNT`

  返回键所观察到的集合的近似 HyperLogLog 基数。

  [了解详情](https://valkey.io/commands/pfcount/)
+ `PFMERGE`

  将一个或多个 HyperLogLog 值合并为一个键。

  [了解详情](https://valkey.io/commands/pfmerge/)

**列出命令**
+ `BLMOVE`

  从列表中弹出一个元素，将其推送到另一个列表并返回。否则将阻止，直到元素可用。如果最后一个元素已移除，则删除列表。

  [了解详情](https://valkey.io/commands/blmove/)
+ `BLMPOP`

  从多个列表之一弹出第一个元素。否则将阻止，直到元素可用。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/blmpop/)
+ `BLPOP`

  删除并返回列表中的第一个元素。否则将阻止，直到元素可用。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/blpop/)
+ `BRPOP`

  删除并返回列表中的最后一个元素。否则将阻止，直到元素可用。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/brpop/)
+ `BRPOPLPUSH`

  从列表中弹出一个元素，将其推送到另一个列表并返回。否则将阻止，直到元素可用。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/brpoplpush/)
+ `LINDEX`

  从列表中按元素索引返回该元素。

  [了解详情](https://valkey.io/commands/lindex/)
+ `LINSERT`

  在列表中的另一个元素之前或之后插入一个元素。

  [了解详情](https://valkey.io/commands/linsert/)
+ `LLEN`

  返回列表的长度。

  [了解详情](https://valkey.io/commands/llen/)
+ `LMOVE`

  从一个列表中弹出一个元素并将其推送到另一个列表后，返回该元素。如果最后一个元素已移除，则删除列表。

  [了解详情](https://valkey.io/commands/lmove/)
+ `LMPOP`

  删除列表中的多个元素后，返回这些元素。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/lmpop/)
+ `LPOP`

  删除列表中的第一个元素之后返回该元素。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/lpop/)
+ `LPOS`

  返回列表中匹配元素的索引。

  [了解详情](https://valkey.io/commands/lpos/)
+ `LPUSH`

  在列表前面追加一个或多个元素。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/lpush/)
+ `LPUSHX`

  仅当列表存在时，在列表前面追加一个或多个元素。

  [了解详情](https://valkey.io/commands/lpushx/)
+ `LRANGE`

  返回列表中元素的范围。

  [了解详情](https://valkey.io/commands/lrange/)
+ `LREM`

  从列表中删除元素。如果最后一个元素已删除，则删除列表。

  [了解详情](https://valkey.io/commands/lrem/)
+ `LSET`

  在列表中按元素索引设置元素的值。

  [了解详情](https://valkey.io/commands/lset/)
+ `LTRIM`

  从列表的两端删除元素。如果所有元素都已去除，则删除该列表。

  [了解详情](https://valkey.io/commands/ltrim/)
+ `RPOP`

  返回并删除列表中的最后一个元素。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/rpop/)
+ `RPOPLPUSH`

  在删除列表的最后一个元素并将其推送到另一个列表后，返回该元素。如果最后一个元素已弹出，则删除列表。

  [了解详情](https://valkey.io/commands/rpoplpush/)
+ `RPUSH`

  在列表中附加一个或多个元素。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/rpush/)
+ `RPUSHX`

  仅当列表存在时将元素附加到列表中。

  [了解详情](https://valkey.io/commands/rpushx/)

**Pub/Sub 命令**

**注意**  
PUBSUB 命令在内部使用分片 PUBSUB，因此频道名称会混合。
+ `PUBLISH`

  将消息发布到频道。

  [了解详情](https://valkey.io/commands/publish/)
+ `PUBSUB CHANNELS`

  返回活跃频道。

  [了解详情](https://valkey.io/commands/pubsub-channels/)
+ `PUBSUB NUMSUB`

  返回频道的订阅用户数量。

  [了解详情](https://valkey.io/commands/pubsub-numsub/)
+ `PUBSUB SHARDCHANNELS`

  返回活跃的分片频道。

  [了解详情](https://valkey.io/commands/pubsub-shardchannels/)
+ `PUBSUB SHARDNUMSUB`

  返回分片频道的订阅用户数量。

  [了解详情](https://valkey.io/commands/pubsub-shardnumsub/)
+ `SPUBLISH`

  向分片频道发布消息

  [了解详情](https://valkey.io/commands/spublish/)
+ `SSUBSCRIBE`

  侦听发布到分片频道的消息。

  [了解详情](https://valkey.io/commands/ssubscribe/)
+ `SUBSCRIBE`

  侦听发布到频道的消息。

  [了解详情](https://valkey.io/commands/subscribe/)
+ `SUNSUBSCRIBE`

  停止侦听发布到分片频道的消息。

  [了解详情](https://valkey.io/commands/sunsubscribe/)
+ `UNSUBSCRIBE`

  停止侦听发布到频道的消息。

  [了解详情](https://valkey.io/commands/unsubscribe/)

**脚本命令**
+ `EVAL`

  执行服务器端 Lua 脚本。

  [了解详情](https://valkey.io/commands/eval/)
+ `EVAL_RO`

  执行只读服务器端 Lua 脚本。

  [了解详情](https://valkey.io/commands/eval_ro/)
+ `EVALSHA`

  通过摘要执行服务器端 Lua 脚本。 SHA1 

  [了解详情](https://valkey.io/commands/evalsha/)
+ `EVALSHA_RO`

  通过摘要执行只读的服务器端 Lua 脚本。 SHA1 

  [了解详情](https://valkey.io/commands/evalsha_ro/)
+ `SCRIPT EXISTS`

  确定脚本缓存中是否存在服务器端 Lua 脚本。

  [了解详情](https://valkey.io/commands/script-exists/)
+ `SCRIPT FLUSH`

  目前，无操作脚本缓存由该服务管理。

  [了解详情](https://valkey.io/commands/script-flush/)
+ `SCRIPT LOAD`

  将服务器端 Lua 脚本加载到脚本缓存中。

  [了解详情](https://valkey.io/commands/script-load/)

**服务器管理命令**

**注意**  
在 Valkey 和 Redis OSS 中使用基于节点的 ElastiCache 集群时，客户端必须向每个主集群发送 flush 命令以刷新所有密钥。 ElastiCache 适用于 Valkey 和 Redis OSS 的无服务器工作原理不同，因为它抽象了底层的集群拓扑。结果是，在 ElastiCache Serverless 中`FLUSHDB`，`FLUSHALL`命令将始终刷新集群中的所有密钥。因此，flush 命令不能包含在无服务器事务中。
+ `ACL CAT`

  列出 ACL 类别或类别内的命令。

  [了解详情](https://valkey.io/commands/acl-cat/)
+ `ACL GENPASS`

  生成可用于识别 ACL 用户的伪随机安全密码。

  [了解详情](https://valkey.io/commands/acl-genpass/)
+ `ACL GETUSER`

  列出用户的 ACL 规则。

  [了解详情](https://valkey.io/commands/acl-getuser/)
+ `ACL LIST`

  以 ACL 文件格式转储有效规则。

  [了解详情](https://valkey.io/commands/acl-list/)
+ `ACL USERS`

  列出所有 ACL 用户。

  [了解详情](https://valkey.io/commands/acl-users/)
+ `ACL WHOAMI`

  返回当前连接的经过身份验证的用户名。

  [了解详情](https://valkey.io/commands/acl-whoami/)
+ `DBSIZE`

  返回当前所选数据库中的键数量。不保证此操作在所有槽中都是原子形式的。

  [了解详情](https://valkey.io/commands/dbsize/)
+ `COMMAND`

  返回有关所有命令的详细信息。

  [了解详情](https://valkey.io/commands/command/)
+ `COMMAND COUNT`

  返回命令的计数。

  [了解详情](https://valkey.io/commands/command-count/)
+ `COMMAND DOCS`

  返回有关一个、多个或所有命令的已记录信息。

  [了解详情](https://valkey.io/commands/command-docs/)
+ `COMMAND GETKEYS`

  从任意命令中提取键名称。

  [了解详情](https://valkey.io/commands/command-getkeys/)
+ `COMMAND GETKEYSANDFLAGS`

  提取任意命令的键名称和访问标志。

  [了解详情](https://valkey.io/commands/command-getkeysandflags/)
+ `COMMAND INFO`

  返回有关一个、多个或所有命令的信息。

  [了解详情](https://valkey.io/commands/command-info/)
+ `COMMAND LIST`

  返回命令名称的列表。

  [了解详情](https://valkey.io/commands/command-list/)
+ `COMMANDLOG`

  命令日志命令的容器。

  [了解详情](https://valkey.io/commands/commandlog/)
+ `COMMANDLOG GET`

  返回指定命令日志的条目。

  [了解详情](https://valkey.io/commands/commandlog-get/)
+ `COMMANDLOG HELP`

  显示有关不同子命令的有用文本。

  [了解详情](https://valkey.io/commands/commandlog-help/)
+ `COMMANDLOG LEN`

  返回指定类型的命令日志的条目数。

  [了解详情](https://valkey.io/commands/commandlog-len/)
+ `COMMANDLOG RESET`

  清除指定类型的命令日志中的所有条目。

  [了解详情](https://valkey.io/commands/commandlog-reset/)
+ `FLUSHALL`

  从所有数据库中删除所有键。不保证此操作在所有槽中都是原子形式的。

  [了解详情](https://valkey.io/commands/flushall/)
+ `FLUSHDB`

  从当前数据库中删除所有键。不保证此操作在所有槽中都是原子形式的。

  [了解详情](https://valkey.io/commands/flushdb/)
+ `INFO`

  返回有关服务器的信息和统计信息。

  [了解详情](https://valkey.io/commands/info/)
+ `LOLWUT`

  显示 Valkey 或 Redis OSS 版本和对应的计算机图像。

  [了解详情](https://valkey.io/commands/lolwut/)
+ `ROLE`

  返回复制角色。

  [了解详情](https://valkey.io/commands/role/)
+ `TIME`

  返回服务器时间。

  [了解详情](https://valkey.io/commands/time/)

**集命令**
+ `SADD`

  将一个或多个成员添加到集中。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/sadd/)
+ `SCARD`

  返回集中的成员数。

  [了解详情](https://valkey.io/commands/scard/)
+ `SDIFF`

  返回多个集的差值。

  [了解详情](https://valkey.io/commands/sdiff/)
+ `SDIFFSTORE`

  将多个集的差值存储在一个键中。

  [了解详情](https://valkey.io/commands/sdiffstore/)
+ `SINTER`

  返回多个集的交集。

  [了解详情](https://valkey.io/commands/sinter/)
+ `SINTERCARD`

  返回多个集的交集的成员数。

  [了解详情](https://valkey.io/commands/sintercard/)
+ `SINTERSTORE`

  将多个集的交集存储在一个键中。

  [了解详情](https://valkey.io/commands/sinterstore/)
+ `SISMEMBER`

  确定成员是否属于一个集。

  [了解详情](https://valkey.io/commands/sismember/)
+ `SMEMBERS`

  返回集的所有成员。

  [了解详情](https://valkey.io/commands/smembers/)
+ `SMISMEMBER`

  确定多个成员是否属于一个集。

  [了解详情](https://valkey.io/commands/smismember/)
+ `SMOVE`

  将成员从一个集移动到另一个集。

  [了解详情](https://valkey.io/commands/smove/)
+ `SPOP`

  删除集中的一个或多个随机成员后，返回这些成员。如果最后一个成员已弹出，则删除集。

  [了解详情](https://valkey.io/commands/spop/)
+ `SRANDMEMBER`

  从集中获取一个或多个随机成员

  [了解详情](https://valkey.io/commands/srandmember/)
+ `SREM`

  从集中删除一个或多个成员。如果最后一个成员已删除，则删除集。

  [了解详情](https://valkey.io/commands/srem/)
+ `SSCAN`

  遍历集的成员。

  [了解详情](https://valkey.io/commands/sscan/)
+ `SUNION`

  返回多个集的并集。

  [了解详情](https://valkey.io/commands/sunion/)
+ `SUNIONSTORE`

  将多个集的并集存储在一个密钥中。

  [了解详情](https://valkey.io/commands/sunionstore/)

**排序集命令**
+ `BZMPOP`

  从一个或多个排序集中按分数移除并返回成员。否则将阻止，直到成员可用。如果最后一个元素已弹出，则删除排序集。

  [了解详情](https://valkey.io/commands/bzmpop/)
+ `BZPOPMAX`

  从一个或多个排序集中移除并返回分数最高的成员。否则将阻止，直到成员可用。如果最后一个元素已弹出，则删除排序集。

  [了解详情](https://valkey.io/commands/bzpopmax/)
+ `BZPOPMIN`

  从一个或多个排序集中移除并返回分数最低的成员。否则将阻止，直到成员可用。如果最后一个元素已弹出，则删除排序集。

  [了解详情](https://valkey.io/commands/bzpopmin/)
+ `ZADD`

  将一个或多个成员添加到排序集中，或更新其分数。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/zadd/)
+ `ZCARD`

  返回排序集中的成员数。

  [了解详情](https://valkey.io/commands/zcard/)
+ `ZCOUNT`

  返回排序集中分数在某个范围内的成员数。

  [了解详情](https://valkey.io/commands/zcount/)
+ `ZDIFF`

  返回多个排序集的差值。

  [了解详情](https://valkey.io/commands/zdiff/)
+ `ZDIFFSTORE`

  将多个排序集的差值存储在一个键中。

  [了解详情](https://valkey.io/commands/zdiffstore/)
+ `ZINCRBY`

  递增排序集中成员的分数。

  [了解详情](https://valkey.io/commands/zincrby/)
+ `ZINTER`

  返回多个排序集的交集。

  [了解详情](https://valkey.io/commands/zinter/)
+ `ZINTERCARD`

  返回多个排序集的交集的成员数。

  [了解详情](https://valkey.io/commands/zintercard/)
+ `ZINTERSTORE`

  将多个排序集的交集存储在一个键中。

  [了解详情](https://valkey.io/commands/zinterstore/)
+ `ZLEXCOUNT`

  返回排序集中某个字母表范围内的成员数。

  [了解详情](https://valkey.io/commands/zlexcount/)
+ `ZMPOP`

  删除一个或多个排序集中分数最高或最低的成员后，返回这些成员。如果最后一个元素已弹出，则删除排序集。

  [了解详情](https://valkey.io/commands/zmpop/)
+ `ZMSCORE`

  返回排序集中一个或多个成员的分数。

  [了解详情](https://valkey.io/commands/zmscore/)
+ `ZPOPMAX`

  删除排序集中分数最高的成员后，返回这些成员。如果最后一个元素已弹出，则删除排序集。

  [了解详情](https://valkey.io/commands/zpopmax/)
+ `ZPOPMIN`

  删除排序集中分数最低的成员后，返回这些成员。如果最后一个元素已弹出，则删除排序集。

  [了解详情](https://valkey.io/commands/zpopmin/)
+ `ZRANDMEMBER`

  返回排序集中的一个或多个随机成员。

  [了解详情](https://valkey.io/commands/zrandmember/)
+ `ZRANGE`

  返回排序集中某个索引范围内的成员。

  [了解详情](https://valkey.io/commands/zrange/)
+ `ZRANGEBYLEX`

  返回排序集中某个字母表范围内的成员。

  [了解详情](https://valkey.io/commands/zrangebylex/)
+ `ZRANGEBYSCORE`

  返回排序集中某个分数范围内的成员。

  [了解详情](https://valkey.io/commands/zrangebyscore/)
+ `ZRANGESTORE`

  将排序集中的一系列成员存储在一个键中。

  [了解详情](https://valkey.io/commands/zrangestore/)
+ `ZRANK`

  返回排序集中按分数升序排序的成员的索引。

  [了解详情](https://valkey.io/commands/zrank/)
+ `ZREM`

  从排序集中删除一个或多个成员。如果所有成员已删除，则删除排序集。

  [了解详情](https://valkey.io/commands/zrem/)
+ `ZREMRANGEBYLEX`

  删除排序集中某个字母表范围内的成员。如果所有成员已删除，则删除排序集。

  [了解详情](https://valkey.io/commands/zremrangebylex/)
+ `ZREMRANGEBYRANK`

  删除排序集中某个索引范围内的成员。如果所有成员已删除，则删除排序集。

  [了解详情](https://valkey.io/commands/zremrangebyrank/)
+ `ZREMRANGEBYSCORE`

  删除排序集中某个分数范围内的成员。如果所有成员已删除，则删除排序集。

  [了解详情](https://valkey.io/commands/zremrangebyscore/)
+ `ZREVRANGE`

  以相反的顺序返回某个索引范围内排序集中的成员。

  [了解详情](https://valkey.io/commands/zrevrange/)
+ `ZREVRANGEBYLEX`

  以相反的顺序返回排序集中某个字母表范围内的成员。

  [了解详情](https://valkey.io/commands/zrevrangebylex/)
+ `ZREVRANGEBYSCORE`

  以相反的顺序返回排序集中某个分数范围内的成员。

  [了解详情](https://valkey.io/commands/zrevrangebyscore/)
+ `ZREVRANK`

  按分数降序排序，返回排序集中某个成员的索引。

  [了解详情](https://valkey.io/commands/zrevrank/)
+ `ZSCAN`

  遍历排序集的成员和分数。

  [了解详情](https://valkey.io/commands/zscan/)
+ `ZSCORE`

  返回排序集中某个成员的分数。

  [了解详情](https://valkey.io/commands/zscore/)
+ `ZUNION`

  返回多个排序集的并集。

  [了解详情](https://valkey.io/commands/zunion/)
+ `ZUNIONSTORE`

  将多个排序集的并集存储在一个键中。

  [了解详情](https://valkey.io/commands/zunionstore/)

**流命令**
+ `XACK`

  返回流的使用者组成员已成功确认的消息数量。

  [了解详情](https://valkey.io/commands/xack/)
+ `XADD`

  在流中追加一条新消息。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/xadd/)
+ `XAUTOCLAIM`

  更改或获取使用者组中某条消息的所有权，就像消息是以使用者组成员的身份传递一样。

  [了解详情](https://valkey.io/commands/xautoclaim/)
+ `XCLAIM`

  更改或获取使用者组中某条消息的所有权，就像消息是传递给使用者组成员一样。

  [了解详情](https://valkey.io/commands/xclaim/)
+ `XDEL`

  从流中删除消息后，返回删除的消息数。

  [了解详情](https://valkey.io/commands/xdel/)
+ `XGROUP CREATE`

  创建使用者组。

  [了解详情](https://valkey.io/commands/xgroup-create/)
+ `XGROUP CREATECONSUMER`

  在使用者组中创建使用者。

  [了解详情](https://valkey.io/commands/xgroup-createconsumer/)
+ `XGROUP DELCONSUMER`

  从使用者组中删除使用者。

  [了解详情](https://valkey.io/commands/xgroup-delconsumer/)
+ `XGROUP DESTROY`

  销毁使用者组。

  [了解详情](https://valkey.io/commands/xgroup-destroy/)
+ `XGROUP SETID`

  设置使用者组的上次传输 ID。

  [了解详情](https://valkey.io/commands/xgroup-setid/)
+ `XINFO CONSUMERS`

  返回使用者组中的使用者列表。

  [了解详情](https://valkey.io/commands/xinfo-consumers/)
+ `XINFO GROUPS`

  返回流的使用者组列表。

  [了解详情](https://valkey.io/commands/xinfo-groups/)
+ `XINFO STREAM`

  返回有关流的信息。

  [了解详情](https://valkey.io/commands/xinfo-stream/)
+ `XLEN`

  返回流中的消息数。

  [了解详情](https://valkey.io/commands/xlen/)
+ `XPENDING`

  返回流使用者组的待处理条目列表中的信息和条目。

  [了解详情](https://valkey.io/commands/xpending/)
+ `XRANGE`

  返回来自一定范围内的数据流的消息 IDs。

  [了解详情](https://valkey.io/commands/xrange/)
+ `XREAD`

  从多个流中返回 IDs 大于请求数量的消息。否则将阻止，直到消息可用。

  [了解详情](https://valkey.io/commands/xread/)
+ `XREADGROUP`

  为组中的某个使用者返回流中的新消息或历史消息。否则将阻止，直到消息可用。

  [了解详情](https://valkey.io/commands/xreadgroup/)
+ `XREVRANGE`

  以相反的顺序返回范围内的流 IDs 中的消息。

  [了解详情](https://valkey.io/commands/xrevrange/)
+ `XTRIM`

  从流的开头删除消息。

  [了解详情](https://valkey.io/commands/xtrim/)

**字符串命令**
+ `APPEND`

  在键值后面附加一个字符串。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/append/)
+ `DECR`

  将键的整数值减去 1。如果该键不存在，则使用 0 作为初始值。

  [了解详情](https://valkey.io/commands/decr/)
+ `DECRBY`

  从键的整数值减去一个数字。如果该键不存在，则使用 0 作为初始值。

  [了解详情](https://valkey.io/commands/decrby/)
+ `GET`

  返回键的字符串值。

  [了解详情](https://valkey.io/commands/get/)
+ `GETDEL`

  删除键后，返回键的字符串值。

  [了解详情](https://valkey.io/commands/getdel/)
+ `GETEX`

  在设置键的过期时间后，返回其字符串值。

  [了解详情](https://valkey.io/commands/getex/)
+ `GETRANGE`

  返回存储在键中的字符串的子字符串。

  [了解详情](https://valkey.io/commands/getrange/)
+ `GETSET`

  将键设置为新值后，返回键的上一个字符串值。

  [了解详情](https://valkey.io/commands/getset/)
+ `INCR`

  将键的整数值增加 1。如果该键不存在，则使用 0 作为初始值。

  [了解详情](https://valkey.io/commands/incr/)
+ `INCRBY`

  将键的整数值增加一个数字。如果该键不存在，则使用 0 作为初始值。

  [了解详情](https://valkey.io/commands/incrby/)
+ `INCRBYFLOAT`

  将键的浮点值增加一个数字。如果该键不存在，则使用 0 作为初始值。

  [了解详情](https://valkey.io/commands/incrbyfloat/)
+ `LCS`

  查找最长的公共子字符串。

  [了解详情](https://valkey.io/commands/lcs/)
+ `MGET`

  以原子方式返回一个或多个键的字符串值。

  [了解详情](https://valkey.io/commands/mget/)
+ `MSET`

  以原子方式创建或修改一个或多个键的字符串值。

  [了解详情](https://valkey.io/commands/mset/)
+ `MSETNX`

  仅当所有键不存在时，以原子方式修改一个或多个键的字符串值。

  [了解详情](https://valkey.io/commands/msetnx/)
+ `PSETEX`

  设置键的字符串值和过期时间，以毫秒为单位。如果键不存在，则创建它。

  [了解详情](https://valkey.io/commands/psetex/)
+ `SET`

  设置键的字符串值，忽略其类型。如果键不存在，则创建它。

  [了解详情](https://valkey.io/commands/set/)
+ `SETEX`

  设置键的字符串值和过期时间。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/setex/)
+ `SETNX`

  仅在某个键不存在时才设置该键的字符串值。

  [了解详情](https://valkey.io/commands/setnx/)
+ `SETRANGE`

  按偏移量用字符串值的一部分覆盖另一个部分。创建键（如果它不存在）。

  [了解详情](https://valkey.io/commands/setrange/)
+ `STRLEN`

  返回字符串值的长度。

  [了解详情](https://valkey.io/commands/strlen/)
+ `SUBSTR`

  返回字符串值中的子字符串。

  [了解详情](https://valkey.io/commands/substr/)

**事务命令**
+ `DISCARD`

  丢弃某个事务。

  [了解详情](https://valkey.io/commands/discard/)
+ `EXEC`

  执行某个事务中的所有命令。

  [了解详情](https://valkey.io/commands/exec/)
+ `MULTI`

  开始事务。

  [了解详情](https://valkey.io/commands/multi/)

## 受限的 Valkey 和 Redis OSS 命令
<a name="RestrictedCommandsRedis"></a>

为了提供托管服务体验， ElastiCache 限制访问某些需要高级权限的特定于缓存引擎的命令。对于运行 Redis OSS 的缓存，以下命令不可用：
+ `acl setuser`
+ `acl load`
+ `acl save`
+ `acl deluser`
+ `bgrewriteaof`
+ `bgsave`
+ `cluster addslot`
+ `cluster addslotsrange`
+ `cluster bumpepoch`
+ `cluster delslot`
+ `cluster delslotsrange `
+ `cluster failover `
+ `cluster flushslots `
+ `cluster forget `
+ `cluster links`
+ `cluster meet`
+ `cluster setslot`
+ `config`
+ `debug`
+ `migrate`
+ `psync`
+ `replicaof`
+ `save`
+ `slaveof`
+ `shutdown`
+ `sync`

此外，以下命令不可用于无服务器缓存：
+ `acl log`
+ `client caching`
+ `client getredir`
+ `client id`
+ `client info`
+ `client kill`
+ `client list`
+ `client no-evict`
+ `client pause`
+ `client tracking`
+ `client trackinginfo`
+ `client unblock`
+ `client unpause`
+ `cluster count-failure-reports`
+ `commandlog`
+ `commandlog get`
+ `commandlog help`
+ `commandlog len`
+ `commandlog reset`
+ `fcall`
+ `fcall_ro`
+ `function`
+ `function delete`
+ `function dump`
+ `function flush`
+ `function help`
+ `function kill`
+ `function list`
+ `function load`
+ `function restore`
+ `function stats`
+ `keys`
+ `lastsave`
+ `latency`
+ `latency doctor`
+ `latency graph`
+ `latency help`
+ `latency histogram`
+ `latency history`
+ `latency latest`
+ `latency reset`
+ `memory`
+ `memory doctor`
+ `memory help`
+ `memory malloc-stats`
+ `memory purge`
+ `memory stats`
+ `memory usage`
+ `monitor`
+ `move`
+ `object`
+ `object encoding`
+ `object freq`
+ `object help`
+ `object idletime`
+ `object refcount`
+ `pfdebug`
+ `pfselftest`
+ `psubscribe`
+ `pubsub numpat`
+ `punsubscribe`
+ `script kill`
+ `slowlog`
+ `slowlog get`
+ `slowlog help`
+ `slowlog len`
+ `slowlog reset`
+ `swapdb`
+ `wait`

## 支持的 Memcached 命令
<a name="SupportedCommandsMem"></a>

ElastiCache Serverless for Memcached 支持开源 memcached 1.6 中的所有内存缓存[命令](https://github.com/memcached/memcached/wiki/Commands)，但以下命令除外：
+ 客户端连接需要 TLS，因此不支持 UDP 协议。
+ 不支持二进制协议，因为在 memcached 1.6 中已正式[弃用](https://github.com/memcached/memcached/wiki/ReleaseNotes160)该协议。
+ `GET/GETS` 命令限制为 16KB，以避免可能通过提取大量键来对服务器进行 DoS 攻击。
+ 延迟的 `flush_all` 命令将被拒绝并返回 `CLIENT_ERROR`。
+ 配置引擎的命令，或者显示有关引擎状态或日志的内部信息的命令均不受支持，例如：
  + 对于 `STATS` 命令，仅支持 `stats` 和 `stats reset`。其他变体将返回 `ERROR`
  + `lru / lru_crawler`：修改 LRU 和 LRU 爬网程序设置
  + `watch`：监视 memcached 服务器日志
  + `verbosity`：配置服务器日志级别
  + `me` - meta debug (me) 命令不受支持

# Valkey 和 Redis OSS 配置和限制
<a name="RedisConfiguration"></a>

Valkey 和 Redis OSS 引擎各自提供了许多配置参数，其中一些参数可以在 Redis OSS 中 ElastiCache 进行修改，有些则不可修改以提供稳定的性能和可靠性。

## 无服务器缓存
<a name="RedisConfiguration.Serverless"></a>

无服务器缓存不使用参数组，而且所有 Valkey 或 Redis OSS 配置都不可修改。其中包括以下 Valkey 或 Redis OSS 参数：


****  

|  Name  |  Details  |  说明  | 
| --- | --- | --- | 
| acl-pubsub-default | `allchannels` | 此缓存上的 ACL 用户默认拥有 pubsub 频道权限。 | 
| client-output-buffer-limit | `normal 0 0 0` `pubsub 32mb 8mb 60` | 普通客户端没有缓冲区限制。 PUB/SUB 如果客户违反 32MiB 的待办事项或在 60 秒内违反 8MiB 的积压请求，则他们将断开连接。 | 
| client-query-buffer-limit | 1 GiB | 单个客户端查询缓冲区的最大大小。此外，客户端不能发布参数超过 3999 个的请求。 | 
| cluster-allow-pubsubshard-when-down | yes | 这样在缓存部分关闭时，缓存仍能为 pubsub 流量提供服务。 | 
| cluster-allow-reads-when-down | yes | 这样在缓存部分关闭时，缓存仍能为读取流量提供服务。 | 
| cluster-enabled | yes | 所有无服务器缓存都启用了集群模式，这使得它们可以在多个后端分片之间透明地将数据分区。所有槽都对客户端显示为属于单个虚拟节点。 | 
| cluster-require-full-coverage | no | 当键空间部分关闭时（即，至少有一个哈希槽无法访问），缓存将继续接受对仍在覆盖范围的部分键空间的查询。在 cluster slots 中，整个键空间将始终由单个虚拟节点“覆盖”。 | 
| lua-time-limit | 5000 | Lua 脚本在采取行动停止脚本之前 ElastiCache 的最大执行时间，以毫秒为单位。如果超过 `lua-time-limit`，则所有 Valkey 或 Redis OSS 命令都可能返回形式为 *\$1\$1\$1\$1-BUSY* 的错误。由于这种状态可能会干扰许多基本的 Valkey 或 Redis OSS 操作，因此 ElastiCache 将首先发出 SCR *IPT K* ILL 命令。如果不成功， ElastiCache 将强制重启 Valkey 或 Redis OSS。 | 
| maxclients | 65000 | 缓存上可以一次连接的最大客户端连接数。超过此数量后，连接不一定能成功。 | 
| maxmemory-policy | volatile-lru | 当达到缓存的内存限制时，按照 least-recently-used (LRU) 估计，设置了 TTL 的项目将被驱逐出去。 | 
| notify-keyspace-events | （空字符串） | 无服务器缓存目前不支持键空间事件。 | 
| port | 主端口：6379 读取端口：6380 | 无服务器缓存向两个端口传播相同的主机名。主端口允许写入和读取，而读取端口则允许使用命令 READONLY 实现更低延迟的最终一致读数。 | 
| proto-max-bulk-len | 512 MiB | 单元素请求的最大大小。 | 
| timeout | 0 | 客户端不会在达到特定空闲时间后被强制断开连接，但在稳定状态期间，它们可能会出于负载均衡目的而断开连接。 | 

此外还有以下限制：


****  

|  Name  |  Details  |  说明  | 
| --- | --- | --- | 
| 每个缓存的大小 | 5,000 GiB | 每个无服务器缓存可以存储的最大数据量。 | 
| 每个槽的大小 | 32 GiB | 单个 Valkey 或 Redis OSS 哈希槽的最大大小。客户端如果尝试在单个 Valkey 或 Redis OSS 槽上设置超过此值的更多数据，就会触发驱逐策略，如果没有键可供驱逐，则会收到内存不足（OOM）错误。 | 
| 每个缓存的 ECPU | 1500 万 ECPU/秒 | ElastiCache 处理单位 (ECPU) 指标。您的请求 ECPUs 消耗的数量取决于所用的 vCPU 时间和传输的数据量。 | 
| 每个槽的 ECPU | 3-9 万 ECPU/秒 | 使用只读连接从副本读取 ECPUs/second 时， ECPUs/second 每个插槽最大为 30K，或者使用从副本读取时为 90K。 | 
| 每个请求的参数 | 3,999 | 每个请求的最大参数数量。发送超过此数量的参数的客户端将收到错误响应。 | 
| 键名称长度 | 4 KiB | 单个 Valkey 或 Redis OSS 键或频道名称的最大大小。引用大于此值的键的客户端将收到错误消息。 | 
| Lua 脚本大小 | 4 MiB | 单个 Valkey 或 Redis OSS Lua 脚本的最大大小。尝试加载大于此值的 Lua 脚本将收到错误。 | 

## 基于节点的集群
<a name="RedisConfiguration.SelfDesigned"></a>

对于基于节点的集群，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis) 以了解配置参数的默认值，以及哪些参数可供配置。通常建议使用默认值，除非您的特定使用案例要求覆盖这些值。

# Valkey、Memcached 和 Redis OSS 的 IPv6 客户端示例
<a name="network-type-best-practices"></a>

ElastiCache 兼容 Valkey、Memcached 和 Redis OSS。这意味着支持 IPv6 连接的客户端应该能够连接到启用 IPv6 的 ElastiCache for Memcached 集群。在与启用 IPv6 的资源进行交互时，有一些事项值得注意。

您可以在 Amazon 数据库博客上查看 [Valkey 和 Redis 客户端最佳实践](https://www.amazonaws.cn/blogs/database/best-practices-redis-clients-and-amazon-elasticache-for-redis/)博文，了解为 ElastiCache 资源配置 Valkey 和 Redis OSS 客户端的建议。

以下是使用常用的开源客户端库与启用 IPv6 的 ElastiCache 资源进行交互的最佳实践。

## 经验证可用于 Valkey 和 Redis OSS 的客户端
<a name="network-type-validated-clients-redis"></a>

ElastiCache 与 Valkey 和开源 Redis OSS 兼容。这意味着支持 IPv6 连接的 Valkey 和开源 Redis OSS 客户端应该能够连接到启用 IPv6 的 ElastiCache for Redis OSS 集群。此外，一些最受欢迎的 Python 和 Java 客户端已经过专门的测试和验证，可以与所有支持的网络类型配置（仅 IPv4、仅 IPv6 和双堆栈）配合使用

以下客户端经过专门验证，可与 Valkey 和 Redis OSS 支持的所有网络类型配置配合使用。

经过验证的客户端：
+ [Redis Py ()](https://github.com/redis/redis-py) – [4.1.2](https://github.com/redis/redis-py/tree/v4.1.2)
+ [Lettuce](https://lettuce.io/) – [版本：6.1.6.RELEASE](https://github.com/lettuce-io/lettuce-core/tree/6.1.6.RELEASE)
+ [Jedis](https://github.com/redis/jedis) – [版本：3.6.0](https://github.com/redis/jedis/tree/jedis-3.6.0)

# 客户端最佳实践（Valkey 和 Redis OSS）
<a name="BestPractices.Clients.redis"></a>

了解常见场景的最佳实践，并遵循一些最常用的开源 Valkey 和 Redis OSS 客户端库（redis-py、PHPRedis 和 Lettuce）的代码示例，以及有关使用常用开源 Memcached 客户端库与 ElastiCache 资源进行交互的最佳实践。

**Topics**
+ [

# 大量连接（Valkey 和 Redis OSS）
](BestPractices.Clients.Redis.Connections.md)
+ [

# 集群客户端发现和指数回退（Valkey 和 Redis OSS）
](BestPractices.Clients.Redis.Discovery.md)
+ [

# 配置客户端超时（Valkey 和 Redis OSS）
](BestPractices.Clients.Redis.ClientTimeout.md)
+ [

# 配置服务器端空闲超时（Valkey 和 Redis OSS）
](BestPractices.Clients.Redis.ServerTimeout.md)
+ [

# Lua 脚本
](BestPractices.Clients.Redis.LuaScripts.md)
+ [

# 存储大型复合项目（Valkey 和 Redis OSS）
](BestPractices.Clients.Redis.LargeItems.md)
+ [

# Lettuce 客户端配置（Valkey 和 Redis OSS）
](BestPractices.Clients-lettuce.md)
+ [

## 为双堆栈集群配置首选协议（Valkey 和 Redis OSS）
](#network-type-configuring-dual-stack-redis)

# 大量连接（Valkey 和 Redis OSS）
<a name="BestPractices.Clients.Redis.Connections"></a>

无服务器缓存和单个 ElastiCache for Redis OSS 节点支持多达 6.5 万个并发客户端连接。但为了优化性能，我们建议客户端应用程序不要一直在该级别的连接上运行。Valkey 和 Redis OSS 都是基于事件循环的单线程进程，按顺序处理传入客户端请求。这意味着随着已连接客户端的增多，给定客户端的响应时间会变长。

您可以执行下面的一组操作，避免在 Valkey 或 Redis OSS 服务器上遇到连接瓶颈：
+ 从只读副本执行读取操作。这可以通过使用 ElastiCache 读取器端点（在已禁用集群模式的情况下）或使用只读副本（在已启用集群模式的情况下，包括无服务器缓存）来实现。
+ 在多个主节点之间分配写入流量。您可以通过两种方式执行此操作。您可以将多分片 Valkey 或 Redis OSS 集群与支持集群模式的客户端结合使用。您还可以在已禁用集群模式的情况下通过客户端分片对多个主节点进行写入。此过程在无服务器缓存中自动完成。
+ 如果您的客户端库中有连接池，请使用它。

通常，与典型的 Valkey 或 Redis OSS 命令相比，创建 TCP 连接是一项计算成本很高的操作。例如，在重复使用现有连接时，处理 SET/GET 请求的速度快一个数量级。使用大小有限的客户端连接池可减少连接管理的开销。它还将限制来自客户端应用程序的并发传入连接数。

以下 PHPRedis 代码示例说明为每个新用户请求创建一个新连接：

```
$redis = new Redis();
if ($redis->connect($HOST, $PORT) != TRUE) {
	//ERROR: connection failed
	return;
}
$redis->set($key, $value);
unset($redis);
$redis = NULL;
```

我们在连接到 Graviton2（m6g.2xlarge）ElastiCache for Redis OSS 节点的 Amazon Elastic Compute Cloud（Amazon EC2）实例上的循环中对此代码进行了基准测试。我们将客户端和服务器置于同一可用区中。整个操作的平均延迟为 2.82 毫秒。

在更新代码并使用持久连接和连接池时，整个操作的平均延迟为 0.21 毫秒：

```
$redis = new Redis();
if ($redis->pconnect($HOST, $PORT) != TRUE) {
	// ERROR: connection failed
	return;
}
$redis->set($key, $value);
unset($redis);
$redis = NULL;
```

所需的 redis.ini 配置：
+ `redis.pconnect.pooling_enabled=1`
+ `redis.pconnect.connection_limit=10`

以下代码是 [Redis-py 连接池](https://redis.readthedocs.io/en/stable/)的示例：

```
conn = Redis(connection_pool=redis.BlockingConnectionPool(host=HOST, max_connections=10))
conn.set(key, value)
```

以下代码是 [Lettuce 连接池](https://lettuce.io/core/release/reference/#_connection_pooling)的示例：

```
RedisClient client = RedisClient.create(RedisURI.create(HOST, PORT));
GenericObjectPool<StatefulRedisConnection> pool = ConnectionPoolSupport.createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig());
pool.setMaxTotal(10); // Configure max connections to 10
try (StatefulRedisConnection connection = pool.borrowObject()) {
	RedisCommands syncCommands = connection.sync();
	syncCommands.set(key, value);
}
```

# 集群客户端发现和指数回退（Valkey 和 Redis OSS）
<a name="BestPractices.Clients.Redis.Discovery"></a>

在已启用集群模式的情况下连接到 ElastiCache Valkey 或 Redis OSS 集群时，相应的客户端库必须能够感知集群。客户端必须获取哈希槽与集群中相应节点的映射，才能将请求发送到正确的节点，并避免处理集群重定向时产生的性能开销。因此，在两种不同的情况下，客户端必须发现槽和映射节点的完整列表：
+ 客户端将初始化，并且必须填充初始槽配置
+ 从服务器接收 MOVED 重定向，例如在前主节点提供的所有槽都由副本接管时进行失效转移的情况下，或者在槽从源主节点移动到目标主节点时进行重新分片的情况下

通常，通过向 Valkey 或 Redis OSS 服务器发出 CLUSTER SLOT 或 CLUSTER NODE 命令来完成客户端发现。我们建议使用 CLUSTER SLOT 方法，因为它会将一组槽范围以及关联的主节点和副本节点发送回客户端。这不需要从客户端进行额外分析，并且效率更高。

根据集群拓扑，CLUSTER SLOT 命令的响应大小可能会因集群大小而异。带多个节点的集群越大，响应越大。因此，请务必确保执行集群拓扑发现的客户端的数量不会无限增长。例如，在客户端应用程序启动或丢失与服务器的连接且必须执行集群发现时，通常会出现的一个错误是，客户端应用程序会在重试时未添加指数回退的情况下触发多个重新连接和发现请求。这可能导致 Valkey 或 Redis OSS 服务器长时间无响应，且 CPU 利用率达到 100%。如果每条 CLUSTER SLOT 命令均必须处理集群总线中的大量节点，则中断时间会延长。过去，我们在包括 Python（redis-py-cluster）和 Java（Lettuce 和 Redisson）在内的许多不同语言中观察到，此行为导致多次发生客户端中断。

在无服务器缓存中，由于公布的集群拓扑是静态的，并且包含两个条目（写入端点和读取端点），因此许多问题会自动得到缓解。在使用缓存端点时，集群发现还会自动将负载分布到多个节点。但以下建议仍然有用。

为了减少突然涌入的连接和发现请求所造成的影响，我们建议采取以下措施：
+ 实施一个大小有限的客户端连接池，以限制来自客户端应用程序的并发传入连接数。
+ 当客户端因超时而断开与服务器的连接时，请使用带抖动的指数回退进行重试。这有助于避免多个客户端同时给服务器带来压力而导致其不堪重负。
+ 使用[查找 ElastiCache 中的缓存连接端点](Endpoints.md)中的指南查找用于执行集群发现的集群端点。这样一来，您便能将发现负载分布到集群中的所有节点（最多 90 个）上，而不是分布到集群中的几个硬编码的种子节点上。

以下是 redis-py、PHPRedis 和 Lettuce 中指数回退重试逻辑的一些代码示例。

**回退逻辑示例 1：redis-py**

redis-py 具有一个内置的重试机制，可在失败后立即重试一次。您可以通过在创建 [Redis OSS](https://redis.readthedocs.io/en/stable/examples/connection_examples.html#redis.Redis) 对象时提供的 `retry_on_timeout` 参数启用此机制。在这里，我们演示了一种带指数回退和抖动的自定义重试机制。我们提交了一个拉取请求，以便在 [redis-py (\$11494)](https://github.com/andymccurdy/redis-py/pull/1494) 中本机实施指数回退。将来，可能无需手动实施它。

```
def run_with_backoff(function, retries=5):
base_backoff = 0.1 # base 100ms backoff
max_backoff = 10 # sleep for maximum 10 seconds
tries = 0
while True:
try:
  return function()
except (ConnectionError, TimeoutError):
  if tries >= retries:
	raise
  backoff = min(max_backoff, base_backoff * (pow(2, tries) + random.random()))
  print(f"sleeping for {backoff:.2f}s")
  sleep(backoff)
  tries += 1
```

之后，您可以使用以下代码来设置值：

```
client = redis.Redis(connection_pool=redis.BlockingConnectionPool(host=HOST, max_connections=10))
res = run_with_backoff(lambda: client.set("key", "value"))
print(res)
```

根据您的工作负载，您可能需要针对延迟敏感型工作负载将基本回退值从 1 秒更改为几十或几百毫秒。

**回退逻辑示例 2：PHPRedis**

PHPRedis 具有一个内置的重试机制，允许最多重试 10 次（不可配置）。可以配置两次尝试之间的延迟（从第二次重试开始会有抖动）。有关更多信息，请参阅以下[示例代码](https://github.com/phpredis/phpredis/blob/b0b9dd78ef7c15af936144c1b17df1a9273d72ab/library.c#L335-L368)。我们提交了一个拉取请求，以便在 [PHPredis (\$11986)](https://github.com/phpredis/phpredis/pull/1986) 中本机实施已合并且[记录](https://github.com/phpredis/phpredis/blob/develop/README.md#retry-and-backoff)的指数回退。对于最新版本的 PHPRedis 中的指数回退，无需手动实施，但我们在此处提供了早期版本中指数回退的参考。目前，以下是配置重试机制延迟的代码示例：

```
$timeout = 0.1; // 100 millisecond connection timeout
$retry_interval = 100; // 100 millisecond retry interval
$client = new Redis();
if($client->pconnect($HOST, $PORT, $timeout, NULL, $retry_interval) != TRUE) {
	return; // ERROR: connection failed
}
$client->set($key, $value);
```

**回退逻辑示例 3：Lettuce**

Lettuce 具有基于[指数回退和抖动](https://www.amazonaws.cn/blogs/architecture/exponential-backoff-and-jitter/)文章中描述的指数回退策略的内置重试机制。以下是显示完整抖动方法的代码摘录：

```
public static void main(String[] args)
{
	ClientResources resources = null;
	RedisClient client = null;

	try {
		resources = DefaultClientResources.builder()
				.reconnectDelay(Delay.fullJitter(
			Duration.ofMillis(100),     // minimum 100 millisecond delay
			Duration.ofSeconds(5),      // maximum 5 second delay
			100, TimeUnit.MILLISECONDS) // 100 millisecond base
		).build();

		client = RedisClient.create(resources, RedisURI.create(HOST, PORT));
		client.setOptions(ClientOptions.builder()
	.socketOptions(SocketOptions.builder().connectTimeout(Duration.ofMillis(100)).build()) // 100 millisecond connection timeout
	.timeoutOptions(TimeoutOptions.builder().fixedTimeout(Duration.ofSeconds(5)).build()) // 5 second command timeout
	.build());

	    // use the connection pool from above example
	} finally {
		if (connection != null) {
			connection.close();
		}

		if (client != null){
			client.shutdown();
		}

		if (resources != null){
			resources.shutdown();
		}

	}
}
```

# 配置客户端超时（Valkey 和 Redis OSS）
<a name="BestPractices.Clients.Redis.ClientTimeout"></a>

**配置客户端超时**

适当地配置客户端超时，使服务器有足够的时间来处理请求并生成响应。如果无法建立与服务器的连接，这也将允许它快速失效。某些 Valkey 或 Redis OSS 命令的计算成本高于其他命令。例如，包含多条必须以原子方式运行的命令的 Lua 脚本或 MULTI/EXEC 事务。通常，建议使用更大的客户端超时，以避免客户端在收到来自服务器的响应之前超时，包括：
+ 在多个键上运行命令
+ 运行由多条 Valkey 或 Redis OSS 命令组成的 MULTI/EXEC 事务或 Lua 脚本
+ 读取较大的值
+ 执行诸如 BLPOP 之类的阻止操作

对于诸如 BLPOP 之类的阻止操作，最佳实践是将命令超时设置为小于套接字超时的数字。

以下是在 redis-py、PHPRedis 和 Lettuce 中实施客户端超时的代码示例。

**超时配置示例 1：redis-py**

以下是 redis-py 的代码示例：

```
# connect to Redis server with a 100 millisecond timeout
# give every Redis command a 2 second timeout
client = redis.Redis(connection_pool=redis.BlockingConnectionPool(host=HOST, max_connections=10,socket_connect_timeout=0.1,socket_timeout=2))

res = client.set("key", "value") # will timeout after 2 seconds
print(res)                       # if there is a connection error

res = client.blpop("list", timeout=1) # will timeout after 1 second
                                      # less than the 2 second socket timeout
print(res)
```

**超时配置示例 2：PHPRedis**

以下是 PHPRedis 的代码示例：

```
// connect to Redis server with a 100ms timeout
// give every Redis command a 2s timeout
$client = new Redis();
$timeout = 0.1; // 100 millisecond connection timeout
$retry_interval = 100; // 100 millisecond retry interval
$client = new Redis();
if($client->pconnect($HOST, $PORT, 0.1, NULL, 100, $read_timeout=2) != TRUE){
	return; // ERROR: connection failed
}
$client->set($key, $value);

$res = $client->set("key", "value"); // will timeout after 2 seconds
print "$res\n";                      // if there is a connection error

$res = $client->blpop("list", 1); // will timeout after 1 second
print "$res\n";                   // less than the 2 second socket timeout
```

**超时配置示例 3：Lettuce**

以下是 Lettuce 的代码示例：

```
// connect to Redis server and give every command a 2 second timeout
public static void main(String[] args)
{
	RedisClient client = null;
	StatefulRedisConnection<String, String> connection = null;
	try {
		client = RedisClient.create(RedisURI.create(HOST, PORT));
		client.setOptions(ClientOptions.builder()
	.socketOptions(SocketOptions.builder().connectTimeout(Duration.ofMillis(100)).build()) // 100 millisecond connection timeout
	.timeoutOptions(TimeoutOptions.builder().fixedTimeout(Duration.ofSeconds(2)).build()) // 2 second command timeout 
	.build());

		// use the connection pool from above example

		commands.set("key", "value"); // will timeout after 2 seconds
		commands.blpop(1, "list"); // BLPOP with 1 second timeout
	} finally {
		if (connection != null) {
			connection.close();
		}

		if (client != null){
			client.shutdown();
		}
	}
}
```

# 配置服务器端空闲超时（Valkey 和 Redis OSS）
<a name="BestPractices.Clients.Redis.ServerTimeout"></a>

我们观察到客户的应用程序连接了大量空闲客户端，但未主动发送命令的情况。在此类情况下，您可能会用尽所有 65000 个连接，并有大量空闲客户端。为了避免出现此类情况，可通过 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis) 在服务器上适当配置超时设置。这将确保服务器主动断开空闲客户端的连接，以避免连接增多。此设置不适用于无服务器缓存。

# Lua 脚本
<a name="BestPractices.Clients.Redis.LuaScripts"></a>

Valkey 和 Redis OSS 支持 200 多条命令，包括用于运行 Lua 脚本的命令。不过，对于 Lua 脚本，有几个缺陷可能会影响 Valkey 或 Redis OSS 的内存和可用性。

**非参数化 Lua 脚本**

每个 Lua 脚本在运行之前都会在 Valkey 或 Redis OSS 服务器上进行缓存。非参数化 Lua 脚本是独有的，这可能会导致 Valkey 或 Redis OSS 服务器存储大量 Lua 脚本并占用更多内存。为了减轻此情况，请确保所有 Lua 脚本都已参数化，并在需要时定期执行 SCRIPT FLUSH 来清除缓存的 Lua 脚本。

另请注意，必须提供键。如果未提供 KEY 参数的值，则脚本将失败。例如，以下脚本无效：

```
serverless-test-lst4hg.serverless.use1.cache.amazonaws.com:6379> eval 'return "Hello World"' 0
(error) ERR Lua scripts without any input keys are not supported.
```

以下脚本有效：

```
serverless-test-lst4hg.serverless.use1.cache.amazonaws.com:6379> eval 'return redis.call("get", KEYS[1])' 1 mykey-2
"myvalue-2"
```

以下示例说明如何定义和使用参数化脚本。首先，我们提供了一个非参数化方法的示例，它会生成三个不同的缓存 Lua 脚本，建议不使用此方法：

```
eval "return redis.call('set','key1','1')" 0
eval "return redis.call('set','key2','2')" 0
eval "return redis.call('set','key3','3')" 0
```

相反，请使用以下模式来创建能够接受传递的参数的单个脚本：

```
eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key1 1 
eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key2 2 
eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key3 3
```

**长时间运行的 Lua 脚本**

Lua 脚本可以原子方式运行多条命令，因此它们的完成时间长于常用 Valkey 或 Redis OSS 命令的完成时间。如果 Lua 脚本仅运行只读操作，则可中途将其停止。不过，一旦 Lua 脚本执行写入操作，就无法将其终止，必须运行直至完成。如果长时间运行的 Lua 脚本发生突变，则会导致 Valkey 或 Redis OSS 服务器长时间无法响应。要缓解此问题，请避免长时间运行的 Lua 脚本，并在预生产环境中测试脚本。

**带 Stealth 写入的 Lua 脚本**

即使 Valkey 或 Redis OSS 超出 `maxmemory`，Lua 脚本也可通过以下几种方式继续向 Valkey 或 Redis OSS 写入新数据：
+ 该脚本在 Valkey 或 Redis OSS 服务器低于 `maxmemory` 时启动，并包含多个写入操作
+ 脚本的第一条写入命令不占用内存（例如 DEL），后跟的多个写入操作会占用内存
+ 可以通过在 `noeviction` 之外的 Valkey 或 Redis OSS 服务器中配置适当的驱逐策略来缓解此问题。这将允许 Redis OSS 在 Lua 脚本之间驱逐项目并释放内存。

# 存储大型复合项目（Valkey 和 Redis OSS）
<a name="BestPractices.Clients.Redis.LargeItems"></a>

在某些情况下，应用程序可能会在 Valkey 或 Redis OSS 中存储大型复合项目（例如多 GB 哈希数据集）。建议不要这样做，因为这经常会导致 Valkey 或 Redis OSS 中出现性能问题。例如，客户端可以执行 HGETALL 命令来检索整个多 GB 哈希集合。这可能会给在客户端输出缓冲区中缓冲大型项目的 Valkey 或 Redis OSS 服务器带来巨大的内存压力。此外，对于集群模式下的槽迁移，ElastiCache 不迁移包含序列化大小超过 256 MB 的项目的槽。

为了解决大型项目问题，我们建议：
+ 将大型复合项目分解成多个小型项目。例如，将一个大型哈希集合分解成多个单独的键值字段，其键名架构恰当地反映了该集合，例如在键名中使用公共前缀来标识项目集合。如果您必须以原子方式访问同一集合中的多个字段，则可以使用 MGET 命令在同一个命令中检索多个键值。
+ 如果您评估了所有选项，但仍无法分解大型数据集，请尝试使用对集合中的部分数据而不是整个集合运行的命令。避免出现要求您以原子方式在同一命令中检索整个多 GB 集合的使用案例。一个示例是，在哈希集合上使用 HGET 或 HMGET 命令而不是使用 HGETALL 命令。

# Lettuce 客户端配置（Valkey 和 Redis OSS）
<a name="BestPractices.Clients-lettuce"></a>

本节介绍建议的 Java 和 Lettuce 配置选项，以及它们如何应用于 ElastiCache 集群。

本节中的建议已在 Lettuce 版本 6.2.2 中进行测试。

**Topics**
+ [

# 示例：启用集群模式和 TLS 的 Lettuce 配置
](BestPractices.Clients-lettuce-cme.md)
+ [

# 示例：禁用集群模式并启用 TLS 的 Lettuce 配置
](BestPractices.Clients-lettuce-cmd.md)

**Java DNS 缓存 TTL**

Java 虚拟机 (JVM) 缓存 DNS 名称查找。当 JVM 将主机名解析为 IP 地址时，它会在指定时间段内 (称为*生存时间* (TTL)) 缓存 IP 地址。

选择 TTL 值就是在延迟和对变化的响应能力之间进行权衡。TTL 越短，DNS 解析器就能越快注意到集群 DNS 中的更新。这样，您的应用程序就能更快地响应集群所经历的替换或其他工作流。但是，如果 TTL 过低，将会增加查询量，从而增加应用程序的延迟。虽然没有正确的 TTL 值，但在设置 TTL 值时，值得考虑您可以用来等待更改生效的时间长度。

由于 ElastiCache 节点使用可能会变更的 DNS 名称条目，因此建议您为 JVM 配置一个 5 到 10 秒的低 TTL 值。这可确保在节点的 IP 地址发生更改时，您的应用程序将能够通过重新查询 DNS 条目来接收和使用资源的新 IP 地址。

对于一些 Java 配置，将设置 JVM 默认 TTL，以便在重新启动 JVM 之前绝不刷新 DNS 条目。

有关如何设置 JVM TTL 的详细信息，请参阅[如何设置 JVM TTL](https://docs.amazonaws.cn/sdk-for-java/v1/developer-guide/java-dg-jvm-ttl.html#how-to-set-the-jvm-ttl)。

**Lettuce 版本**

我们建议使用 Lettuce 版本 6.2.2 或更高版本。

**了解如何查看、监控和管理 SageMaker 端点**

当您使用启用集群模式的集群时，将 `redisUri` 设置为集群配置终端节点。此 URI 的 DNS 查询将返回集群中所有可用节点的列表，并在集群初始化期间随机解析为其中一个节点。有关拓扑刷新工作原理的更多详细信息，请参阅本主题后面的 *dynamicRefreshResources*。

**SocketOption**

启用 [KeepAlive](https://lettuce.io/core/release/api/io/lettuce/core/SocketOptions.KeepAliveOptions.html)。启用此选项可减少在命令运行时期间处理失败连接的需求。

确保根据应用程序要求和工作负载设置[连接超时](https://lettuce.io/core/release/api/io/lettuce/core/SocketOptions.Builder.html#connectTimeout-java.time.Duration-)。有关更多信息，请参阅本主题后面的“超时”部分。

**ClusterClientOption：启用集群模式的客户端选项**

连接丢失时启用 [AutoReconnect](https://lettuce.io/core/release/api/io/lettuce/core/cluster/ClusterClientOptions.Builder.html#autoReconnect-boolean-)。

设置 [CommandTimeout](https://lettuce.io/core/release/api/io/lettuPrce/core/RedisURI.html#getTimeout--)。有关更多详细信息，请参阅本主题后面的“超时”部分。

设置 [nodeFilter](https://lettuce.io/core/release/api/io/lettuce/core/cluster/ClusterClientOptions.Builder.html#nodeFilter-java.util.function.Predicate-) 以从拓扑中筛选掉故障节点。Lettuce 将“集群节点”输出中找到的所有节点（包括处于 PFAIL/FAIL 状态的节点）保存在客户端的“分区”（也称为分片）中。在创建群集拓扑的过程中，它会尝试连接到所有分区节点。当节点因任何原因被替换时，Lettuce 这种添加故障节点的行为可能会导致连接错误（或警告）。

例如，在故障转移完成且集群启动恢复过程后，当刷新 clusterTopology 时，集群总线节点映射会在短时间内将故障节点列为 FAIL 节点，然后才会将其从拓扑中完全删除。在此期间，Lettuce 客户端会将其视为正常的节点并不断与其连接。这会导致在重试用尽后出现故障。

例如：

```
final ClusterClientOptions clusterClientOptions = 
    ClusterClientOptions.builder()
    ... // other options
    .nodeFilter(it -> 
        ! (it.is(RedisClusterNode.NodeFlag.FAIL) 
        || it.is(RedisClusterNode.NodeFlag.EVENTUAL_FAIL) 
        || it.is(RedisClusterNode.NodeFlag.HANDSHAKE)
        || it.is(RedisClusterNode.NodeFlag.NOADDR)))
    .validateClusterNodeMembership(false)
    .build();
redisClusterClient.setOptions(clusterClientOptions);
```

**注意**  
节点筛选最好是在将 DynamicRefreshSources 设置为 true 时使用。否则，如果拓扑视图取自单个问题种子节点（认为某个分片的主节点出现故障），则它将会筛选掉该主节点，从而导致插槽未被覆盖。拥有多个种子节点（当 DynamicRefreshSources 为 true 时）可以减小出现此问题的可能性，因为在使用新提升的主节点进行故障转移后，至少某些种子节点会有更新的拓扑视图。

**ClusterTopologyRefreshOptions：用于控制启用集群模式的客户端刷新集群拓扑的选项**

**注意**  
已禁用集群模式的集群不支持集群发现命令，并且与所有客户端的动态拓扑发现功能不兼容。  
使用 ElastiCache 禁用的集群模式与 Lettuce 的 `MasterSlaveTopologyRefresh` 不兼容。相反，如果禁用了集群模式，则可以配置 `StaticMasterReplicaTopologyProvider` 并提供集群读取和写入端点。  
有关连接到已禁用集群模式的集群的更多信息，请参阅[查找 Valkey 或 Redis OSS（已禁用集群模式）集群端点（控制台）](Endpoints.md#Endpoints.Find.Redis)。  
如果您想使用 Lettuce 的动态拓扑发现功能，则可以使用与现有集群相同的分片配置创建启用集群模式的集群。但是，对于启用集群模式的集群，我们建议至少配置 3 个分片以及至少一个副本，以支持快速失效转移。

启用 [enablePeriodicRefresh](https://lettuce.io/core/release/api/io/lettuce/core/cluster/ClusterTopologyRefreshOptions.Builder.html#enablePeriodicRefresh-java.time.Duration-)。这将启用定期集群拓扑更新，以便客户端按照 refreshPeriod 的间隔（默认为 60 秒）更新集群拓扑。如果禁用，则只有在客户端尝试对集群运行命令时出现错误的情况下，才会更新集群拓扑。

启用此选项后，您可以通过将此作业添加到后台任务来减少与刷新集群拓扑相关的延迟。虽然拓扑刷新是在后台作业中执行的，但对于具有多个节点的集群来说，拓扑刷新可能会有些慢。这是因为将会查询所有节点的视图以获取最新的集群视图。如果您运行大型集群，则可能需要延长间隔。

启用 [enableAllAdaptiveRefreshTriggers](https://lettuce.io/core/release/api/io/lettuce/core/cluster/ClusterTopologyRefreshOptions.Builder.html#enableAllAdaptiveRefreshTriggers--)。这将启用使用所有[触发器](https://lettuce.io/core/6.1.6.RELEASE/api/io/lettuce/core/cluster/ClusterTopologyRefreshOptions.RefreshTrigger.html)自适应拓扑刷新：MMOVED\$1REDIRECT、ASK\$1REDIRECT、PERSISTENT\$1RECONNECTS、UNCOVERED\$1SLOT、UNKNOWN\$1NODE。自适应刷新触发器根据 Valkey 或 Redis OSS 集群操作期间发生的事件启动拓扑视图更新。当发生上述触发器之一时，启用此选项会导致立即刷新拓扑。自适应触发刷新使用超时限制速率，因为事件可能会大规模发生（更新之间的默认超时时间为 30）。

启用 [closeStaleConnections](https://lettuce.io/core/release/api/io/lettuce/core/cluster/ClusterTopologyRefreshOptions.Builder.html#closeStaleConnections-boolean-)。这可以在刷新集群拓扑时关闭过时的连接。只有在 [ClusterTopologyRefreshOptions.isPeriodicRefreshEnabled()](https://lettuce.io/core/release/api/io/lettuce/core/cluster/ClusterTopologyRefreshOptions.html#isPeriodicRefreshEnabled--) 为 true 时，它才会生效。启用此选项后，客户端可以关闭过时的连接并在后台创建新连接。这减少了在命令运行时期间处理失败连接的需求。

启用 [dynamicRefreshResources](https://lettuce.io/core/release/api/io/lettuce/core/cluster/ClusterTopologyRefreshOptions.Builder.html#dynamicRefreshSources-boolean-)。我们建议为小型集群启用 dynamicRefreshResources，为大型集群禁用 dynamicRefreshResources。dynamicRefreshResources 支持从提供的种子节点（例如，群集配置终端节点）发现集群节点。它使用所有发现的节点作为刷新集群拓扑的源。

使用动态刷新查询所有已发现的集群拓扑节点，并尝试选择最准确的集群视图。如果将其设置为 false，则仅使用初始种子节点作为拓扑发现的源，并且仅获取初始种子节点的客户端数量。禁用后，如果将集群配置终端节点解析为故障节点，则尝试刷新集群视图会失败并导致异常。之所以会发生这种情况，是因为从集群配置端点中删除故障节点的条目需要一些时间。因此，仍然会在短时间内将配置终端节点随机解析为故障节点。

但是，启用后，我们会使用从集群视图接收到的所有集群节点来查询其当前视图。因为我们从该视图中筛选掉了故障的节点，所以拓扑刷新将会成功。但是，当 dynamicRefreshSources 为 true 时，Lettuce 会查询所有节点来获取集群视图，然后比较结果。因此，对于拥有大量节点的集群来说，这可能会很昂贵。我们建议您为具有多个节点的集群关闭此功能。

```
final ClusterTopologyRefreshOptions topologyOptions = 
    ClusterTopologyRefreshOptions.builder()
    .enableAllAdaptiveRefreshTriggers()
    .enablePeriodicRefresh()
    .dynamicRefreshSources(true)
    .build();
```

**ClientResources**

配置 [DnsResolver](https://lettuce.io/core/release/api/io/lettuce/core/resource/DefaultClientResources.Builder.html#dnsResolver-io.lettuce.core.resource.DnsResolver-) 与 [DirContextDnsResolver](https://lettuce.io/core/release/api/io/lettuce/core/resource/DirContextDnsResolver.html)。DNS 解析器基于 Java 的 com.sun.jndi.dns.DnsContextFactory。

为 [reconnectDelay](https://lettuce.io/core/release/api/io/lettuce/core/resource/DefaultClientResources.Builder.html#reconnectDelay-io.lettuce.core.resource.Delay-) 配置指数回退和完全抖动。Lettuce 具有基于指数回退策略的内置重试机制。有关详细信息，请参阅 Amazon 架构博客上的[指数回退和抖动](https://www.amazonaws.cn/blogs/architecture/exponential-backoff-and-jitter)。有关具备重试回退策略的重要性的更多信息，请参阅 Amazon 数据库博客上[最佳实践博客文章](https://www.amazonaws.cn/blogs/database/best-practices-redis-clients-and-amazon-elasticache-for-redis/)的回退逻辑部分。

```
ClientResources clientResources = DefaultClientResources.builder()
   .dnsResolver(new DirContextDnsResolver())
    .reconnectDelay(
        Delay.fullJitter(
            Duration.ofMillis(100),     // minimum 100 millisecond delay
            Duration.ofSeconds(10),      // maximum 10 second delay
            100, TimeUnit.MILLISECONDS)) // 100 millisecond base
    .build();
```

**超时**

使用比您的命令超时更低的连接超时值。Lettuce 使用延迟连接建立。因此，在连接超时高于命令超时的情况下，如果 Lettuce 尝试连接到不正常的节点并且总是超过命令超时，则拓扑刷新后可能会持续失败一段时间。

对不同的命令使用动态命令超时。建议您根据命令预期时长设置命令超时。例如，对遍历多个键的命令（例如 FLUSHDB、FLUSHALL、KEYS、SMEMBERS 或 Lua 脚本）使用较长的超时。对单键命令（例如 SET、GET 和 HSET）使用较短的超时。

**注意**  
以下示例中配置的超时适用于运行键和值长度最多为 20 字节的 SET/GET 命令的测试。当命令较复杂或键和值较大时，处理时间可能会更长。您应该根据应用程序的用例设置超时。

```
private static final Duration META_COMMAND_TIMEOUT = Duration.ofMillis(1000);
private static final Duration DEFAULT_COMMAND_TIMEOUT = Duration.ofMillis(250);
// Socket connect timeout should be lower than command timeout for Lettuce
private static final Duration CONNECT_TIMEOUT = Duration.ofMillis(100);
    
SocketOptions socketOptions = SocketOptions.builder()
    .connectTimeout(CONNECT_TIMEOUT)
    .build();
 

class DynamicClusterTimeout extends TimeoutSource {
     private static final Set<ProtocolKeyword> META_COMMAND_TYPES = ImmutableSet.<ProtocolKeyword>builder()
          .add(CommandType.FLUSHDB)
          .add(CommandType.FLUSHALL)
          .add(CommandType.CLUSTER)
          .add(CommandType.INFO)
          .add(CommandType.KEYS)
          .build();

    private final Duration defaultCommandTimeout;
    private final Duration metaCommandTimeout;

    DynamicClusterTimeout(Duration defaultTimeout, Duration metaTimeout)
    {
        defaultCommandTimeout = defaultTimeout;
        metaCommandTimeout = metaTimeout;
    }

    @Override
    public long getTimeout(RedisCommand<?, ?, ?> command) {
        if (META_COMMAND_TYPES.contains(command.getType())) {
            return metaCommandTimeout.toMillis();
        }
        return defaultCommandTimeout.toMillis();
    }
}

// Use a dynamic timeout for commands, to avoid timeouts during
// cluster management and slow operations.
TimeoutOptions timeoutOptions = TimeoutOptions.builder()
.timeoutSource(
    new DynamicClusterTimeout(DEFAULT_COMMAND_TIMEOUT, META_COMMAND_TIMEOUT))
.build();
```

# 示例：启用集群模式和 TLS 的 Lettuce 配置
<a name="BestPractices.Clients-lettuce-cme"></a>

**注意**  
以下示例中的超时适用于运行键和值长度最多 20 字节的 SET/GET 命令的测试。当命令较复杂或键和值较大时，处理时间可能会更长。您应该根据应用程序的用例设置超时。

```
// Set DNS cache TTL
public void setJVMProperties() {
    java.security.Security.setProperty("networkaddress.cache.ttl", "10");
}

private static final Duration META_COMMAND_TIMEOUT = Duration.ofMillis(1000);
private static final Duration DEFAULT_COMMAND_TIMEOUT = Duration.ofMillis(250);
// Socket connect timeout should be lower than command timeout for Lettuce
private static final Duration CONNECT_TIMEOUT = Duration.ofMillis(100);

// Create RedisURI from the cluster configuration endpoint
clusterConfigurationEndpoint = <cluster-configuration-endpoint> // TODO: add your cluster configuration endpoint
final RedisURI redisUriCluster =
    RedisURI.Builder.redis(clusterConfigurationEndpoint)
        .withPort(6379)
        .withSsl(true)
        .build();

// Configure the client's resources                
ClientResources clientResources = DefaultClientResources.builder()
    .reconnectDelay(
        Delay.fullJitter(
            Duration.ofMillis(100),     // minimum 100 millisecond delay
            Duration.ofSeconds(10),      // maximum 10 second delay
            100, TimeUnit.MILLISECONDS)) // 100 millisecond base
    .dnsResolver(new DirContextDnsResolver())
    .build(); 

// Create a cluster client instance with the URI and resources
RedisClusterClient redisClusterClient = 
    RedisClusterClient.create(clientResources, redisUriCluster);

// Use a dynamic timeout for commands, to avoid timeouts during
// cluster management and slow operations.
class DynamicClusterTimeout extends TimeoutSource {
     private static final Set<ProtocolKeyword> META_COMMAND_TYPES = ImmutableSet.<ProtocolKeyword>builder()
          .add(CommandType.FLUSHDB)
          .add(CommandType.FLUSHALL)
          .add(CommandType.CLUSTER)
          .add(CommandType.INFO)
          .add(CommandType.KEYS)
          .build();

    private final Duration metaCommandTimeout;
    private final Duration defaultCommandTimeout;

    DynamicClusterTimeout(Duration defaultTimeout, Duration metaTimeout)
    {
        defaultCommandTimeout = defaultTimeout;
        metaCommandTimeout = metaTimeout;
    }

    @Override
    public long getTimeout(RedisCommand<?, ?, ?> command) {
        if (META_COMMAND_TYPES.contains(command.getType())) {
            return metaCommandTimeout.toMillis();
        }
        return defaultCommandTimeout.toMillis();
    }
}

TimeoutOptions timeoutOptions = TimeoutOptions.builder()
    .timeoutSource(new DynamicClusterTimeout(DEFAULT_COMMAND_TIMEOUT, META_COMMAND_TIMEOUT))
     .build();

// Configure the topology refreshment options
final ClusterTopologyRefreshOptions topologyOptions = 
    ClusterTopologyRefreshOptions.builder()
    .enableAllAdaptiveRefreshTriggers()
    .enablePeriodicRefresh()
    .dynamicRefreshSources(true)
    .build();

// Configure the socket options
final SocketOptions socketOptions = 
    SocketOptions.builder()
    .connectTimeout(CONNECT_TIMEOUT) 
    .keepAlive(true)
    .build();

// Configure the client's options
final ClusterClientOptions clusterClientOptions = 
    ClusterClientOptions.builder()
    .topologyRefreshOptions(topologyOptions)
    .socketOptions(socketOptions)
    .autoReconnect(true)
    .timeoutOptions(timeoutOptions) 
    .nodeFilter(it -> 
        ! (it.is(RedisClusterNode.NodeFlag.FAIL) 
        || it.is(RedisClusterNode.NodeFlag.EVENTUAL_FAIL) 
        || it.is(RedisClusterNode.NodeFlag.NOADDR))) 
    .validateClusterNodeMembership(false)
    .build();
    
redisClusterClient.setOptions(clusterClientOptions);

// Get a connection
final StatefulRedisClusterConnection<String, String> connection = 
    redisClusterClient.connect();

// Get cluster sync/async commands   
RedisAdvancedClusterCommands<String, String> sync = connection.sync();
RedisAdvancedClusterAsyncCommands<String, String> async = connection.async();
```

# 示例：禁用集群模式并启用 TLS 的 Lettuce 配置
<a name="BestPractices.Clients-lettuce-cmd"></a>

**注意**  
以下示例中的超时适用于运行键和值长度最多 20 字节的 SET/GET 命令的测试。当命令较复杂或键和值较大时，处理时间可能会更长。您应该根据应用程序的用例设置超时。

```
// Set DNS cache TTL
public void setJVMProperties() {
    java.security.Security.setProperty("networkaddress.cache.ttl", "10");
}

private static final Duration META_COMMAND_TIMEOUT = Duration.ofMillis(1000);
private static final Duration DEFAULT_COMMAND_TIMEOUT = Duration.ofMillis(250);
// Socket connect timeout should be lower than command timeout for Lettuce
private static final Duration CONNECT_TIMEOUT = Duration.ofMillis(100);

// Create RedisURI from the primary/reader endpoint
clusterEndpoint = <primary/reader-endpoint> // TODO: add your node endpoint
RedisURI redisUriStandalone =
    RedisURI.Builder.redis(clusterEndpoint).withPort(6379).withSsl(true).withDatabase(0).build();

ClientResources clientResources =
    DefaultClientResources.builder()
        .dnsResolver(new DirContextDnsResolver())
        .reconnectDelay(
            Delay.fullJitter(
                Duration.ofMillis(100), // minimum 100 millisecond delay
                Duration.ofSeconds(10), // maximum 10 second delay
                100,
                TimeUnit.MILLISECONDS)) // 100 millisecond base
        .build();

// Use a dynamic timeout for commands, to avoid timeouts during
// slow operations.
class DynamicTimeout extends TimeoutSource {
     private static final Set<ProtocolKeyword> META_COMMAND_TYPES = ImmutableSet.<ProtocolKeyword>builder()
          .add(CommandType.FLUSHDB)
          .add(CommandType.FLUSHALL)
          .add(CommandType.INFO)
          .add(CommandType.KEYS)
          .build();

    private final Duration metaCommandTimeout;
    private final Duration defaultCommandTimeout;

    DynamicTimeout(Duration defaultTimeout, Duration metaTimeout)
    {
        defaultCommandTimeout = defaultTimeout;
        metaCommandTimeout = metaTimeout;
    }

    @Override
    public long getTimeout(RedisCommand<?, ?, ?> command) {
        if (META_COMMAND_TYPES.contains(command.getType())) {
            return metaCommandTimeout.toMillis();
        }
        return defaultCommandTimeout.toMillis();
    }
}

TimeoutOptions timeoutOptions = TimeoutOptions.builder()
    .timeoutSource(new DynamicTimeout(DEFAULT_COMMAND_TIMEOUT, META_COMMAND_TIMEOUT))
     .build();                      
                                    
final SocketOptions socketOptions =
    SocketOptions.builder().connectTimeout(CONNECT_TIMEOUT).keepAlive(true).build();

ClientOptions clientOptions =
    ClientOptions.builder().timeoutOptions(timeoutOptions).socketOptions(socketOptions).build();

RedisClient redisClient = RedisClient.create(clientResources, redisUriStandalone);
redisClient.setOptions(clientOptions);
```

## 为双堆栈集群配置首选协议（Valkey 和 Redis OSS）
<a name="network-type-configuring-dual-stack-redis"></a>

对于启用了集群模式的 Valkey 或 Redis OSS 集群，您可以使用 IP 发现参数控制客户端将用于连接到集群中的节点的协议。IP 发现参数可以设置为 IPv4 或 IPv6。

对于 Valkey 或 Redis OSS 集群，IP 发现参数可设置 [cluster slots ()](https://valkey.io/commands/cluster-slots/)、[cluster shards ()](https://valkey.io/commands/cluster-shards/) 和 [cluster nodes ()](https://valkey.io/commands/cluster-nodes/) 输出中使用的 IP 协议。客户端使用这些命令来发现集群拓扑。客户端使用这些命令中的 IP 连接到集群中的其他节点。

更改 IP 发现不会导致连接的客户端出现任何停机。但是，更改需要一些时间才能传播。要确定 Valkey 或 Redis OSS 集群的更改何时完全传播，请监控 `cluster slots` 的输出。一旦 cluster slots 命令返回的所有节点报告了使用新协议的 IP，就表明更改完成了传播。

使用 Redis-Py 的示例：

```
cluster = RedisCluster(host="xxxx", port=6379)
target_type = IPv6Address # Or IPv4Address if changing to IPv4

nodes = set()
while len(nodes) == 0 or not all((type(ip_address(host)) is target_type) for host in nodes):
    nodes = set()

   # This refreshes the cluster topology and will discovery any node updates.
   # Under the hood it calls cluster slots
    cluster.nodes_manager.initialize()
    for node in cluster.get_nodes():
        nodes.add(node.host)
    self.logger.info(nodes)

    time.sleep(1)
```

使用 Lettuce 的示例：

```
RedisClusterClient clusterClient = RedisClusterClient.create(RedisURI.create("xxxx", 6379));

Class targetProtocolType = Inet6Address.class; // Or Inet4Address.class if you're switching to IPv4

Set<String> nodes;
    
do {
   // Check for any changes in the cluster topology.
   // Under the hood this calls cluster slots
    clusterClient.refreshPartitions();
    Set<String> nodes = new HashSet<>();

    for (RedisClusterNode node : clusterClient.getPartitions().getPartitions()) {
        nodes.add(node.getUri().getHost());
    }

    Thread.sleep(1000);
} while (!nodes.stream().allMatch(node -> {
            try {
                return finalTargetProtocolType.isInstance(InetAddress.getByName(node));
            } catch (UnknownHostException ignored) {}
            return false;
}));
```

# 客户端最佳实践（Memcached）
<a name="BestPractices.Clients.memcached"></a>

了解针对 ElastiCache for Memcached 集群的常见场景的最佳实践。

**Topics**
+ [

# 配置您的 ElastiCache 客户端以实现高效的负载平衡 (Memcached)
](BestPractices.LoadBalancing.md)
+ [

# 经验证可用于 Memcached 的客户端
](network-type-validated-clients-memcached.md)
+ [

# 为双堆栈集群配置首选协议（Memcached）
](network-type-configuring-dual-stack-memcached.md)

# 配置您的 ElastiCache 客户端以实现高效的负载平衡 (Memcached)
<a name="BestPractices.LoadBalancing"></a>

**注意**  
本节适用于基于节点的多节点 Memcached 集群。

要有效使用多个 ElastiCache Memcached 节点，您需要能够将缓存密钥分布在各个节点上。对具有 *n* 个节点的集群进行负载均衡的一个简单方法是，计算该对象的键的哈希并通过 *n* – `hash(key) mod n` 修改结果。所得的值（0 到 *n*–1）是您放置对象的节点的编号。

只要节点数 (*n*) 恒定，这种方法就简便可行。但是，每当您向集群添加节点或从集群删除节点时，需要移动的键数都是 *(n - 1)/n*（其中，*n* 是新的节点数）。因此，这种方法会造成移动大量键，并转变为很大的初始缓存未命中数，尤其是当节点数变大时。从 1 个节点扩展为 2 个节点会导致 (2-1)/2 (50%) 的键移动，这是最好的情况。从 9 个节点扩展为 10 个节点会导致 (10–1)/10 (90%) 的键移动。如果因为峰值流量而纵向扩展，您不会希望缓存未命中数变得很大。缓存未命中数很大会造成数据库命中，而数据库已经因峰值流量而过载。

这种两难困境的解决方法是使用一致性哈希。一致性哈希使用这样的算法：每当向集群添加节点或从集群删除节点时，必须移动的键的数目大致为 *1/n*（其中，*n* 是新的节点数）。从 1 个节点扩展为 2 个节点会造成移动 1/2 (50%) 的键，这是最差的情况。从 9 个节点扩展为 10 个节点会造成移动 1/10 (10%) 的键。

作为用户，您可以控制对多节点集群使用哪种哈希算法。建议您将客户端配置为使用一致性哈希。幸运的是，有很多用最常见语言编写的 Memcached 客户端库可以实现一致性哈希。请参阅您要使用的库的文档，了解其是否支持一致性哈希以及如何实现一致性哈希。

如果您使用的是 Java、PHP 或.NET，我们建议您使用其中一个 Amazon ElastiCache 客户端库。

## 使用 Java 实现一致性哈希
<a name="BestPractices.LoadBalancing.Java"></a>

 ElastiCache Memcached Java 客户端基于开源 spymemcached Java 客户端，该客户端内置了一致的哈希功能。该库包含一个实现一致性哈希的KetamaConnectionFactory 类。默认情况下，spymemcached 中禁用一致性哈希。

有关更多信息，请参阅中的 KetamaConnectionFactory 文档[KetamaConnectionFactory](https://github.com/RTBHOUSE/spymemcached/blob/master/src/main/java/net/spy/memcached/KetamaConnectionFactory.java)。

## 使用 Memcached PHP 实现一致性哈希
<a name="BestPractices.LoadBalancing.PHP"></a>

 ElastiCache Memcached PHP 客户端是内置 Memcached PHP 库的封装器。默认情况下，Memcached PHP 库禁用一致性哈希。

使用以下代码可以启用一致性哈希。

```
$m = new Memcached();
$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
```

除了上述代码之外，我们还建议您在 php.ini 文件中启用 `memcached.sess_consistent_hash`。

 [有关更多信息，请参阅 Memcached PHP 的运行时配置文档，网址为 http://php。 net/manual/en/memcached.configuration.php](http://php.net/manual/en/memcached.configuration.php) 请特别注意 `memcached.sess_consistent_hash` 参数。

## 使用 Memcached .NET 实现一致性哈希
<a name="BestPractices.LoadBalancing.dotNET"></a>

 ElastiCache Memcached .NET 客户端是围绕 Enyim Memcached 的封装器。默认情况下，Enyim Memcached 客户端已启用一致性哈希。

 有关更多信息，请参阅 [https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configur `memcached/locator` user-content-memcachedlocator](https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration#user-content-memcachedlocator) ation\$1 中的文档。

# 经验证可用于 Memcached 的客户端
<a name="network-type-validated-clients-memcached"></a>

以下客户端经过专门验证，可与 Memcached 支持的所有网络类型配置配合使用。

经过验证的客户端：
+ [Amazon适用于 Php 的 ElastiCache 集群客户端 Memcached](https://github.com/awslabs/aws-elasticache-cluster-client-memcached-for-php) - [版本 \$13.6.2](https://github.com/awslabs/aws-elasticache-cluster-client-memcached-for-php/tree/v3.2.0)
+ [Amazon适用于 Java 的 ElastiCache 集群客户端 Memcached](https://github.com/awslabs/aws-elasticache-cluster-client-memcached-for-java) - Github 上的最新主版本

# 为双堆栈集群配置首选协议（Memcached）
<a name="network-type-configuring-dual-stack-memcached"></a>

对于 Memcached 集群，您可以使用 IP 发现参数控制客户端将用于连接到集群中的节点的协议。IP 发现参数可以设置为 IPv4 或 IPv6。

IP 发现参数控制 config get 集群输出中使用的 IP 协议。这反过来将决定支持自动发现 ElastiCache for Memcached 集群的客户端使用的 IP 协议。

更改 IP 发现不会导致连接的客户端出现任何停机。但是，更改需要一些时间才能传播。

监视适用于 Java 和 Php 的 `getAvailableNodeEndPoints` 的输出，并监视 `getServerList` 的输出。一旦这些函数的输出报告了集群中使用更新协议的所有节点的 IP，更改即已完成传播。

Java 示例：

```
MemcachedClient client = new MemcachedClient(new InetSocketAddress("xxxx", 11211));

Class targetProtocolType = Inet6Address.class; // Or Inet4Address.class if you're switching to IPv4

Set<String> nodes;
    
do {
    nodes = client.getAvailableNodeEndPoints().stream().map(NodeEndPoint::getIpAddress).collect(Collectors.toSet());

    Thread.sleep(1000);
} while (!nodes.stream().allMatch(node -> {
            try {
                return finalTargetProtocolType.isInstance(InetAddress.getByName(node));
            } catch (UnknownHostException ignored) {}
            return false;
        }));
```

Php 示例：

```
$client = new Memcached;
$client->setOption(Memcached::OPT_CLIENT_MODE, Memcached::DYNAMIC_CLIENT_MODE);
$client->addServer("xxxx", 11211);

$nodes = [];
$target_ips_count = 0;
do {
    # The PHP memcached client only updates the server list if the polling interval has expired and a
    # command is sent
    $client->get('test');
 
    $nodes = $client->getServerList();

    sleep(1);
    $target_ips_count = 0;

    // For IPv4 use FILTER_FLAG_IPV4
    $target_ips_count = count(array_filter($nodes, function($node) { return filter_var($node["ipaddress"], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6); }));
 
} while (count($nodes) !== $target_ips_count);
```

在 IP 发现更新之前创建的任何现有客户端连接仍将使用旧协议进行连接。一旦在集群发现命令的输出中检测到更改，所有经过验证的客户端都将使用新的 IP 协议自动重新连接到集群。但是，这取决于客户端的实现。

## 启用 TLS 的双栈 ElastiCache 集群
<a name="network-type-configuring-tls-enabled-dual-stack"></a>

为 ElastiCache 集群启用 TLS 时，集群发现函数（Redis 的 `cluster slots`、`cluster shards` 和 `cluster nodes`）或 Memcached `config get cluster` 返回的是主机名而不是 IP。然后使用主机名代替 IP 来连接到 ElastiCache 集群并执行 TLS 握手。这意味着客户端不会受到 IP 发现参数的影响。对于启用 TLS 的集群，IP 发现参数对首选 IP 协议没有影响。相反，使用的 IP 协议将取决于客户端在解析 DNS 主机名时首选的 IP 协议。

**Java 客户端**

从同时支持 IPv4 和 IPv6 的 Java 环境进行连接时，为了实现向后兼容，Java 默认情况下会优先使用 IPv4 而不是 IPv6。但是，IP 协议首选项可通过 JVM 参数进行配置。要首选 IPv4，JVM 会接受 `-Djava.net.preferIPv4Stack=true` 并首选 IPv6 集 `-Djava.net.preferIPv6Stack=true`。设置 `-Djava.net.preferIPv4Stack=true` 意味着 JVM 将不再建立任何 IPv6 连接。**对于 Valkey 或 Redis OSS，这包括与其他非 Valkey 和非 Redis OSS 应用程序的连接。**

**主机级别首选项**

通常，如果客户端或客户端运行时系统不提供用于设置 IP 协议首选项的配置选项，则在执行 DNS 解析时，IP 协议将取决于主机的配置。默认情况下，大多数主机更喜欢 IPv6 而不是 IPv4，但可以在主机级别配置此首选项。这将影响来自该主机的所有 DNS 请求，而不仅仅是发往 ElastiCache 集群的请求。

**Linux 主**

对于 Linux，可以通过修改`gai.conf`文件来配置 IP 协议首选项。可以在下方找到该`gai.conf`文件`/etc/gai.conf`。如果未`gai.conf`指定，则应提供一个示例`/usr/share/doc/glibc-common-x.xx/gai.conf`，可以在其下复制到，`/etc/gai.conf`然后应取消注释默认配置。要将配置更新为在连接到 ElastiCache 集群时首选 IPv4，请更新包含集群 IP 的 CIDR 范围的优先级，使其高于默认 IPv6 连接的优先级。默认情况下，IPv6 连接的优先级为 40。例如，假设集群位于 CIDR 172.31.0.0:0/16 的子网中，则以下配置将导致客户端优先使用该集群的 IPv4 连接。

```
label ::1/128       0
label ::/0          1
label 2002::/16     2
label ::/96         3
label ::ffff:0:0/96 4
label fec0::/10     5
label fc00::/7      6
label 2001:0::/32   7
label ::ffff:172.31.0.0/112 8
#
#    This default differs from the tables given in RFC 3484 by handling
#    (now obsolete) site-local IPv6 addresses and Unique Local Addresses.
#    The reason for this difference is that these addresses are never
#    NATed while IPv4 site-local addresses most probably are.  Given
#    the precedence of IPv6 over IPv4 (see below) on machines having only
#    site-local IPv4 and IPv6 addresses a lookup for a global address would
#    see the IPv6 be preferred.  The result is a long delay because the
#    site-local IPv6 addresses cannot be used while the IPv4 address is
#    (at least for the foreseeable future) NATed.  We also treat Teredo
#    tunnels special.
#
# precedence  <mask>   <value>
#    Add another rule to the RFC 3484 precedence table.  See section 2.1
#    and 10.3 in RFC 3484.  The default is:
#
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10
precedence ::ffff:172.31.0.0/112 100
```

有关 `gai.conf` 的更多详细信息，请参阅 [Linux 主页](https://man7.org/linux/man-pages/man5/gai.conf.5.html) 

**微软主机**

Windows 主机的过程与此类似。对于 Windows 主机，你可以运行`netsh interface ipv6 set prefix CIDR_CONTAINING_CLUSTER_IPS PRECEDENCE LABEL`。这与修改 Linux 主机上的`gai.conf`文件效果相同。

这将更新优先级策略，使指定的 CIDR 范围优先于 IPv4 连接而不是 IPv6 连接。例如，假设群集位于子网中，执行 172.31.0.0:0/16 CIDR`netsh interface ipv6 set prefix ::ffff:172.31.0.0:0/112 100 15` 将生成以下优先级表，这将导致客户端在连接到集群时首选 IPv4。

```
C:\Users\Administrator>netsh interface ipv6 show prefixpolicies
Querying active state...

Precedence Label Prefix
---------- ----- --------------------------------
100 15 ::ffff:172.31.0.0:0/112
20 4 ::ffff:0:0/96
50 0 ::1/128
40 1 ::/0
30 2 2002::/16
5 5 2001::/32
3 13 fc00::/7
1 11 fec0::/10
1 12 3ffe::/16
1 3 ::/96
```

# 管理 Valkey 和 Redis OSS 的预留内存
<a name="redis-memory-management"></a>

预留内存是为非数据使用情况留出的内存。执行备份或失效转移时，Valkey 和 Redis OSS 使用可用的内存来记录将集群数据写入 .rdb 文件时对集群执行的写入操作。如果您没有足够的内存可供所有写入使用，则进程失败。以下部分介绍了管理 ElastiCache for Redis OSS 预留内存的选项的相关信息，以及如何应用这些选项。

**Topics**
+ [

## 您需要预留多少内存？
](#redis-memory-management-need)
+ [

## 用于管理预留内存的参数
](#redis-memory-management-parameters)
+ [

## 指定您的预留内存管理参数
](#redis-reserved-memory-management-change)

## 您需要预留多少内存？
<a name="redis-memory-management-need"></a>

如果您在运行 2.8.22 版之前的 Redis OSS，则针对备份和失效转移预留的内存量，要高于运行 Redis OSS 2.8.22 版或更高版本时所需的内存量。这是由于 ElastiCache for Redis OSS 采用不同方法实现备份流程。经验法则是，对于 2.8.22 版之前的 Redis OSS，预留节点类型 `maxmemory` 值一半的内存，对于 Redis OSS 2.8.22 版和更高版本则为四分之一。

由于 ElastiCache 实现备份和复制过程的方式不同，经验法则是使用 `maxmemory` 参数预留节点类型 `reserved-memory-percent` 值的 25%。这是默认值，建议在大多数情况下使用。

当可突增微型和小型实例类型在接近 `maxmemory` 限制时运行，可能会出现交换使用情况。为了提高这些实例类型在备份、复制和高流量期间的运行可靠性，我们建议将 `reserved-memory-percent` 参数的值提高到 30%（小型实例类型）和 50%（微型实例类型）。

对于有数据分层功能的 ElastiCache 集群上的写入密集型工作负载，我们建议将 `reserved-memory-percent` 提高到节点可用内存的 50%。

有关更多信息，请参阅下列内容：
+ [确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)
+ [如何实施同步和备份](Replication.Redis.Versions.md)
+ [ElastiCache 中的数据分层](data-tiering.md)

## 用于管理预留内存的参数
<a name="redis-memory-management-parameters"></a>

自 2017 年 3 月 16 日起，Amazon ElastiCache 提供两个互斥参数（`reserved-memory` 和 `reserved-memory-percent`），用于管理 Valkey 或 Redis OSS 内存。Valkey 或 Redis OSS 发行版中不包含这两个参数。

这二者中的其一将是默认内存管理参数，具体取决于您开始使用 ElastiCache 的时间。在您创建新的 Valkey 或 Redis OSS 集群或复制组并使用默认参数组时，此参数适用。
+ 对于在 2017 年 3 月 16 日之前开始使用 ElastiCache 的客户，当您使用默认参数组创建 Redis OSS 集群或复制组时，内存管理参数为 `reserved-memory`。在此情况下，将预留零 (0) 字节内存。
+ 对于在 2017 年 3 月 16 日或之后开始使用 ElastiCache 的客户 – 当您使用默认参数组创建 Valkey 或 Redis OSS 集群或复制组时，内存管理参数为 `reserved-memory-percent`。在此情况下，将预留 25% 的节点 `maxmemory` 值用于非数据目的。

在了解了两个 Valkey 或 Redis OSS 内存管理参数后，您可能首选使用不是默认值或具有非默认值的该内存管理参数。如若如此，您可以更改为其他预留内存管理参数。

要更改该参数的值，您可以创建一个自定义参数组并对其进行修改以使用首选内存管理参数和值。然后，每当您创建新的 Valkey 或 Redis OSS 集群或复制组时，都可以使用自定义参数组。对于现有集群或复制组，您可以修改它们以使用自定义参数组。

 有关更多信息，请参阅下列内容：
+ [指定您的预留内存管理参数](#redis-reserved-memory-management-change)
+ [创建 ElastiCache 参数组](ParameterGroups.Creating.md)
+ [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)
+ [修改 ElastiCache 集群](Clusters.Modify.md)
+ [修改复制组](Replication.Modify.md)

### reserved-memory 参数
<a name="redis-memory-management-parameters-reserved-memory"></a>

在 2017 年 3 月 16 日之前，所有 ElastiCache for Redis OSS 预留内存管理均采用 `reserved-memory` 参数完成。`reserved-memory` 的默认值为 0。此默认值不为 Valkey 或 Redis OSS 开销预留内存，并允许 Valkey 或 Redis OSS 将所有节点内存用于数据。

您需要创建自定义参数组，才可更改 `reserved-memory` 以使您有足够的内存可用于备份和故障转移。在此自定义参数组中，您可将 `reserved-memory` 设置为适用于您的集群和集群节点类型上所运行的 Valkey 或 Redis OSS 版本的值。有关更多信息，请参阅 [您需要预留多少内存？](#redis-memory-management-need)。

参数 `reserved-memory` 特定于 ElastiCache，而且 Redis OSS 正式发行版中不包含此参数。

以下过程显示如何使用 `reserved-memory` 来管理 Valkey 或 Redis OSS 集群上的内存。

**使用 reserved-memory 预留内存**

1. 创建一个自定义参数组，指定与正在运行的引擎版本匹配的参数组系列，例如，指定 `redis2.8` 参数组系列。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

   ```
   aws elasticache create-cache-parameter-group \
      --cache-parameter-group-name redis6x-m3xl \
      --description "Redis OSS 2.8.x for m3.xlarge node type" \
      --cache-parameter-group-family redis6.x
   ```

1. 计算要为 Valkey 或 Redis OSS 开销预留的内存大小。在`maxmemory`中可找到适合您节点类型的 [特定于 Redis OSS 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.NodeSpecific) 值。

1. 修改自定义参数组，使得参数 `reserved-memory` 为您在上一步中计算得到的字节数。以下 Amazon CLI 示例假设您正在运行 2.8.22 版之前的 Redis OSS，需要预留节点的 `maxmemory` 的一半。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

   ```
   aws elasticache modify-cache-parameter-group \
      --cache-parameter-group-name redis28-m3xl \
      --parameter-name-values "ParameterName=reserved-memory, ParameterValue=7130316800"
   ```

   您使用的每个节点类型需要一个单独的自定义参数组，因为每个节点类型的 `maxmemory` 值不同。因此，每个节点类型需要不同的 `reserved-memory` 值。

1. 修改您的 Redis OSS 集群或复制组以使用自定义参数组。

   以下 CLI 示例修改集群 ` my-redis-cluster` 以立即开始使用自定义参数组 `redis28-m3xl`。有关更多信息，请参阅 [修改 ElastiCache 集群](Clusters.Modify.md)。

   ```
   aws elasticache modify-cache-cluster \
      --cache-cluster-id my-redis-cluster \
      --cache-parameter-group-name redis28-m3xl \
      --apply-immediately
   ```

   以下 CLI 示例修改复制组 `my-redis-repl-grp` 以立即开始使用自定义参数组 `redis28-m3xl`。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

   ```
   aws elasticache modify-replication-group \
      --replication-group-id my-redis-repl-grp \
      --cache-parameter-group-name redis28-m3xl \
      --apply-immediately
   ```

### reserved-memory-percent 参数
<a name="redis-memory-management-parameters-reserved-memory-percent"></a>

2017 年 3 月 16 日，Amazon ElastiCache 引入了参数 `reserved-memory-percent`，并在 ElastiCache for Redis OSS 所有版本上提供。`reserved-memory-percent` 的用途是简化所有集群上的预留内存管理。这是因为它让您可以对各参数组系列 (例如 `redis2.8`) 使用单个参数组来管理集群的预留内存，而不管节点类型如何。`reserved-memory-percent` 的默认值是 25 (25%)。

参数 `reserved-memory-percent` 特定于 ElastiCache，而且 Redis OSS 正式发行版中不包含此参数。

如果您的集群使用 r6gd 系列的节点类型，且内存利用率达到 75%，则会自动触发数据分层。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

**使用 reserved-memory-percent 预留内存**  
如果要使用 `reserved-memory-percent` 管理 ElastiCache for Redis OSS 集群上的内存，请执行以下操作之一：
+ 如果您运行的是 Redis OSS 2.8.22 或更高版本，请向集群分配默认参数组。默认值 25% 应已足够。否则，请执行以下所述步骤更改该值。
+ 如果您运行的是 Redis OSS 2.8.22 以前的版本，则可能需要预留比 `reserved-memory-percent` 默认值的 25% 更高的内存。为此，请使用以下过程。

**更改 reserved-memory-percent 的百分比值**

1. 创建一个自定义参数组，指定与正在运行的引擎版本匹配的参数组系列，例如，指定 `redis2.8` 参数组系列。由于您无法修改默认参数组，所以需要自定义参数组。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

   ```
   aws elasticache create-cache-parameter-group \
      --cache-parameter-group-name redis28-50 \
      --description "Redis OSS 2.8.x 50% reserved" \
      --cache-parameter-group-family redis2.8
   ```

   由于 `reserved-memory-percent` 以节点 `maxmemory` 的百分比来预留内存，因此您无需为每个节点类型设置一个自定义参数组。

1. 修改自定义参数组，使得 `reserved-memory-percent` 为 50 (50%)。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

   ```
   aws elasticache modify-cache-parameter-group \
      --cache-parameter-group-name redis28-50 \
      --parameter-name-values "ParameterName=reserved-memory-percent, ParameterValue=50"
   ```

1. 为任何运行的 Redis OSS 版本早于 2.8.22 的 Redis OSS 集群或复制组使用此自定义参数组。

   以下 CLI 示例修改 Redis OSS 集群 `my-redis-cluster` 以立即开始使用自定义参数组 `redis28-50`。有关更多信息，请参阅 [修改 ElastiCache 集群](Clusters.Modify.md)。

   ```
   aws elasticache modify-cache-cluster \
      --cache-cluster-id my-redis-cluster \
      --cache-parameter-group-name redis28-50 \
      --apply-immediately
   ```

   以下 CLI 示例修改 Redis OSS 复制组 `my-redis-repl-grp` 以立即开始使用自定义参数组 `redis28-50`。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

   ```
   aws elasticache modify-replication-group \
      --replication-group-id my-redis-repl-grp \
      --cache-parameter-group-name redis28-50 \
      --apply-immediately
   ```

## 指定您的预留内存管理参数
<a name="redis-reserved-memory-management-change"></a>

如果您在 2017 年 3 月 16 日之前已开始使用 ElastiCache，则默认预留内存管理参数为 `reserved-memory`，且预留内存为零 (0) 字节。如果您在 2017 年 3 月 16 日之后才开始使用 ElastiCache，则默认预留内存管理参数为 `reserved-memory-percent`，且节点的预留内存为 25%。无论您何时创建 ElastiCache for Redis OSS 集群或复制组，参数和预留内存都是如此。但是，您可以使用 Amazon CLI 或 ElastiCache API 更改预留内存管理参数。

参数 `reserved-memory` 和 `reserved-memory-percent` 互斥。参数组始终有这两个参数之一，但不能同时有它们两者。您可以通过修改参数组，更改参数组用于管理预留内存的参数。由于您无法修改默认参数组，因此参数组必须是自定义参数组。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

**指定 reserved-memory-percent**  
要将 `reserved-memory-percent` 用作预留内存管理参数，请使用 `modify-cache-parameter-group` 命令修改自定义参数组。使用 `parameter-name-values` 参数指定 `reserved-memory-percent` 及其值。

以下 CLI 示例修改自定义参数组 `redis32-cluster-on`，以便使用 `reserved-memory-percent` 管理预留内存。必须为参数组的 `ParameterValue` 分配一个值，才能将 `ParameterName` 参数用于预留内存管理。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

```
aws elasticache modify-cache-parameter-group \
   --cache-parameter-group-name redis32-cluster-on \
   --parameter-name-values "ParameterName=reserved-memory-percent, ParameterValue=25"
```

**指定 reserved-memory**  
要将 `reserved-memory` 用作预留内存管理参数，请使用 `modify-cache-parameter-group` 命令修改自定义参数组。使用 `parameter-name-values` 参数指定 `reserved-memory` 及其值。

以下 CLI 示例修改自定义参数组 `redis32-m3xl`，以便使用 `reserved-memory` 管理预留内存。必须为参数组的 `ParameterValue` 分配一个值，才能将 `ParameterName` 参数用于预留内存管理。因为引擎版本比 2.8.22 新，所以我们将该值设置为 `3565158400`，它是 `cache.m3.xlarge` 的 `maxmemory` 的 25%。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

```
aws elasticache modify-cache-parameter-group \
   --cache-parameter-group-name redis32-m3xl \
   --parameter-name-values "ParameterName=reserved-memory, ParameterValue=3565158400"
```

# 使用 Valkey 和 Redis OSS 基于节点的集群时的最佳实践
<a name="BestPractices.SelfDesigned"></a>

在 Valkey 或 Redis OSS 中使用基于节点的集群时，应记住多可用区使用、足够内存、集群大小调整和停机时间最小化等有用的概念。建议您查看并遵循这些最佳实践。

**Topics**
+ [

# 利用多可用区最大限度减少停机时间
](multi-az.md)
+ [

# 确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存
](BestPractices.BGSAVE.md)
+ [

# 在线集群大小调整
](best-practices-online-resharding.md)
+ [

# 最大程度减少维护期间的停机时间
](BestPractices.MinimizeDowntime.md)

# 利用多可用区最大限度减少停机时间
<a name="multi-az"></a>

有许多情况下，ElastiCache（兼容 Valkey 或 Redis OSS）可能需要替换主节点；这些情况包括特定类型的计划维护以及主节点或可用区出现故障的意外事件。

在这些情形下进行替换时，会导致集群出现停机时间，但如果启用了多可用区，则会最大限度缩短停机时间。主节点的角色会自动将故障转移到其中一个只读副本。ElastiCache 会透明地处理这一点，因此无需创建和预置新的主节点。此故障转移和副本提升可确保您在提升完成后立即继续写入新的主节点。

请参阅[利用多可用区以及 Valkey 和 Redis OSS 最大限度减少 ElastiCache 中的停机时间](AutoFailover.md)，详细了解多可用区以及如何最大限度减少停机时间。

# 确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存
<a name="BestPractices.BGSAVE"></a>

**Valkey 7.2 及更高版本和 Redis OSS v2.8.22 及更高版本中的快照和同步功能**  
Valkey 默认支持快照和同步功能。Redis OSS 2.8.22 引入了无分支的保存过程，使您能够在同步和保存期间将更多内存分配给应用程序使用，而不会增加交换分区使用率。有关更多信息，请参阅 [如何实施同步和备份](Replication.Redis.Versions.md)。

**2.8.22 版本之前的版本中的 Redis OSS 快照和同步**

使用 ElastiCache for Redis OSS 时，Redis OSS 会在许多情况下调用后台写入命令：
+ 为备份创建快照时。
+ 将副本与复制组中的主副本同步时。
+ 为 Redis OSS 启用仅附加文件功能（AOF）时。
+ 将副本提升为主快照时（这会导致主集群/副本同步）。

每当 Redis OSS 执行后台写入进程时，您都必须有足够的可用内存来处理进程开销。内存不足会导致该进程失败。因此，重要的是在创建 Redis OSS 集群时应选择有足够内存的节点实例类型。

## Valkey 和 Redis OSS 的后台写入进程和内存使用情况
<a name="BestPractices.BGSAVE.Process"></a>

每当调用后台写入进程时，Valkey 和 Redis OSS 都会创建进程分叉（请记住，这些引擎是单线程的）。一个分叉将您的数据保存到磁盘上的 Redis OSS .rdb 快照文件中，另一个分叉为所有读取和写入操作提供服务。为了确保您的快照是时间点快照，所有数据更新和增加都写入与数据区域不同的可用内存区域。

只要您在数据保存到磁盘期间拥有足够的可用内存来记录所有写入操作，便不会遇到内存不足的问题。如果出现以下任何情况，您便可能会遇到内存不足的问题：
+ 您的应用程序执行很多写入操作，因此需要大量可用内存来接收新数据或更新的数据。
+ 可用于写入新数据或更新的数据的内存非常少。
+ 您的数据集很大，需要很长时间才能保存到磁盘，因而需要大量写入操作。

下图说明了执行后台写入进程时的内存使用情况。

![\[图像：后台写入过程中的内存使用情况图。\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-bgsaveMemoryUseage.png)


有关执行备份对性能的影响的信息，请参阅[备份基于节点的集群对性能的影响](backups.md#backups-performance)。

有关 Valkey 和 Redis OSS 如何执行快照的更多信息，请参阅 [http://valkey.io](http://valkey.io)。

有关区域和可用区的更多信息，请参阅[为 ElastiCache 选择区域和可用区](RegionsAndAZs.md)。

## 避免在执行后台写入时耗尽内存
<a name="BestPractices.BGSAVE.memoryFix"></a>

每当调用后台写入进程（例如 `BGSAVE` 或 `BGREWRITEAOF`）时，为防止该进程失败，您拥有的可用内存必须多于写入操作在该进程执行期间所消耗的内存量。最糟糕的情况是，在后台写入操作期间，每个记录都会更新，并且有一些新的记录增加到缓存。因此，对于 2.8.22 版之前的 Redis OSS，建议您将 `reserved-memory-percent` 设置为 50（50%）；对于 Valkey 和所有 2.8.22 及之后的 Redis OSS 版本，建议您将此参数设置为 25（25%）。

`maxmemory` 值指示可供您用于数据和操作开销的内存。因为您无法修改默认参数组中的 `reserved-memory` 参数，所以必须为集群创建自定义参数组。`reserved-memory` 的默认值是 0，这允许 Redis OSS 为数据消耗所有 *maxmemory*，因此可能不会为其他用途（例如后台写入进程）留下内存。有关各种节点实例类型的 `maxmemory` 值，请参阅 [特定于 Redis OSS 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.NodeSpecific)。

您还可以使用 `reserved-memory` 参数来减少在框架上使用的内存量。

有关 ElastiCache 中特定于 Valkey 和 Redis 的参数的更多信息，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。

有关创建和修改参数组的信息，请参阅[创建 ElastiCache 参数组](ParameterGroups.Creating.md)和[修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

# 在线集群大小调整
<a name="best-practices-online-resharding"></a>

*重新分片*涉及在集群中增加或删除分片或节点以及重新分配密钥空间。因此，多重因素会对重新分片的操作产生影响，如集群的负载、内存使用率和整体数据大小。对于最佳体验，我们建议您遵循整体集群最佳实践进行统一工作负载模式分配。此外，我们建议执行以下步骤。

在启动重新分片前，建议进行以下操作：
+ **测试应用程序** – 尽可能在过渡环境中在重新分片期间测试应用程序行为。
+ **获取扩展问题的提前通知** – 重新分片是一项需使用大量计算资源的操作。因此，我们建议在重新分片期间，多核心实例的情况下 CPU 保持 80% 以下的利用率，单核心实例的情况下 CPU 保持 50% 以下的利用率。在应用程序开始监测扩缩问题前监控 ElastiCache for Redis OSS 指标并启动重新分片。跟踪的有用指标为 `CPUUtilization`、`NetworkBytesIn`、`NetworkBytesOut`、`CurrConnections`、`NewConnections`、`FreeableMemory`、`SwapUsage` 和 `BytesUsedForCacheItems`。
+ **横向缩减前请确保有足够的空余内存可用** – 如果要进行横向缩减，请确保要保留的分片上的可用空余内存至少是您计划删除的分片上已用内存的 1.5 倍。
+ **在非高峰时间启动重新分片** – 此做法有助于减少重新分片操作期间对客户端的延迟和吞吐量的影响。同样有助于更快完成重新分片，因为有更多资源可用于槽重新分配。
+ **审核客户端超时行为** – 部分客户端可能会在联机集群调整大小期间出现更高的延迟。为客户端库配置更高的超时会有所帮助，即便服务器处于更高的负载条件下，系统也有时间进行连接。在某些情况下，您可能会打开与服务器的大量连接。在这些情况下，请考虑增加指数回退以便重新连接逻辑。这样做可防止突增的新连接同时连接服务器。
+ **在每个分片上加载函数** - 横向扩展集群时，ElastiCache 会自动将其中一个现有节点（随机选择）中加载的函数复制到新节点。如果您的集群有 Valkey 7.2 和更高版本或者 Redis OSS 7.0 或更高版本，并且您的应用程序使用 [Functions](https://valkey.io/topics/functions-intro/)，我们建议您在横向扩展之前将所有函数加载到所有分片，这样您的集群就不会在不同的分片上有不同的函数。

重新分片完成后，请注意以下事项：
+ 如果目标分片上的内存不足，缩减可能会部分完成。如果发生此结果，必要时请查看可用内存并重新进行操作。目标分片上的数据不会被删除。
+ 在重新分片操作期间，Lua 脚本中不支持 `FLUSHALL` 和 `FLUSHDB` 命令。在 Redis OSS 6 之前，不支持在要迁移的槽上运行 `BRPOPLPUSH` 命令。

# 最大程度减少维护期间的停机时间
<a name="BestPractices.MinimizeDowntime"></a>

集群模式配置在托管或非托管操作期间具有最高可用性。我们建议您使用支持集群模式的客户端，此客户端会连接到集群发现终端节点。对于禁用的集群模式，我们建议您将主终端节点用于所有写入操作。

对于读取活动，应用程序还可以连接到集群中的任何节点。与主端点不同，节点端点会解析为特定端点。如果您在您的集群中进行更改（例如添加或删除副本），则必须在您的应用程序中更新节点端点。这就是我们建议您在已禁用集群模式的情况下使用读取器端点进行读取活动的原因。

如果在集群中启用了自动失效转移，则主节点可能发生变化。因此，应用程序应确认节点的角色并更新所有读取终端节点。这样做有助于确保您不会在主节点上引发重大负载。禁用自动失效转移后，节点的角色不会发生变化。但是，与启用自动失效转移的集群相比，托管式或非托管式操作的停机时间更长。

 避免将读取请求定向到单个只读副本节点，因为它的不可用性可能会导致读取中断。要么回退以从主节点读取，要么确保至少有两个只读副本，以避免在维护期间出现任何读取中断。

# Memcached 缓存策略
<a name="Strategies"></a>

在以下主题中，您可以找到填充和维护 Memcached 缓存的策略。

为填充并维护缓存而执行的策略取决于要缓存的数据以及针对这些数据的访问模式。例如，您可能不想对游戏站点上排名前 10 排行榜和趋势新闻报道执行相同的策略。在本节的剩余内容中，我们将讨论常见缓存维护策略及其优点和缺点。

**Topics**
+ [

## 只读副本
](#Strategies.ReadReplicas)
+ [

## 延迟加载
](#Strategies.LazyLoading)
+ [

## 直写
](#Strategies.WriteThrough)
+ [

## 添加 TTL
](#Strategies.WithTTL)
+ [

## 相关主题
](#Strategies.SeeAlso)

## 只读副本
<a name="Strategies.ReadReplicas"></a>

通常，您可以通过创建副本并从中读取副本而不是主缓存节点，来显著提高 ElastiCache 无服务器缓存的性能。有关更多信息，请参阅 [使用只读副本的最佳实践](ReadReplicas.md)。

## 延迟加载
<a name="Strategies.LazyLoading"></a>

顾名思义，*延迟加载*是一种仅在需要时将数据加载到缓存中的缓存策略。它的工作原理如下。

Amazon ElastiCache 是一种内存键值存储，位于您的应用程序和其访问的数据存储（数据库）之间。当应用程序请求数据时，它会先向 ElastiCache 缓存发出请求。如果数据在缓存中且最新，则 ElastiCache 会将数据返回到应用程序。如果数据不在缓存中或已过期，则应用程序会请求数据存储中的数据。然后，数据存储将数据返回到应用程序。之后，应用程序会将从存储接收的数据写入缓存。这样就可以在下次请求时更快地检索这些数据。

当数据位于缓存中且未过期时，就会发生*缓存命中*：

1. 应用程序请求缓存中的数据。

1. 缓存将数据返回给应用程序。

当数据不在缓存中或已过期时，就会发生*缓存未命中*：

1. 应用程序请求缓存中的数据。

1. 缓存不具有所请求的数据，因此返回了 `null`。

1. 应用程序请求数据库中的数据并收到数据。

1. 应用程序使用新数据更新缓存。

### 延迟加载的优点和缺点
<a name="Strategies.LazyLoading.Evaluation"></a>

延迟加载的优点如下：
+ 仅对请求的数据进行缓存。

  由于大部分数据从未被请求过，因此延迟加载避免了向缓存中填入未请求的数据。
+ 节点故障对应用程序来说并不致命。

  当某个节点发生故障并由新的空节点替换时，应用程序会继续运行，但延迟会增加。向新节点发出请求时，每次缓存未命中都会导致在数据库中进行查询。同时会将数据副本添加到缓存中，以便后续请求从缓存中进行检索。

延迟加载的缺点如下：
+ 缓存未命中会导致性能损失。每次缓存未命中都会导致 3 次往返：

  1. 初次从缓存中请求数据

  1. 查询数据库中的数据

  1. 将数据写入缓存

   这些未命中会导致在数据到达应用程序时出现显著延迟。
+ 过时数据。

  如果仅在缓存未命中时将数据写入缓存，则缓存中的数据会过时。出现此结果的原因在于，在数据库中更改数据时未更新缓存。要解决此问题，您可以使用 [直写](#Strategies.WriteThrough) 和 [添加 TTL](#Strategies.WithTTL) 策略。

### 延迟加载伪代码示例
<a name="Strategies.LazyLoading.CodeExample"></a>

以下代码是延迟加载逻辑的伪代码示例。

```
// *****************************************
// function that returns a customer's record.
// Attempts to retrieve the record from the cache.
// If it is retrieved, the record is returned to the application.
// If the record is not retrieved from the cache, it is
//    retrieved from the database, 
//    added to the cache, and 
//    returned to the application
// *****************************************
get_customer(customer_id)

    customer_record = cache.get(customer_id)
    if (customer_record == null)
    
        customer_record = db.query("SELECT * FROM Customers WHERE id = {0}", customer_id)
        cache.set(customer_id, customer_record)
    
    return customer_record
```

对于此示例，获取数据的应用程序代码如下。

```
customer_record = get_customer(12345)
```

## 直写
<a name="Strategies.WriteThrough"></a>

直写策略会在将数据写入数据库时在缓存中添加或更新数据。

### 直写的优点和缺点
<a name="Strategies.WriteThrough.Evaluation"></a>

直写的优点如下：
+ 缓存中的数据永不过时。

  由于每次将缓存中的数据写入数据库时都会更新这些数据，因此缓存中的数据始终为最新数据。
+ 直写性能损失与读取性能损失比较。

  每次写入都涉及两次往返：

  1. 对缓存进行写入

  1. 对数据库进行写入

   这将增加流程的延迟。即便如此，与检索数据时的延迟相比，最终用户通常更能容忍更新数据时的延迟。有一个内在的意义，即更新的工作量更大，因而花费的时间会更长。

直写的缺点如下：
+ 缺失的数据。

  如果启动新节点（无论是由于节点故障还是横向扩展），都会出现数据缺失。此数据将持续保持丢失状态直到将其添加或更新到数据库。您可以通过实现[延迟加载](#Strategies.LazyLoading)和使用直写来最大限度减少此情况。
+ 缓存扰动。

  大多数数据从不会被读取，这是一种资源浪费。通过[添加存活时间 (TTL) 值](#Strategies.WithTTL)，可以最大程度地减少空间浪费。

### 直写伪代码示例
<a name="Strategies.WriteThrough.CodeExample"></a>

以下代码是直写逻辑的伪代码示例。

```
// *****************************************
// function that saves a customer's record.
// *****************************************
save_customer(customer_id, values)

    customer_record = db.query("UPDATE Customers WHERE id = {0}", customer_id, values)
    cache.set(customer_id, customer_record)
    return success
```

对于此示例，获取数据的应用程序代码如下。

```
save_customer(12345,{"address":"123 Main"})
```

## 添加 TTL
<a name="Strategies.WithTTL"></a>

延迟加载允许过时数据，但不会失败并产生空节点。直写可确保数据始终为最新数据，但直写可能会失败并产生空节点，还可能向缓存填充过多数据。您可对每次写入添加存活时间 (TTL) 值，充分利用每种策略的优势。同时，您可以并在很大程度上避免多余数据混淆缓存。

*存活时间（TTL）*是一个整数值，此值指定密钥过期之前的秒数。Valkey 或 Redis OSS 可以指定此值的秒数或毫秒数。Memcached 指定此值（以秒为单位）。当应用程序尝试读取过期密钥时，其处理方式是当做未找到该密钥。应用程序会在数据库中查询该密钥并更新缓存。这种方法不能保证值不会过时。不过，其可以防止数据过时太久，并要求不时从数据库中刷新缓存中的值。

有关更多信息，请参阅 [Valkey 和 Redis OSS 命令](https://valkey.io/commands)或 [Memcached `set` 命令](https://www.tutorialspoint.com/memcached/memcached_set_data.htm)。

### TTTL 伪代码示例
<a name="Strategies.WithTTL.CodeExample"></a>

以下代码为具有 TTL 的直写逻辑伪代码示例。

```
// *****************************************
// function that saves a customer's record.
// The TTL value of 300 means that the record expires
//    300 seconds (5 minutes) after the set command 
//    and future reads will have to query the database.
// *****************************************
save_customer(customer_id, values)

    customer_record = db.query("UPDATE Customers WHERE id = {0}", customer_id, values)
    cache.set(customer_id, customer_record, 300)

    return success
```

以下代码为具有 TTL 的延迟加载逻辑伪代码示例。

```
// *****************************************
// function that returns a customer's record.
// Attempts to retrieve the record from the cache.
// If it is retrieved, the record is returned to the application.
// If the record is not retrieved from the cache, it is 
//    retrieved from the database, 
//    added to the cache, and 
//    returned to the application.
// The TTL value of 300 means that the record expires
//    300 seconds (5 minutes) after the set command 
//    and subsequent reads will have to query the database.
// *****************************************
get_customer(customer_id)

    customer_record = cache.get(customer_id)
    
    if (customer_record != null)
        if (customer_record.TTL < 300)
            return customer_record        // return the record and exit function
            
    // do this only if the record did not exist in the cache OR
    //    the TTL was >= 300, i.e., the record in the cache had expired.
    customer_record = db.query("SELECT * FROM Customers WHERE id = {0}", customer_id)
    cache.set(customer_id, customer_record, 300)  // update the cache
    return customer_record                // return the newly retrieved record and exit function
```

对于此示例，获取数据的应用程序代码如下。

```
save_customer(12345,{"address":"123 Main"})
```

```
customer_record = get_customer(12345)
```

## 相关主题
<a name="Strategies.SeeAlso"></a>
+ [内存中的数据存储](elasticache-use-cases.md#elasticache-use-cases-data-store)
+ [选择引擎和版本](SelectEngine.md)
+ [缩放 ElastiCache](Scaling.md)

# 在中管理基于节点的集群 ElastiCache
<a name="manage-self-designed-cluster"></a>

ElastiCache 提供了两个部署选项，即无服务器缓存和基于节点的集群。每个选项都有各自的功能和要求。

此部分中的主题可帮助您管理基于节点的集群。

**注意**  
这些主题不适用于 ElastiCache 无服务器。

**Topics**
+ [

# 自动扩缩 Valkey 和 Redis OSS 集群
](AutoScaling.md)
+ [

# 修改集群模式
](modify-cluster-mode.md)
+ [

# 使用全球数据存储跨Amazon区域复制
](Redis-Global-Datastore.md)
+ [

# 使用复制组时的高可用性
](Replication.md)
+ [

# 管理 ElastiCache 集群维护
](maintenance-window.md)
+ [

# 使用 ElastiCache 参数组配置引擎参数
](ParameterGroups.md)

# 自动扩缩 Valkey 和 Redis OSS 集群
<a name="AutoScaling"></a>

## 先决条件
<a name="AutoScaling-Prerequisites"></a>

ElastiCache Auto Scaling 仅限于以下内容：
+ 运行 Valkey 7.2 和更高版本或运行 Redis OSS 6.0 和更高版本的 Valkey 或 Redis OSS（已启用集群模式）集群
+ 运行 Valkey 7.2 和更高版本或运行 Redis OSS 7.0.7 和更高版本的数据分层（已启用集群模式）集群 
+ 实例大小-大、 XLarge、2 XLarge
+ 实例类型系列 - R7g、R6g、R6gd、R5、M7g、M6g、M5、C7gn
+ 在全球数据存储、Out ElastiCache posts 或 Local Zones 中运行的集群不支持 Auto Scaling。

## 使用 Valkey 或 Redis OSS 的 ElastiCache Auto Scaling 自动管理容量
<a name="AutoScaling-Managing"></a>

ElastiCache 使用 Valkey 或 Redis OSS 进行自动缩放是指能够自动增加或减少服务中所需的分片或副本。 ElastiCache ElastiCache 利用 Application Auto Scaling 服务来提供此功能。有关更多信息，请参阅 [Application Auto Scaling](https://docs.amazonaws.cn/autoscaling/application/userguide/what-is-application-auto-scaling.html)。要使用自动扩展，您需要定义并应用使用您分配的 CloudWatch 指标和目标值的扩展策略。 ElastiCache auto scaling 使用该策略来增加或减少实例数量以响应实际工作负载。

您可以使用Amazon Web Services 管理控制台来应用基于预定义指标的扩展策略。枚举中对 `predefined metric` 进行了定义，因此您可在代码中按名称指定或在Amazon Web Services 管理控制台中使用它。自定义指标不可用于使用Amazon Web Services 管理控制台的选择。或者，您可以使用Amazon CLI或 Application Auto Scaling API 来应用基于预定义或自定义指标的扩展策略。

ElastiCache 适用于 Valkey 和 Redis 的 OSS 支持缩放以下维度：
+ **分片** – 自动添加/删除集群中的分片，类似于手动在线重新分片。在这种情况下， ElastiCacheauto scaling 会代表您触发缩放。
+ **副本** — 自动在add/remove replicas in the cluster similar to manual Increase/Decrease replica operations. ElastiCache auto scaling for Valkey and Redis OSS adds/removes集群中的所有分片上均匀地进行复制。

ElastiCache 适用于 Valkey 和 Redis 的 OSS 支持以下类型的自动扩展策略：
+ [目标跟踪扩缩策略](AutoScaling-Scaling-Policies-Target.md)— 根据特定指标 shards/replicas 的目标值增加或减少服务运行的次数。这与恒温器保持家里温度的方式类似。您选择一个温度，恒温器将完成所有其他工作。
+ [为您的应用程序计划扩展。](https://docs.amazonaws.cn/autoscaling/application/userguide/application-auto-scaling-scheduled-scaling.html) — ElastiCache 对于 Valkey 和 Redis，OSS auto scaling 可以根据日期和时间增加或减少服务运行的次数。 shards/replicas 

![\[Valkey 和 Redis ElastiCache OSS 的自动缩放图片\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/Auto-scaling.png)


以下步骤总结了 ElastiCache Valkey 和 Redis OSS 的自动缩放流程，如上图所示：

1. 您可以为复制组创建 ElastiCache auto Scaling 策略。

1. ElastiCache auto scaling 会代表你创建一对 CloudWatch 警报。每对告警代表指标的上限和下限。当集群的实际利用率持续偏离您的目标利用率时，就会触发这些 CloudWatch 警报。您现在可以在控制台中查看告警。

1. 如果配置的指标值在特定时间段内超过您的目标利用率（或低于目标），则 CloudWatch 会触发警报，调用 auto scaling 来评估您的扩展策略。

1. ElastiCache auto scaling 会发出修改请求以调整您的集群容量。

1. ElastiCache 处理修改请求，动态增加（或减少）集群 Shards/Replicas 容量，使其接近您的目标利用率。

 要理解 ElastiCache Auto Scaling 的工作原理，假设你有一个名为的集群`UsersCluster`。通过监控的 CloudWatch 指标`UsersCluster`，您可以确定流量达到峰值时集群所需的最大分片数以及流量处于最低点时所需的最小分片。您还可以决定`UsersCluster`群集 CPU 利用率的目标值。 ElastiCache auto scaling 使用其目标跟踪算法来确保根据需要调整的`UsersCluster`预配置分片，以便利用率保持在或接近目标值。

**注意**  
扩展可能需要很长时间，并且需要额外的群集资源才能使分片重新平衡。 ElastiCache 只有当实际工作负载持续升高（或降低）几分钟时，Auto Scaling 才会修改资源设置。自动扩缩目标跟踪算法旨在使目标使用率长期达到或接近选定值。

# 弹性伸缩策略
<a name="AutoScaling-Policies"></a>

扩展策略包含以下组件：
+ 目标指标 – ElastiCache for Valkey and Redis OSS 自动扩缩使用的 CloudWatch 指标，用于确定何时扩缩以及扩缩多少。
+ 最小和最大容量 – 可扩展的最小和最大分区或副本数。
**重要**  
创建弹性伸缩策略时，如果当前容量高于配置的最大容量，我们会在策略创建过程中横向缩减为最大容量。同样，如果当前容量低于配置的最小容量，我们将横向扩展到最小容量。
+ 冷却时间 – 在完成一个横向缩减或横向扩展活动后开始另一个横向扩展活动之前等待的时间（秒）。
+ 服务相关角色 – 与特定 Amazon 服务关联的 Amazon Identity and Access Management (IAM) 角色。服务相关角色包含服务代表您调用其他 Amazon 服务所需的一切权限。ElastiCache 自动扩缩会自动为您生成此角色，即 `AWSServiceRoleForApplicationAutoScaling_ElastiCacheRG`。
+ 启用或禁用横向缩减活动 – 能够为策略启用或禁用横向缩减活动。

**Topics**
+ [

## 弹性伸缩目标指标
](#AutoScaling-TargetMetric)
+ [

## 最小和最大容量
](#AutoScaling-MinMax)
+ [

## 冷却时间
](#AutoScaling-Cooldown)
+ [

## 启用或禁用缩减活动
](#AutoScaling-enable-disable-scale-in)

## 弹性伸缩目标指标
<a name="AutoScaling-TargetMetric"></a>

在这种类型的策略中，预定义或自定义指标以及指标目标值是在目标跟踪扩展策略配置中指定的。ElastiCache for Valkey and Redis OSS 自动扩缩可创建和管理触发扩缩策略的 CloudWatch 警报，并根据指标和目标值计算扩缩调整。扩展策略根据需要添加或删除分区/副本，以便将指标保持在指定的目标值或该值附近。除了将指标保持在目标值附近以外，目标跟踪扩展策略还会根据由于工作负载变化而造成的指标波动进行调整。这种策略还会最大限度减少集群的可用分区/副本数的快速波动。

例如，考虑使用具有预定义的平均 `ElastiCachePrimaryEngineCPUUtilization` 指标的扩展策略。这种策略可以将 CPU 使用率保持在指定的使用率百分比（如 70%）或该值附近。

**注意**  
对于每个集群，您只能针对每个目标指标创建一个弹性伸缩策略。

## 最小和最大容量
<a name="AutoScaling-MinMax"></a>

**分片**

您可以指定 ElastiCache for Valkey and Redis OSS 自动扩缩可以扩缩的最大分片数量。此值必须小于或等于 250 且最小为 1。您还可以指定由自动扩缩管理的最小分片数。此值必须至少为 1，且等于或小于为最大分区数 (250) 指定的值。

**副本**

您还可以指定由 ElastiCache for Valkey and Redis OSS 自动扩缩管理的最大副本数。此值必须小于或等于 5。您还可以指定由自动扩缩管理的副本的最小数量。此值必须至少为 1，且等于或小于为最大副本数 (5) 指定的值。

要确定典型流量所需的最小和最大分区/副本数，请使用模型的预期通信速率测试弹性伸缩配置。

**注意**  
ElastiCache 自动扩缩策略会增加集群容量，直到其达到您定义的最大大小或直到服务限额适用为止。若要请求提高限制，请参阅 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 并选择限制类型 **Nodes per cluster per instance type（每个实例类型的每个集群的节点数）**。

**重要**  
在无流量时横向缩减。如果变体的流量变为零，ElastiCache 会自动横向缩减到指定的最小实例数。

## 冷却时间
<a name="AutoScaling-Cooldown"></a>

您可以添加影响集群扩展的冷却时间，以优化目标跟踪扩缩策略的响应速度。冷却时间阻止后续扩展或缩减请求，直至冷却时间到期。这会减慢横向缩减请求在 ElastiCache for Valkey and Redis OSS 集群中删除分片/副本的速度，以及横向扩展请求创建分片/副本的速度。您可以指定以下冷却时间：
+ 横向缩减活动会减少集群中的分片/副本数量。缩减冷却时间指定在完成一个缩减活动后开始另一个缩减活动之前等待的时间 (秒)。
+ 横向扩展活动会增加集群中分片/副本的数量。扩展冷却时间指定在完成一个扩展活动后开始另一个扩展活动之前等待的时间 (秒)。

如果未指定横向缩减或横向扩展冷却时间，则默认横向扩展冷却时间为 600 秒，默认横向缩减冷却时间为 900 秒。

## 启用或禁用缩减活动
<a name="AutoScaling-enable-disable-scale-in"></a>

您可以为策略启用或禁用缩减活动。启用横向缩减活动允许扩展策略删除分区/副本。在启用缩减活动时，扩展策略中的缩减冷却时间将应用于缩减活动。禁用横向缩减活动将禁止扩展策略删除分区/副本。

**注意**  
横向扩展活动始终处于启用状态，以便扩缩策略可以根据需要创建 ElastiCache 分片/副本。

## 自动扩缩需要的 IAM 权限
<a name="AutoScaling-IAM-permissions"></a>

ElastiCache 对于 Valkey 和 Redis，OSS Auto Scaling 是通过 ElastiCache、 CloudWatch和 Application Auto Scaling 的组合实现的。 APIs使用创建和更新集群 ElastiCache，使用创建警报 CloudWatch，使用Application Auto Scaling创建扩展策略。除了用于创建和更新集群的标准 IAM 权限外，访问 A ElastiCache uto Scaling 设置的 IAM 用户还必须拥有支持动态扩展的服务的相应权限。在这个最新的策略中，我们通过 `elasticache:ModifyCacheCluster` 操作增加了对 Memcached 垂直扩缩的支持。IAM 用户必须具有使用以下示例策略中的操作的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "application-autoscaling:*",
                "elasticache:DescribeReplicationGroups",
                "elasticache:ModifyReplicationGroupShardConfiguration",
                "elasticache:IncreaseReplicaCount",
                "elasticache:DecreaseReplicaCount",
                "elasticache:DescribeCacheClusters",
                "elasticache:DescribeCacheParameters",
                "cloudwatch:DeleteAlarms",
                "cloudwatch:DescribeAlarmHistory",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:DescribeAlarmsForMetric",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics",
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:DisableAlarmActions",
                "cloudwatch:EnableAlarmActions",
                "iam:CreateServiceLinkedRole",
                "sns:CreateTopic",
                "sns:Subscribe",
                "sns:Get*",
                "sns:List*"
            ],
            "Resource": "arn:aws:iam::123456789012:role/autoscaling-roles-for-cluster"
        }
    ]
}
```

------

## 服务相关角色
<a name="AutoScaling-SLR"></a>

 ElastiCache 适用于 Valkey 和 Redis 的 OSS 自动扩展服务还需要描述您的集群和 CloudWatch 警报的权限，以及代表您修改 ElastiCache 目标容量的权限。如果您为集群启用自动扩缩服务，系统就会创建一个名为 `AWSServiceRoleForApplicationAutoScaling_ElastiCacheRG` 的服务相关角色。此服务相关角色授予 ElastiCache auto Scaling 权限，用于描述策略的警报、监控队列的当前容量以及修改队列的容量。服务相关角色是 a ElastiCache uto Scaling 的默认角色。有关更多信息，请参阅《[Application Auto Scaling 用户指南》中的 Redis OSS 自动扩展的服务关联角色](https://docs.amazonaws.cn/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html)。 ElastiCache 

## Auto Scaling 最佳实践
<a name="AutoScaling-best-practices"></a>

在注册 Auto Scaling 功能之前，我们建议执行以下操作：

1. **仅使用一个跟踪指标** – 确定您的集群是具有 CPU 密集型工作负载还是数据密集型工作负载，并使用相应的预定义指标来定义扩展策略。
   + 引擎 CPU：`ElastiCachePrimaryEngineCPUUtilization`（分片维度）或 `ElastiCacheReplicaEngineCPUUtilization`（副本维度）
   + 数据库使用情况：`ElastiCacheDatabaseCapacityUsageCountedForEvictPercentage` 此扩展策略在集群上将 maxmemory-policy 设置为 noeviction 时效果最佳。

   我们建议您避免在集群上使用每个维度使用多个策略。 ElastiCache 对于 Valkey 和 Redis，如果任何目标跟踪策略已准备好进行横向扩展，则自动缩放将扩展可扩展的目标，但只有在所有目标跟踪策略（启用缩小部分的情况下）都准备好进行缩减时，才会缩小规模。如果多个策略指示可扩展目标同时横向扩展或缩减，ElastiCache for Redis 会根据为横向缩减和横向扩展提供最大容量的策略进行扩展。

1. **目标跟踪的自定义指标** – 在对目标跟踪使用自定义指标时要谨慎，因为自动扩缩最适合与为策略所选的指标变化成比例的横向扩展/缩减。如果这些指标未随用于策略创建的扩缩操作成比例变化，则可能会导致持续的横向扩展或横向缩减操作，从而可能会影响可用性或成本。

    对于数据分层集群（r6gd 系列实例类型），请避免使用基于内存的指标进行扩缩。

1. **计划扩展** — 如果您确定自己的工作负载是确定性的（ high/low 在特定时间到达），我们建议您使用计划扩展，并根据需要配置目标容量。目标跟踪最适合以通过在您需要更多资源时横向扩展，并在需要较少资源时横向缩减的方式按所需目标指标运行的非确定性工作负载和集群。

1. **禁用 Scale-In** — Target Tracking 上的自动缩放最适合工作负载逐渐增加 increase/decrease 的集群，因为指标 spikes/dip 中可能会触发连续的向外扩展/向内波动。为了避免这种振荡，您可以先禁用横向缩减，之后可以随时根据需要手动横向缩减。

1. **测试您的应用程序**-我们建议您使用估计 Min/Max 的工作负载测试应用程序，以确定集群 shards/replicas 所需的绝对最小值和最大值，同时创建扩展策略以避免可用性问题。Auto Scaling 可以横向扩展至为目标配置的最大阈值，也可以横向缩减至配置的最小阈值。

1. **定义目标值**-您可以分析四周内集群利用率的相应 CloudWatch 指标，以确定目标值阈值。如果您仍然不确定要选择哪个值，我们建议您从支持的最小预定义指标值开始。

1. AutoScaling on Target Tracking 最适合在各个 shards/replicas 维度上均匀分布工作负载的集群。分布不均可能导致：
   + 由于一些热分片/副本的工作 spike/dip 负载，不需要时进行扩展。
   + 因整体平均值接近目标（即使具有热分片/副本）而在需要扩展时不执行扩展。

**注意**  
扩展集群时， ElastiCache 会自动将其中一个现有节点（随机选择）中加载的函数复制到新节点。如果您的集群有 Valkey 或 Redis OSS 7.0 或更高版本，并且您的应用程序使用 [Functions](https://valkey.io/topics/functions-intro/)，我们建议您在横向扩展之前将所有函数加载到所有分片，这样您的集群就不会在不同的分片上有不同的函数。

注册后 AutoScaling，请注意以下几点：
+ Auto Scaling 支持的配置存在限制，因此我们建议不要更改已注册 Auto Scaling 的复制组的配置。示例如下：
  + 手动将实例类型修改为不支持的类型。
  + 将复制组与全局数据存储关联。
  + 更改 `ReservedMemoryPercent` 参数。
  + 在策略创建期间手动配置 increasing/decreasing shards/replicas beyond the Min/Max容量。

# 对分区使用弹性伸缩
<a name="AutoScaling-Using-Shards"></a>

利用 ElastiCache 的自动扩缩，您可以在 Valkey 或 Redis OSS 引擎中使用跟踪策略和计划策略。

下面提供了有关目标跟踪和计划策略以及如何使用 Amazon Web Services 管理控制台 Amazon CLI 和 API 应用它们的详细信息。

**Topics**
+ [

# 目标跟踪扩缩策略
](AutoScaling-Scaling-Policies-Target.md)
+ [

# 添加扩展策略
](AutoScaling-Scaling-Adding-Policy-Shards.md)
+ [

# 注册可扩展目标
](AutoScaling-Scaling-Registering-Policy-CLI.md)
+ [

# 定义扩缩策略
](AutoScaling-Scaling-Defining-Policy-API.md)
+ [

# 禁用横向缩减活动
](AutoScaling-Scaling-Disabling-Scale-in.md)
+ [

# 应用扩缩策略
](AutoScaling-Scaling-Applying-a-Scaling-Policy.md)
+ [

# 编辑扩展策略
](AutoScaling-Scaling-Editing-a-Scaling-Policy.md)
+ [

# 删除扩展策略
](AutoScaling-Scaling-Deleting-a-Scaling-Policy.md)
+ [

# 将 Amazon CloudFormation 用于 Auto Scaling 策略
](AutoScaling-with-Cloudformation-Shards.md)
+ [

# 计划扩展
](AutoScaling-with-Scheduled-Scaling-Shards.md)

# 目标跟踪扩缩策略
<a name="AutoScaling-Scaling-Policies-Target"></a>

在使用目标跟踪扩展策略时，您可以选择一个指标并设置一个目标值。ElastiCache for Valkey and Redis OSS 自动扩缩可创建和管理触发扩缩策略的 CloudWatch 警报，并根据指标和目标值计算扩缩调整。扩展策略根据需要添加或删除分区，以便将指标保持在指定的目标值或接近该值。除了将指标保持在目标值附近以外，目标跟踪扩展策略还会根据由于负载模式波动而造成的指标波动进行调节，并最大限度减少队列容量发生快速波动的情况。

例如，考虑使用具有已配置了目标值的预定义平均 `ElastiCachePrimaryEngineCPUUtilization` 指标的扩展策略。这种策略可以将 CPU 使用率保持在指定的目标值或接近该值。

## 预定义指标
<a name="AutoScaling-Scaling-Criteria-predfined-metrics"></a>

预定义指标是一种结构，用于指示给定 CloudWatch 指标的特定名称、维度和统计数据（`average`）。自动扩缩策略为您的集群定义下面的预定义指标之一：


****  

| 预定义指标名称 | CloudWatch 指标名称 | CloudWatch 指标维度 | 不符合条件的实例类型  | 
| --- | --- | --- | --- | 
| ElastiCachePrimaryEngineCPUUtilization |  `EngineCPUUtilization`  |  ReplicationGroupId，角色 = 主要  | 无 | 
| ElastiCacheDatabaseCapacityUsageCountedForEvictPercentage |  `DatabaseCapacityUsageCountedForEvictPercentage`  |  Valkey 或 Redis OSS 复制组指标  | 无 | 
| ElastiCacheDatabaseMemoryUsageCountedForEvictPercentage |  `DatabaseMemoryUsageCountedForEvictPercentage`  |  Valkey 或 Redis OSS 复制组指标  | R6gd | 

数据分层实例类型不能使用 `ElastiCacheDatabaseMemoryUsageCountedForEvictPercentage`，因为这些实例类型将数据同时存储在内存和 SSD 中。数据分层实例的预期使用案例是 100% 的内存使用率，并根据需要填满 SSD。

## 分区的弹性伸缩条件
<a name="AutoScaling-Scaling-Criteria"></a>

当服务检测到您的预定义指标等于或大于目标设置时，它会自动提高分片容量。ElastiCache for Valkey and Redis OSS 会按以下两个数字中的较大者来横向扩展集群分片：与目标之间差异的百分比和当前分片数的 20%。对于横向缩减，ElastiCache 不会自动横向缩减，除非整体指标值低于所定义的目标的 75%。

关于横向扩展示例，如果您的分区数为 50，以及
+ 在目标超出了 30% 的情况下，ElastiCache 将横向扩展 30%，最后的结果是每个集群 65 个分片。
+ 在目标超出了 10% 的情况下，ElastiCache 默认横向扩展最低 20%，最后的结果是每个集群 60 个分片。

对横向缩减示例，如果您选择的目标值是 60%，则 ElastiCache 会直到该指标小于或等于 45%（比目标 60% 低 25%）时才会自动横向缩减。

## 弹性伸缩注意事项
<a name="AutoScaling-Scaling-Considerations"></a>

请注意以下事项：
+ 目标跟踪扩展策略假设它应该在指定指标高于目标值时执行向外扩展。因此，不能使用目标跟踪扩展策略在指定指标低于目标值时向外扩展。ElastiCache for Valkey and Redis OSS 会在与集群现有分片目标数之间存在最小 20% 的偏差时横向扩展分片。
+ 当指定指标数据不足时，目标跟踪扩展策略不会执行扩展。它不会执行横向缩减，因为它不会将数据不足解读为使用率低。
+ 您可能会看到目标值与实际指标数据点之间存在差距。这是因为 ElastiCache 自动扩缩在确定要添加或移除多少容量时将始终通过向上或向下舍入保守地进行操作，以免添加的容量不足或删除的容量过多。
+ 为了确保应用程序可用性，服务会针对指标尽快按比例横向扩展，但横向缩减过程相对缓慢。
+ 您可以为 ElastiCache for Valkey and Redis OSS 集群提供多个目标跟踪扩缩策略，前提是每个策略使用不同的指标。ElastiCache 自动扩缩的目的是始终优先考虑可用性，因此其行为会有所不同，具体取决于目标跟踪策略是否已准备好横向扩展或横向缩减。如果任何目标跟踪策略已准备好进行扩展，它将扩展服务，但仅在所有目标跟踪策略（启用了缩减部分）准备好缩减时才执行缩减。
+ 请勿编辑或删除 ElastiCache 自动扩缩为目标跟踪扩缩策略管理的 CloudWatch 警报。在您删除扩缩策略时，ElastiCache 自动扩缩会自动删除警报。
+ ElastiCache 自动扩缩不会阻止您手动修改集群分片。这些手动调整不会影响附加到扩展策略的任何现有 CloudWatch 告警，但可能会影响可触发这些 CloudWatch 告警的指标。
+ 这些由弹性伸缩管理的 CloudWatch 告警是通过集群中所有分区的 AVG 指标来定义的。因此，拥有热分区可能会导致以下任一情况：
  + 因若干热分区上负载触发 CloudWatch 告警而导致在不需要扩展时执行扩展
  + 因所有分区的影响告警的聚合 AVG 指标不违例而在需要扩展时不执行扩展。
+ ElastiCache 对每个集群的节点的默认限制仍然适用。因此，当选择弹性伸缩时，如果您希望最大节点数超过默认限制，请在 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 请求提高限制，并选择限制类型 **Nodes per cluster per instance type**（每个实例类型的集群的节点数）。
+ 请确保您的 VPC 中有足够的 ENI（弹性网络接口）可用，横向扩展过程中需要弹性网络接口。有关更多信息，请参阅[弹性网络接口](https://docs.amazonaws.cn/vpc/latest/userguide/VPC_ElasticNetworkInterfaces.html)。
+ 如果 EC2 没有足够的可用容量，则 ElastiCache 自动扩缩将不会扩展，并将延迟到容量可用为止。
+ 在横向缩减期间，ElastiCache for Redis OSS 自动扩缩不会移除以下分片：插槽在序列化后的项目大小大于 256 MB。
+ 在横向缩减期间，如果生成的分区配置中可用的内存不足，则横向缩减不会删除分区。

# 添加扩展策略
<a name="AutoScaling-Scaling-Adding-Policy-Shards"></a>

您可以使用 Amazon Web Services 管理控制台 添加扩展策略。

**向 ElastiCache for Valkey and Redis OSS 集群添加自动扩缩策略**

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**。

1. 选择您要向其中添加策略的集群（选择集群名称，而不是其左侧的按钮）。

1. 选择 **Auto Scaling policies**（弹性伸缩策略）选项卡。

1. 选择 **add dynamic scaling**（添加动态扩展）。

1. 对于 **Policy name（策略名称）**，输入一个策略名称。

1. 对于 **Scalable Dimension（可扩展维度）**，选择 **shards（分区）**。

1. 对于目标指标，请选择以下选项之一：
   + **Primary CPU Utilization（主 CPU 使用率）**，用于根据平均 CPU 使用率创建策略。
   + **Memory（内存）**，用于根据平均数据库内存创建策略。
   + **容量**，用于根据平均数据库使用量创建策略。“容量”指标包括用于数据分层实例的内存和 SSD 利用率，以及用于所有其他实例类型的内存利用率。

1. 对于目标值，请选择大于或等于 35 且小于或等于 70 的值。自动扩缩将在各 ElastiCache 分片上为选定的目标指标保持该值：
   + **主 CPU 利用率**：在主节点上保持 `EngineCPUUtilization` 指标的目标值。
   + **内存**：保持 `DatabaseMemoryUsageCountedForEvictPercentage` 指标的目标值。
   + **容量**保持 `DatabaseCapacityUsageCountedForEvictPercentage` 指标的目标值。

   将添加或删除集群分区以使指标接近于指定的值。

1. （可选）控制台不支持横向缩减或横向扩展冷却时间。请使用 Amazon CLI 修改冷却时间值。

1. 对于**最小容量**，键入 ElastiCache 自动扩缩策略需要保持的最小分片数。

1. 对于**最大容量**，键入 ElastiCache 自动扩缩策略需要保持的最大分片数。此值必须小于或等于 250。

1. 选择**创建**。

# 注册可扩展目标
<a name="AutoScaling-Scaling-Registering-Policy-CLI"></a>

在 ElastiCache for Valkey and Redis OSS 集群上使用自动扩缩之前，您必须先为集群注册 ElastiCache 自动扩缩。这样做是为了定义应用于该集群的扩展维度和限制。ElastiCache 自动扩缩会连同 `elasticache:replication-group:NodeGroups` 可扩展维度一起动态扩缩集群，该维度表示每个集群分片的数量。

 **使用 Amazon CLI** 

要注册您的 ElastiCache for Valkey and Redis OSS 集群，请使用具有以下参数的 [register-scalable-target](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/register-scalable-target.html) 命令：
+ `--service-namespace` – 将该值设置为 `elasticache`
+ `--resource-id` – 集群的资源标识符。对于该参数，资源类型为 `ReplicationGroup`，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ `--scalable-dimension` – 将该值设置为 `elasticache:replication-group:NodeGroups`。
+ `--max-capacity ` – 由 ElastiCache 自动扩缩管理的最大分片数。有关 `--min-capacity`、`--max-capacity` 和集群中分区数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。
+ `--min-capacity ` – 由 ElastiCache 自动扩缩管理的最小分片数。有关 `--min-capacity`、`--max-capacity` 和集群中分区数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。

**Example**  
 在以下示例中，您注册一个名为 `myscalablecluster` 的 ElastiCache 集群。该注册表示应将集群动态扩展为具有 1 到 10 个分区。  
对于 Linux、macOS 或 Unix：  

```
aws application-autoscaling register-scalable-target \
    --service-namespace elasticache \
    --resource-id replication-group/myscalablecluster \
    --scalable-dimension elasticache:replication-group:NodeGroups \
    --min-capacity 1 \
    --max-capacity 10 \
```
对于 Windows：  

```
aws application-autoscaling register-scalable-target ^
    --service-namespace elasticache ^
    --resource-id replication-group/myscalablecluster ^
    --scalable-dimension elasticache:replication-group:NodeGroups ^
    --min-capacity 1 ^
    --max-capacity 10 ^
```

**使用 API**

要注册您的 ElastiCache 集群，请使用包含下列参数的 [register-scalable-target](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/register-scalable-target.html) 命令：
+ ServiceNamespace – 将此值设置为 elasticache。
+ ResourceID – ElastiCache 集群的资源标识符。对于该参数，资源类型为 ReplicationGroup，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ ScalableDimension – 将此值设置为 `elasticache:replication-group:NodeGroups`。
+ MinCapacity – 由 ElastiCache 自动扩缩管理的最小分片数。有关 --min-capacity、--max-capacity 和集群中副本数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。
+ MaxCapacity – 由 ElastiCache 自动扩缩管理的最大分片数。有关 --min-capacity、--max-capacity 和集群中副本数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。

**Example**  
在以下示例中，您使用 Application Auto Scaling API 注册一个名为 `myscalablecluster` 的 ElastiCache 集群。该注册表示应将集群动态扩展为具有 1 到 5 个副本。  

```
POST / HTTP/1.1
Host: autoscaling.us-east-2.amazonaws.com
Accept-Encoding: identity
Content-Length: 219
X-Amz-Target: AnyScaleFrontendService.RegisterScalableTarget
X-Amz-Date: 20160506T182145Z
User-Agent: aws-cli/1.10.23 Python/2.7.11 Darwin/15.4.0 botocore/1.4.8
Content-Type: application/x-amz-json-1.1
Authorization: AUTHPARAMS
{
    "ServiceNamespace": "elasticache",
    "ResourceId": "replication-group/myscalablecluster",
    "ScalableDimension": "elasticache:replication-group:NodeGroups",
    "MinCapacity": 1,
    "MaxCapacity": 5
}
```

# 定义扩缩策略
<a name="AutoScaling-Scaling-Defining-Policy-API"></a>

目标跟踪扩展策略配置是由 JSON 块表示的，其中定义了指标和目标值。您可以在文本文件中将扩展策略配置保存为 JSON 块。在调用 Amazon CLI 或 Application Auto Scaling API 时，您可以使用该文本文件。有关策略配置语法的更多信息，请参阅 Application Auto Scaling API 参考中的 [TargetTrackingScalingPolicyConfiguration](https://docs.amazonaws.cn/autoscaling/application/APIReference/API_TargetTrackingScalingPolicyConfiguration.html)。

您可以使用以下选项定义目标跟踪扩缩策略配置：

**Topics**
+ [

## 使用预定义的指标
](#AutoScaling-Scaling-Predefined-Metric)
+ [

## 使用自定义指标
](#AutoScaling-Scaling-Custom-Metric)
+ [

## 使用冷却时间
](#AutoScaling-Scaling-Cooldown-periods)

## 使用预定义的指标
<a name="AutoScaling-Scaling-Predefined-Metric"></a>

通过使用预定义的指标，您可以快速为 ElastiCache for Valkey and Redis OSS 集群定义与 ElastiCache 自动扩缩中的目标跟踪搭配使用的目标跟踪扩缩策略。

目前，ElastiCache 在 NodeGroup 自动扩缩中支持以下预定义指标：
+ **ElastiCachePrimaryEngineCPUUtilization** – 集群中所有主节点在 CloudWatch 中 `EngineCPUUtilization` 指标的平均值。
+ **ElastiCacheDatabaseMemoryUsageCountedForEvictPercentage** – 集群中所有主节点在 CloudWatch 中 `DatabaseMemoryUsageCountedForEvictPercentage` 指标的平均值。
+ **ElastiCacheDatabaseCapacityUsageCountedForEvictPercentage** – 集群中所有主节点在 CloudWatch 中 `ElastiCacheDatabaseCapacityUsageCountedForEvictPercentage` 指标的平均值。

有关 `EngineCPUUtilization`、`DatabaseMemoryUsageCountedForEvictPercentage` 和 `DatabaseCapacityUsageCountedForEvictPercentage` 指标的更多信息，请参阅[使用 CloudWatch 指标监控使用情况](CacheMetrics.md)。要在扩展策略中使用预定义的指标，您需要为扩展策略创建一个目标跟踪配置。该配置必须包含 `PredefinedMetricSpecification` 以表示预定义的指标，并包含 TargetValue 以表示该指标的目标值。

**Example**  
以下示例说明了 ElastiCache for Valkey and Redis OSS 集群的典型目标跟踪扩缩策略配置。在该配置中，`ElastiCachePrimaryEngineCPUUtilization` 预定义指标用于根据集群中所有主节点的平均 CPU 使用率（40%）来调整该集群。  

```
{
    "TargetValue": 40.0,
    "PredefinedMetricSpecification":
    {
        "PredefinedMetricType": "ElastiCachePrimaryEngineCPUUtilization"
    }
}
```

## 使用自定义指标
<a name="AutoScaling-Scaling-Custom-Metric"></a>

 通过使用自定义指标，您可以定义满足您的自定义要求的目标跟踪扩展策略。您可以根据随扩展按比例变化的任何 ElastiCache 指标来定义自定义指标。并非所有 Elasticache 指标都适用于目标跟踪。指标必须是有效的使用率指标，它用于描述实例的繁忙程度。指标值必须随集群中分区数按比例增加或减少。要使用指标数据按比例横向扩展或缩减分区数，必须按比例进行这种增加或减少。

**Example**  
以下示例说明了扩缩策略的目标跟踪配置。在该配置中，一个自定义指标根据名为 `my-db-cluster` 的集群中所有分片的平均 CPU 使用率（50%）调整 ElastiCache for Redis OSS 集群。

```
{
    "TargetValue": 50,
    "CustomizedMetricSpecification":
    {
        "MetricName": "EngineCPUUtilization",
        "Namespace": "AWS/ElastiCache",
        "Dimensions": [
            {
                "Name": "ReplicationGroup","Value": "my-db-cluster"
            },
            {
                "Name": "Role","Value": "PRIMARY"
            }
        ],
        "Statistic": "Average",
        "Unit": "Percent"
    }
}
```

## 使用冷却时间
<a name="AutoScaling-Scaling-Cooldown-periods"></a>

您可以为 `ScaleOutCooldown` 指定一个值（秒）以添加横向扩展集群的冷却时间。同样，您可以为 `ScaleInCooldown` 添加一个值（秒）以添加横向缩减集群的冷却时间。有关更多信息，请参阅 Application Auto Scaling API 参考中的 [TargetTrackingScalingPolicyConfiguration](https://docs.amazonaws.cn/autoscaling/application/APIReference/API_TargetTrackingScalingPolicyConfiguration.html)。

 以下示例说明了扩缩策略的目标跟踪配置。在该配置中，`ElastiCachePrimaryEngineCPUUtilization` 预定义指标用于根据该集群中所有主节点的平均 CPU 使用率（40%）调整 ElastiCache for Redis OSS 集群。该配置将缩减冷却时间指定为 10 分钟，并将扩展冷却时间指定为 5 分钟。

```
{
    "TargetValue": 40.0,
    "PredefinedMetricSpecification":
    {
        "PredefinedMetricType": "ElastiCachePrimaryEngineCPUUtilization"
    },
    "ScaleInCooldown": 600,
    "ScaleOutCooldown": 300
}
```

# 禁用横向缩减活动
<a name="AutoScaling-Scaling-Disabling-Scale-in"></a>

您可以禁用横向缩减活动，以阻止目标跟踪扩缩策略配置对您的集群进行横向缩减。禁用横向缩减活动将禁止扩展策略删除分区，同时仍允许扩展策略根据需要创建分区。

您可以为 `DisableScaleIn` 指定一个布尔值，以便为集群启用或禁用横向缩减活动。有关更多信息，请参阅 Application Auto Scaling API 参考中的 [TargetTrackingScalingPolicyConfiguration](https://docs.amazonaws.cn/autoscaling/application/APIReference/API_TargetTrackingScalingPolicyConfiguration.html)。

以下示例说明了扩缩策略的目标跟踪配置。在该配置中，`ElastiCachePrimaryEngineCPUUtilization` 预定义指标用于根据 ElastiCache for Valkey and Redis OSS 集群中所有主节点的平均 CPU 使用率（40%）来调整该集群。该配置禁用扩缩策略的横向缩减活动。

```
{
    "TargetValue": 40.0,
    "PredefinedMetricSpecification":
    {
        "PredefinedMetricType": "ElastiCachePrimaryEngineCPUUtilization"
    },
    "DisableScaleIn": true
}
```

# 应用扩缩策略
<a name="AutoScaling-Scaling-Applying-a-Scaling-Policy"></a>

在为集群注册 ElastiCache for Valkey and Redis OSS 自动扩缩并定义扩缩策略后，您可以将扩缩策略应用于已注册的集群。要将扩缩策略应用于 ElastiCache for Redis OSS 集群，您可以使用 Amazon CLI 或 Application Auto Scaling API。

## 使用 Amazon CLI 应用扩展策略
<a name="AutoScaling-Scaling-Applying-a-Scaling-Policy-CLI"></a>

要将扩缩策略应用于 ElastiCache for Valkey and Redis OSS 集群，请使用具有以下参数的 [put-scaling-policy](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/put-scaling-policy.html) 命令：
+ **--policy-name** – 扩展策略的名称。
+ **--policy-type** – 将此值设置为 `TargetTrackingScaling`。
+ **--resource-id** – 资源标识符。对于该参数，资源类型为 `ReplicationGroup`，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ **--service-namespace** – 将此值设置为 `elasticache`。
+ **--scalable-dimension** – 将此值设置为 `elasticache:replication-group:NodeGroups`。
+ **--target-tracking-scaling-policy-configuration** – 用于集群的目标跟踪扩缩策略配置。

在以下示例中，您使用 ElastiCache 自动扩缩对名为 `myscalablecluster` 的 ElastiCache for Valkey and Redis OSS 集群应用名为 `myscalablepolicy` 的目标跟踪扩缩策略。为此，请使用在名为 `config.json` 的文件中保存的策略配置。

对于 Linux、macOS 或 Unix：

```
aws application-autoscaling put-scaling-policy \
    --policy-name myscalablepolicy \
    --policy-type TargetTrackingScaling \
    --resource-id replication-group/myscalablecluster \
    --service-namespace elasticache \
    --scalable-dimension elasticache:replication-group:NodeGroups \
    --target-tracking-scaling-policy-configuration file://config.json
```

对于 Windows：

```
aws application-autoscaling put-scaling-policy ^
    --policy-name myscalablepolicy ^
    --policy-type TargetTrackingScaling ^
    --resource-id replication-group/myscalablecluster ^
    --service-namespace elasticache ^
    --scalable-dimension elasticache:replication-group:NodeGroups ^
    --target-tracking-scaling-policy-configuration file://config.json
```

## 使用 API 应用扩展策略
<a name="AutoScaling-Scaling-Applying-a-Scaling-Policy-API"></a>

要将扩缩策略应用于 ElastiCache for Valkey and Redis OSS 集群，请使用具有以下参数的 [PutScalingPolicy](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/put-scaling-policy.html) Amazon CLI 命令：
+ **--policy-name** – 扩展策略的名称。
+ **--resource-id** – 资源标识符。对于该参数，资源类型为 `ReplicationGroup`，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ **--service-namespace** – 将此值设置为 `elasticache`。
+ **--scalable-dimension** – 将此值设置为 `elasticache:replication-group:NodeGroups`。
+ **--target-tracking-scaling-policy-configuration** – 用于集群的目标跟踪扩缩策略配置。

在以下示例中，您使用 ElastiCache 自动扩缩对名为 `myscalablecluster` 的 ElastiCache 集群应用名为 `myscalablepolicy` 的目标跟踪扩缩策略。您使用的策略配置基于 `ElastiCachePrimaryEngineCPUUtilization` 预定义指标。

```
POST / HTTP/1.1
Host: autoscaling.us-east-2.amazonaws.com
Accept-Encoding: identity
Content-Length: 219
X-Amz-Target: AnyScaleFrontendService.PutScalingPolicy
X-Amz-Date: 20160506T182145Z
User-Agent: aws-cli/1.10.23 Python/2.7.11 Darwin/15.4.0 botocore/1.4.8
Content-Type: application/x-amz-json-1.1
Authorization: AUTHPARAMS
{
    "PolicyName": "myscalablepolicy",
    "ServiceNamespace": "elasticache",
    "ResourceId": "replication-group/myscalablecluster",
    "ScalableDimension": "elasticache:replication-group:NodeGroups",
    "PolicyType": "TargetTrackingScaling",
    "TargetTrackingScalingPolicyConfiguration": {
        "TargetValue": 40.0,
        "PredefinedMetricSpecification":
        {
            "PredefinedMetricType": "ElastiCachePrimaryEngineCPUUtilization"
        }
    }
}
```

# 编辑扩展策略
<a name="AutoScaling-Scaling-Editing-a-Scaling-Policy"></a>

您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 Application Auto Scaling API 编辑扩缩策略。

## 使用 Amazon Web Services 管理控制台编辑扩展策略
<a name="AutoScaling-Scaling-Editing-a-Scaling-Policy-CON"></a>

**编辑 ElastiCache for Valkey and Redis OSS 集群的自动扩缩策略**

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择相应的引擎。

1. 选择您要向其中添加策略的集群（选择集群名称，而不是其左侧的按钮）。

1. 选择 **Auto Scaling policies**（弹性伸缩策略）选项卡。

1. 在 **Scaling policies**（扩展策略）下，选择要更改的 Auto Scaling 策略左侧的按钮，然后选择 **Modify**（修改）。

1. 对该策略做出必要更改。

1. 选择**修改**。

## 使用 Amazon CLI 或 API 编辑扩展策略
<a name="AutoScaling-Scaling-Editing-a-Scaling-Policy-CLI"></a>

您可以使用 Amazon CLI 或 Application Auto Scaling API 按照与应用扩缩策略相同的方式编辑扩缩策略：
+ 在使用 Amazon CLI 时，请在 `--policy-name` 参数中指定要编辑的策略名称。为要更改的参数指定新的值。
+ 在使用 Application Auto Scaling API 时，请在 `PolicyName` 参数中指定要编辑的策略名称。为要更改的参数指定新的值。

有关更多信息，请参阅 [应用扩缩策略](AutoScaling-Scaling-Applying-a-Scaling-Policy.md)。

# 删除扩展策略
<a name="AutoScaling-Scaling-Deleting-a-Scaling-Policy"></a>

您可以使用Amazon Web Services 管理控制台、Amazon CLI 或 Application Auto Scaling API 删除扩缩策略。

## 使用 Amazon Web Services 管理控制台删除扩展策略
<a name="AutoScaling-Scaling-Editing-a-Scaling-Policy-CON"></a>

**删除 ElastiCache for Redis OSS 集群的自动扩缩策略**

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**。

1. 选择要编辑其 Auto Scaling 策略的集群（选择集群名称，而不是其左侧的按钮）。

1. 选择 **Auto Scaling policies**（弹性伸缩策略）选项卡。

1. 在 **Scaling policies**（扩展策略）下，选择 Auto Scaling 策略，然后选择 **Delete**（删除）。

## 使用 Amazon CLI删除扩展策略
<a name="AutoScaling-Scaling-Deleting-a-Scaling-Policy-CLI"></a>

要删除 ElastiCache for Valkey and Redis OSS 集群的扩缩策略，请使用具有以下参数的 [delete-scaling-policy](https://docs.amazonaws.cn/cli/latest/reference/autoscaling/delete-scaling-policy.html) Amazon CLI 命令：
+ **--policy-name** – 扩展策略的名称。
+ **--resource-id** – 资源标识符。对于该参数，资源类型为 `ReplicationGroup`，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ **--service-namespace** – 将此值设置为 `elasticache`。
+ **--scalable-dimension** – 将此值设置为 `elasticache:replication-group:NodeGroups`。

在以下示例中，您将从名为 `myscalablepolicy` 的集群中删除名为 `myscalablecluster` 的目标跟踪扩缩策略。

对于 Linux、macOS 或 Unix：

```
aws application-autoscaling delete-scaling-policy \
    --policy-name myscalablepolicy \
    --resource-id replication-group/myscalablecluster \
    --service-namespace elasticache \
    --scalable-dimension elasticache:replication-group:NodeGroups
```

对于 Windows：

```
aws application-autoscaling delete-scaling-policy ^
    --policy-name myscalablepolicy ^
    --resource-id replication-group/myscalablecluster ^
    --service-namespace elasticache ^
    --scalable-dimension elasticache:replication-group:NodeGroups
```

## 使用 API 删除扩展策略
<a name="AutoScaling-Scaling-Deleting-a-Scaling-Policy-API"></a>

要删除 ElastiCache for Valkey and Redis OSS 集群的扩缩策略，请使用具有以下参数的 [DeleteScalingPolicy](https://docs.amazonaws.cn/cli/latest/reference/autoscaling/delete-scaling-policy.html) Amazon CLI 命令：
+ **--policy-name** – 扩展策略的名称。
+ **--resource-id** – 资源标识符。对于该参数，资源类型为 `ReplicationGroup`，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ **--service-namespace** – 将此值设置为 `elasticache`。
+ **--scalable-dimension** – 将此值设置为 `elasticache:replication-group:NodeGroups`。

在以下示例中，您将从名为 `myscalablepolicy` 的集群中删除名为 `myscalablecluster` 的目标跟踪扩缩策略。

```
POST / HTTP/1.1
Host: autoscaling.us-east-2.amazonaws.com
Accept-Encoding: identity
Content-Length: 219
X-Amz-Target: AnyScaleFrontendService.DeleteScalingPolicy
X-Amz-Date: 20160506T182145Z
User-Agent: aws-cli/1.10.23 Python/2.7.11 Darwin/15.4.0 botocore/1.4.8
Content-Type: application/x-amz-json-1.1
Authorization: AUTHPARAMS
{
    "PolicyName": "myscalablepolicy",
    "ServiceNamespace": "elasticache",
    "ResourceId": "replication-group/myscalablecluster",
    "ScalableDimension": "elasticache:replication-group:NodeGroups"
}
```

# 将 Amazon CloudFormation 用于 Auto Scaling 策略
<a name="AutoScaling-with-Cloudformation-Shards"></a>

此代码段演示如何使用 [AWS::ApplicationAutoScaling::ScalableTarget](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html) 资源创建目标跟踪策略并将其应用于 [AWS::ElastiCache::ReplicationGroup](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html) 资源。此示例利用 [Fn::Join](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html) 和 [Ref](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) 内置函数，使用在同一模板中指定的 `AWS::ElastiCache::ReplicationGroup` 资源的逻辑名称来构建 `ResourceId` 属性。

```
ScalingTarget:
   Type: 'AWS::ApplicationAutoScaling::ScalableTarget'
   Properties:
     MaxCapacity: 3
     MinCapacity: 1
     ResourceId: !Sub replication-group/${logicalName}
     ScalableDimension: 'elasticache:replication-group:NodeGroups'
     ServiceNamespace: elasticache
     RoleARN: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/elasticache.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ElastiCacheRG"

  ScalingPolicy:
    Type: "AWS::ApplicationAutoScaling::ScalingPolicy"
    Properties:
      ScalingTargetId: !Ref ScalingTarget
      ServiceNamespace: elasticache
      PolicyName: testpolicy
      PolicyType: TargetTrackingScaling
      ScalableDimension: 'elasticache:replication-group:NodeGroups'
      TargetTrackingScalingPolicyConfiguration:
        PredefinedMetricSpecification:
          PredefinedMetricType: ElastiCachePrimaryEngineCPUUtilization
        TargetValue: 40
```

# 计划扩展
<a name="AutoScaling-with-Scheduled-Scaling-Shards"></a>

按计划扩展使您可以按照可预测的需求变化来扩展应用程序。要使用计划扩缩，您需要创建计划操作，用于告知 ElastiCache for Valkey and Redis OSS 在特定时间执行扩缩活动。创建计划操作时，您需要指定现有集群、执行扩缩活动的时间、最小容量和最大容量。您可以创建仅扩展一次或按重复计划扩展的计划操作。

 您只能为已存在的集群创建计划操作。您不能在创建集群的同时创建计划操作。

有关计划操作创建、管理和删除的相关术语的详细信息，请参阅[计划操作创建、管理和删除的常用命令](https://docs.amazonaws.cn/autoscaling/application/userguide/application-auto-scaling-scheduled-scaling.html#scheduled-scaling-commonly-used-commands) 

**创建定期计划：**

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**。

1. 选择要对其添加策略的集群。

1. 从 **Actions**（操作）下拉菜单中选择 **Manage Auto Scaling policies**（管理弹性伸缩策略）。

1. 选择 **Auto Scaling policies（Auto Scaling 策略）**选项卡。

1. **Auto scaling policies**（弹性伸缩策略）部分中会显示 **Add Scaling policy**（添加扩缩策略）对话框。选择 **Scheduled scaling（计划扩展）**。

1. 对于 **Policy name（策略名称）**，请输入策略的名称。

1. 对于 **Scalable Dimension（可扩展维度）**，选择 **Shards（分区）**。

1. 对于 **Target Shards（目标分区）**，请选择值。

1. 对于 **Recurrence（重复）**，请选择 **Recurring（定期）**。

1. 对于 **Frequency（频率）**，请选择相应的值。

1. 对于 **Start Date（开始日期）**和 **Start time（开始时间）**，请选择策略开始生效的时间。

1. 选择 **Add Policy（添加策略）**。

**创建一次性计划操作：**

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**。

1. 选择要对其添加策略的集群。

1. 从 **Actions**（操作）下拉菜单中选择 **Manage Auto Scaling policies**（管理弹性伸缩策略）。

1. 选择 **Auto Scaling policies（Auto Scaling 策略）**选项卡。

1. **Auto scaling policies**（弹性伸缩策略）部分中会显示 **Add Scaling policy**（添加扩缩策略）对话框。选择 **Scheduled scaling（计划扩展）**。

1. 对于 **Policy name（策略名称）**，请输入策略的名称。

1. 对于 **Scalable Dimension（可扩展维度）**，选择 **Shards（分区）**。

1. 对于 **Target Shards（目标分区）**，请选择值。

1. 对于 **Recurrence（重复）**，请选择 **Once（一次）**。

1. 对于 **Start Date（开始日期）**和 **Start time（开始时间）**，请选择策略开始生效的时间。

1. 对于 **End Date（结束日期）**，请选择策略生效结束日期。

1. 选择 **Add Policy（添加策略）**。

**删除计划操作**

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**。

1. 选择要对其添加策略的集群。

1. 从 **Actions**（操作）下拉菜单中选择 **Manage Auto Scaling policies**（管理弹性伸缩策略）。

1. 选择 **Auto Scaling policies（Auto Scaling 策略）**选项卡。

1. 在 **Auto Scaling policies**（弹性伸缩策略）部分，选择弹性伸缩策略，然后从 **Actions**（操作）对话中选择 **Delete（删除）**。

**使用 Amazon CLI 管理计划扩展**

使用以下 application-autoscaling API：
+ [put-scheduled-action](https://docs.amazonaws.cn/cli/latest/reference/autoscaling/put-scheduled-action.html) 
+ [describe-scheduled-actions](https://docs.amazonaws.cn/cli/latest/reference/autoscaling/describe-scheduled-actions.html) 
+ [delete-scheduled-action](https://docs.amazonaws.cn/cli/latest/reference/autoscaling/delete-scheduled-action.html) 

## 使用 Amazon CloudFormation 创建计划的操作
<a name="AutoScaling-with-Cloudformation-Declare-Scheduled-Action"></a>

此代码段演示如何使用 [AWS::ApplicationAutoScaling::ScalableTarget](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html) 资源创建目标跟踪策略并将其应用于 [AWS::ElastiCache::ReplicationGroup](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html) 资源。此示例利用 [Fn::Join](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html) 和 [Ref](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) 内置函数，使用在同一模板中指定的 `AWS::ElastiCache::ReplicationGroup` 资源的逻辑名称来构建 `ResourceId` 属性。

```
ScalingTarget:
   Type: 'AWS::ApplicationAutoScaling::ScalableTarget'
   Properties:
     MaxCapacity: 3
     MinCapacity: 1
     ResourceId: !Sub replication-group/${logicalName}
     ScalableDimension: 'elasticache:replication-group:NodeGroups'
     ServiceNamespace: elasticache
     RoleARN: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/elasticache.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ElastiCacheRG"
     ScheduledActions:
       - EndTime: '2020-12-31T12:00:00.000Z'
         ScalableTargetAction:
           MaxCapacity: '5'
           MinCapacity: '2'
         ScheduledActionName: First
         Schedule: 'cron(0 18 * * ? *)'
```

# 将弹性伸缩与副本结合使用
<a name="AutoScaling-Using-Replicas"></a>

ElastiCache 复制组可以将一个或多个缓存设置为单个逻辑节点。

下面提供了有关目标跟踪和计划策略以及如何使用 Amazon Web Services 管理控制台 Amazon CLI 和 API 应用它们的详细信息。

# 目标跟踪扩缩策略
<a name="AutoScaling-Scaling-Policies-Replicas-Replicas"></a>

在使用目标跟踪扩展策略时，您可以选择一个指标并设置一个目标值。ElastiCache for Valkey and Redis OSS 自动扩缩可创建和管理触发扩缩策略的 CloudWatch 警报，并根据指标和目标值计算扩缩调整。扩展策略根据需要均匀地添加或删除所有分区的副本，以便将指标保持在指定的目标值或接近该值。除了将指标保持在目标值附近以外，目标跟踪扩展策略还会根据由于负载模式波动而造成的指标波动进行调节，并最大限度减少队列容量发生快速波动的情况。

## 副本的弹性伸缩条件
<a name="AutoScaling-Scaling-Criteria-Replicas"></a>

弹性伸缩策略为您的集群定义以下预定义指标：

`ElastiCacheReplicaEngineCPUUtilization`：ElastiCache 用来触发自动扩缩操作的所有副本的引擎 CPU 平均使用率阈值。您可以将此使用率目标设置为 35% 到 70% 之间。

当服务检测到 `ElastiCacheReplicaEngineCPUUtilization` 指标等于或大于“目标”设置时，其会自动提高所有分区的副本。ElastiCache 按等于以下两个数字之间较大者的计数来横向扩展集群副本：与目标之间差异的百分比和 1 个副本。对于横向缩减，ElastiCache 不会自动横向缩减，除非整体指标值低于所定义的目标的 75%。

关于横向扩展示例，如果您有 5 个分区，每个分区中有 1 个副本：

如果目标超出 30%，ElastiCache for Valkey 和 ElastiCache for Redis OSS 将在所有分片上横向扩展 1 个副本（max(0.3, default 1)），最后的结果是有 5 个分片，每个分片包含 2 个副本。

对于横向缩减示例，如果您选择的目标值是 60%，那么 ElastiCache for Valkey and Redis OSS 将在指标小于或等于 45%（比目标值 60% 低 25%）时开始自动横向缩减。

### 弹性伸缩注意事项
<a name="AutoScaling-Scaling-Considerations-Replicas"></a>

请注意以下事项：
+ 目标跟踪扩展策略假设它应该在指定指标高于目标值时执行向外扩展。因此，不能使用目标跟踪扩展策略在指定指标低于目标值时向外扩展。ElastiCache for Valkey and Redis OSS 会根据集群中所有分片上现有副本的最大值（偏离目标的偏差经四舍五入的百分比，默认为 1）来横向扩展副本。
+ 当指定指标数据不足时，目标跟踪扩展策略不会执行扩展。它不会执行向内扩展，因为它不会将数据不足解读为使用率低。
+ 您可能会看到目标值与实际指标数据点之间存在差距。这是因为 ElastiCache 自动扩缩在确定要添加或移除多少容量时将始终通过向上或向下舍入保守地进行操作，以免添加的容量不足或删除的容量过多。
+ 为了确保应用程序可用性，服务会针对指标尽快按比例横向扩展，但渐进式横向缩减，集群中所有分区的最大横向缩减副本数为 1。
+ 您可以为 ElastiCache for Valkey and Redis OSS 集群提供多个目标跟踪扩缩策略，前提是每个策略使用不同的指标。自动扩缩的目的是始终优先考虑可用性，因此其行为会有所不同，具体取决于目标跟踪策略是否已准备好横向扩展或横向缩减。如果任何目标跟踪策略已准备好进行扩展，它将扩展服务，但仅在所有目标跟踪策略（启用了缩减部分）准备好缩减时才执行缩减。
+ 请勿编辑或删除 ElastiCache 自动扩缩为目标跟踪扩缩策略管理的 CloudWatch 警报。在您删除扩缩策略或删除集群时，自动扩缩会自动删除警报。
+ ElastiCache 自动扩缩不会阻止您手动修改分片中的副本。这些手动调整不会影响附加到扩展策略的任何现有 CloudWatch 告警，但可能会影响可触发这些 CloudWatch 告警的指标。
+ 这些由弹性伸缩管理的 CloudWatch 告警是通过集群中所有分区的 AVG 指标来定义的。因此，拥有热分区可能会导致以下任一情况：
  + 因若干热分区上负载触发 CloudWatch 告警而导致在不需要扩展时执行扩展
  + 因所有分区的影响告警的聚合 AVG 指标不违例而在需要扩展时不执行扩展。
+ ElastiCache 对每个集群的节点的默认限制仍然适用。因此，当选择弹性伸缩时，如果您希望最大节点数超过默认限制，请在 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 请求提高限制，并选择限制类型 **Nodes per cluster per instance type**（每个实例类型的集群的节点数）。
+ 请确保您的 VPC 中有足够的 ENI（弹性网络接口）可用，横向扩展过程中需要弹性网络接口。有关更多信息，请参阅[弹性网络接口](https://docs.amazonaws.cn/vpc/latest/userguide/VPC_ElasticNetworkInterfaces.html)。
+ 如果 EC2 没有足够的可用容量，则 ElastiCache 自动扩缩会直到容量可用或您手动将集群修改为具有足够容量的实例类型才会横向扩展。
+ ElastiCache 自动扩缩不支持扩缩集群 `ReservedMemoryPercent` 低于 25% 的副本。有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

# 添加扩展策略
<a name="AutoScaling-Adding-Policy-Replicas"></a>

您可以使用 Amazon Web Services 管理控制台 添加扩展策略。

**使用 Amazon Web Services 管理控制台添加扩展策略**

向 ElastiCache for Valkey and Redis OSS 添加自动扩缩策略

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**。

1. 选择您要向其中添加策略的集群（选择集群名称，而不是其左侧的按钮）。

1. 选择 **Auto Scaling policies**（弹性伸缩策略）选项卡。

1. 选择 **add dynamic scaling**（添加动态扩展）。

1. 在 **Scaling policies**（扩展策略）下，选择 **Add dynamic scaling**（添加动态扩展）。

1. 对于 **Policy name（策略名称）**，请输入策略的名称。

1. 对于 **Scalable Dimension（可扩展维度）**，从对话框中选择 **Replicas（副本）**。

1. 对于目标值，请键入要在 ElastiCache 副本上保持的 CPU 使用率的平均百分比。此值必须介于 35 到 70 之间。将添加或删除集群副本以使指标接近于指定的值。

1. （可选）控制台不支持横向缩减或横向扩展冷却时间。请使用 Amazon CLI 修改冷却时间值。

1. 对于**最小容量**，请键入 ElastiCache 自动扩缩策略需要保持的最小副本数。

1. 对于**最大容量**，请键入 ElastiCache 自动扩缩策略需要保持的最大副本数。此值必须大于或等于 5。

1. 选择**创建**。

# 注册可扩展目标
<a name="AutoScaling-Register-Policy"></a>

您可以应用基于预定义或自定义指标的扩展策略。为此，您可以使用 Amazon CLI 或 Application Auto Scaling API。第一步是为 ElastiCache for Valkey and Redis OSS 复制组注册自动扩缩。

在集群上使用 ElastiCache 自动扩缩之前，您必须先为集群注册 ElastiCache 自动扩缩。这样做是为了定义应用于该集群的扩展维度和限制。ElastiCache 自动扩缩会连同 `elasticache:replication-group:Replicas` 可扩缩维度一起动态扩缩集群，该维度表示每个分片的集群副本数量。

**使用 CLI**：

要注册您的 ElastiCache 集群，请使用包含下列参数的 [register-scalable-target](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/register-scalable-target.html) 命令：
+ --service-namespace – 将此值设置为 elasticache。
+ --resource-id – ElastiCache 集群的资源标识符。对于该参数，资源类型为 ReplicationGroup，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ --scalable-dimension – 将此值设置为 `elasticache:replication-group:Replicas`。
+ --min-capacity – 由 ElastiCache 自动扩缩管理的最小副本数。有关 --min-capacity、--max-capacity 和集群中副本数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。
+ --max-capacity – 由 ElastiCache 自动扩缩管理的最大副本数。有关 --min-capacity、--max-capacity 和集群中副本数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。

**Example**  
在以下示例中，您注册一个名为 `myscalablecluster` 的 ElastiCache 集群。该注册表示应将集群动态扩展为具有 1 到 5 个副本。  
对于 Linux、macOS 或 Unix：  

```
aws application-autoscaling register-scalable-target \
    --service-namespace elasticache \
    --resource-id replication-group/myscalablecluster \
    --scalable-dimension elasticache:replication-group:Replicas \
    --min-capacity 1 \
    --max-capacity 5 \
```
对于 Windows：  

```
aws application-autoscaling register-scalable-target ^
    --service-namespace elasticache ^
    --resource-id replication-group/myscalablecluster ^
    --scalable-dimension elasticache:replication-group:Replicas ^
    --min-capacity 1 ^
    --max-capacity 5 ^
```

**使用 API**

要注册您的 ElastiCache 集群，请使用包含下列参数的 [register-scalable-target](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/register-scalable-target.html) 命令：
+ ServiceNamespace – 将此值设置为 elasticache。
+ ResourceID – ElastiCache 集群的资源标识符。对于该参数，资源类型为 ReplicationGroup，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ ScalableDimension – 将此值设置为 `elasticache:replication-group:Replicas`。
+ MinCapacity – 由 ElastiCache 自动扩缩管理的最小副本数。有关 --min-capacity、--max-capacity 和集群中副本数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。
+ MaxCapacity – 由 ElastiCache 自动扩缩管理的最大副本数。有关 --min-capacity、--max-capacity 和集群中副本数之间关系的信息，请参阅 [最小和最大容量](AutoScaling-Policies.md#AutoScaling-MinMax)。

**Example**  
在以下示例中，您使用 Application Auto Scaling API 注册了一个名为 `myscalablecluster` 的集群。该注册表示应将集群动态扩展为具有 1 到 5 个副本。

```
POST / HTTP/1.1
Host: autoscaling.us-east-2.amazonaws.com
Accept-Encoding: identity
Content-Length: 219
X-Amz-Target: AnyScaleFrontendService.RegisterScalableTarget
X-Amz-Date: 20160506T182145Z
User-Agent: aws-cli/1.10.23 Python/2.7.11 Darwin/15.4.0 botocore/1.4.8
Content-Type: application/x-amz-json-1.1
Authorization: AUTHPARAMS
{
    "ServiceNamespace": "elasticache",
    "ResourceId": "replication-group/myscalablecluster",
    "ScalableDimension": "elasticache:replication-group:Replicas",
    "MinCapacity": 1,
    "MaxCapacity": 5
}
```

# 定义扩缩策略
<a name="AutoScaling-Defining-Policy"></a>

目标跟踪扩展策略配置是由 JSON 块表示的，其中定义了指标和目标值。您可以在文本文件中将扩展策略配置保存为 JSON 块。在调用 Amazon CLI 或 Application Auto Scaling API 时，您可以使用该文本文件。有关策略配置语法的更多信息，请参阅 *Application Auto Scaling API 参考*中的 [TargetTrackingScalingPolicyConfiguration](https://docs.amazonaws.cn/ApplicationAutoScaling/latest/APIReference/API_TargetTrackingScalingPolicyConfiguration.html)。

您可以使用以下选项定义目标跟踪扩缩策略配置：

**Topics**
+ [

## 使用预定义的指标
](#AutoScaling-Predefined-Metric)
+ [

# 编辑扩展策略
](AutoScaling-Editing-Policy.md)
+ [

# 删除扩展策略
](AutoScaling-Deleting-Policy.md)
+ [

# 将 Amazon CloudFormation 用于 Auto Scaling 策略
](AutoScaling-with-Cloudformation.md)
+ [

# 计划扩展
](AutoScaling-with-Scheduled-Scaling-Replicas.md)

## 使用预定义的指标
<a name="AutoScaling-Predefined-Metric"></a>

目标跟踪扩展策略配置是由 JSON 块表示的，其中定义了指标和目标值。您可以在文本文件中将扩展策略配置保存为 JSON 块。在调用 Amazon CLI 或 Application Auto Scaling API 时，您可以使用该文本文件。有关策略配置语法的更多信息，请参阅 *Application Auto Scaling API 参考*中的 [TargetTrackingScalingPolicyConfiguration](https://docs.amazonaws.cn/ApplicationAutoScaling/latest/APIReference/API_TargetTrackingScalingPolicyConfiguration.html)。

您可以使用以下选项定义目标跟踪扩缩策略配置：

**Topics**
+ [

### 使用预定义的指标
](#AutoScaling-Predefined-Metric)
+ [

### 使用自定义指标
](#AutoScaling-Custom-Metric)
+ [

### 使用冷却时间
](#AutoScaling-Using-Cooldowns)
+ [

### 禁用横向缩减活动
](#AutoScaling-Disabling-Scalein)
+ [

### 向 ElastiCache for Valkey and Redis OSS 集群应用扩缩策略
](#AutoScaling-Applying-Policy)

### 使用预定义的指标
<a name="AutoScaling-Predefined-Metric"></a>

通过使用预定义的指标，您可以快速为 ElastiCache for Valkey and Redis OSS 集群定义与 ElastiCache 自动扩缩中的目标跟踪搭配使用的目标跟踪扩缩策略。目前，ElastiCache 支持 ElastiCache 副本自动扩缩中的以下预定义指标：

`ElastiCacheReplicaEngineCPUUtilization` – 集群中所有副本在 CloudWatch 中的 EngineCPUUtilization 指标的平均值。您可以在 CloudWatch 中在 ElastiCache `ReplicationGroupId, Role` 下找到聚合指标值，获得所需的 ReplicationGroupId 和角色副本。

要在扩展策略中使用预定义的指标，您需要为扩展策略创建一个目标跟踪配置。该配置必须包含 `PredefinedMetricSpecification` 以表示预定义的指标，并包含 `TargetValue` 以表示该指标的目标值。

### 使用自定义指标
<a name="AutoScaling-Custom-Metric"></a>

通过使用自定义指标，您可以定义满足您的自定义要求的目标跟踪扩展策略。您可以根据随扩缩按比例变化的任何 ElastiCache for Valkey and Redis OSS 指标来定义自定义指标。并非所有 Elasticache 指标都适用于目标跟踪。指标必须是有效的使用率指标，它用于描述实例的繁忙程度。指标值必须随集群中的副本数按比例增加或减少。要使用指标数据按比例增加或减少副本数，必须按比例进行这种增加或减少。

**Example**  
以下示例说明了扩缩策略的目标跟踪配置。在该配置中，自定义指标根据名为 `my-db-cluster` 的集群中所有副本的平均 CPU 使用率（50%）来调整该集群。  

```
{"TargetValue": 50,
    "CustomizedMetricSpecification":
    {"MetricName": "EngineCPUUtilization",
        "Namespace": "AWS/ElastiCache",
        "Dimensions": [
            {"Name": "ReplicationGroup","Value": "my-db-cluster"},
            {"Name": "Role","Value": "REPLICA"}
        ],
        "Statistic": "Average",
        "Unit": "Percent"
    }
}
```

### 使用冷却时间
<a name="AutoScaling-Using-Cooldowns"></a>

您可以为 `ScaleOutCooldown` 指定一个值（秒）以添加横向扩展集群的冷却时间。同样，您可以为 `ScaleInCooldown` 添加一个值（秒）以添加横向缩减集群的冷却时间。有关 `ScaleInCooldown` 和 `ScaleOutCooldown` 的更多信息，请参阅 *Application Auto Scaling API 参考*中的 [TargetTrackingScalingPolicyConfiguration](https://docs.amazonaws.cn/ApplicationAutoScaling/latest/APIReference/API_TargetTrackingScalingPolicyConfiguration.html)。以下示例说明了扩缩策略的目标跟踪配置。在该配置中，`ElastiCacheReplicaEngineCPUUtilization` 预定义指标用于根据集群中所有副本的平均 CPU 使用率（40%）来调整该集群。该配置将缩减冷却时间指定为 10 分钟，并将扩展冷却时间指定为 5 分钟。

```
{"TargetValue": 40.0,
    "PredefinedMetricSpecification":
    {"PredefinedMetricType": "ElastiCacheReplicaEngineCPUUtilization"
    },
    "ScaleInCooldown": 600,
    "ScaleOutCooldown": 300
}
```

### 禁用横向缩减活动
<a name="AutoScaling-Disabling-Scalein"></a>

您可以禁用横向缩减活动，以禁止目标跟踪扩缩策略配置横向缩减 ElastiCache for Valkey and Redis OSS 集群。禁用横向缩减活动将禁止扩展策略删除副本，同时仍允许扩展策略根据需要添加副本。

您可以为 `DisableScaleIn` 指定一个布尔值，以便为集群启用或禁用横向缩减活动。有关 `DisableScaleIn` 的更多信息，请参阅 *Application Auto Scaling API 参考*中的 [TargetTrackingScalingPolicyConfiguration](https://docs.amazonaws.cn/ApplicationAutoScaling/latest/APIReference/API_TargetTrackingScalingPolicyConfiguration.html)。

**Example**  
以下示例说明了扩缩策略的目标跟踪配置。在该配置中，`ElastiCacheReplicaEngineCPUUtilization` 预定义指标根据集群中所有副本的平均 CPU 使用率（40%）调整该集群。该配置禁用扩缩策略的横向缩减活动。

```
{"TargetValue": 40.0,
    "PredefinedMetricSpecification":
    {"PredefinedMetricType": "ElastiCacheReplicaEngineCPUUtilization"
    },
    "DisableScaleIn": true
}
```

### 向 ElastiCache for Valkey and Redis OSS 集群应用扩缩策略
<a name="AutoScaling-Applying-Policy"></a>

在为集群注册 ElastiCache for Valkey and Redis OSS 自动扩缩并定义扩缩策略后，您可以将扩缩策略应用于已注册的集群。要将扩缩策略应用于 ElastiCache for Valkey and Redis OSS 集群，您可以使用 Amazon CLI 或 Application Auto Scaling API。

**使用 Amazon CLI**

要将扩缩策略应用于 ElastiCache for Valkey and Redis OSS 集群，请使用具有以下参数的 [put-scaling-policy](https://docs.amazonaws.cn/cli/latest/reference/autoscaling/put-scaling-policy.html) 命令：
+ --policy-name – 扩缩策略的名称。
+ --policy-type – 将此值设置为 `TargetTrackingScaling`。
+ --resource-id – 集群的资源标识符。对于该参数，资源类型为 ReplicationGroup，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ --service-namespace – 将此值设置为 elasticache。
+ --scalable-dimension – 将此值设置为 `elasticache:replication-group:Replicas`。
+ --target-tracking-scaling-policy-configuration – 用于集群的目标跟踪扩缩策略配置。

**Example**  
在以下示例中，您将使用 ElastiCache 自动扩缩对名为 `myscalablecluster` 的集群应用名为 `myscalablepolicy` 的目标跟踪扩缩策略。为此，请使用在名为 `config.json` 的文件中保存的策略配置。

对于 Linux、macOS 或 Unix：

```
aws application-autoscaling put-scaling-policy \
    --policy-name myscalablepolicy \
    --policy-type TargetTrackingScaling \
    --resource-id replication-group/myscalablecluster \
    --service-namespace elasticache \
    --scalable-dimension elasticache:replication-group:Replicas \
    --target-tracking-scaling-policy-configuration file://config.json
```

```
{"TargetValue": 40.0,
    "PredefinedMetricSpecification":
    {"PredefinedMetricType": "ElastiCacheReplicaEngineCPUUtilization"
    },
    "DisableScaleIn": true
}
```

对于 Windows：

```
aws application-autoscaling put-scaling-policy ^
    --policy-name myscalablepolicy ^
    --policy-type TargetTrackingScaling ^
    --resource-id replication-group/myscalablecluster ^
    --service-namespace elasticache ^
    --scalable-dimension elasticache:replication-group:Replicas ^
    --target-tracking-scaling-policy-configuration file://config.json
```

**使用 API**

要使用 Application Auto Scaling API 将扩缩策略应用于 ElastiCache 集群，请使用具有以下参数的 [PutScalingPolicy](https://docs.amazonaws.cn/autoscaling/application/APIReference/API_PutScalingPolicy.html) Application Auto Scaling API 操作：
+ PolicyName – 扩展策略的名称。
+ PolicyType – 将此值设置为 `TargetTrackingScaling`。
+ ResourceID – 集群的资源标识符。对于此参数，资源类型为 ReplicationGroup，唯一标识符为 ElastiCache for Redis OSS 集群的名称，例如 `replication-group/myscalablecluster`。
+ ServiceNamespace – 将此值设置为 elasticache。
+ ScalableDimension – 将此值设置为 `elasticache:replication-group:Replicas`。
+ TargetTrackingScalingPolicyConfiguration – 用于集群的目标跟踪扩缩策略配置。

**Example**  
在以下示例中，您将使用 ElastiCache 自动扩缩对名为 `myscalablecluster` 的集群应用名为 `scalablepolicy` 的目标跟踪扩缩策略。您使用的策略配置基于 `ElastiCacheReplicaEngineCPUUtilization` 预定义指标。

```
POST / HTTP/1.1
Host: autoscaling.us-east-2.amazonaws.com
Accept-Encoding: identity
Content-Length: 219
X-Amz-Target: AnyScaleFrontendService.PutScalingPolicy
X-Amz-Date: 20160506T182145Z
User-Agent: aws-cli/1.10.23 Python/2.7.11 Darwin/15.4.0 botocore/1.4.8
Content-Type: application/x-amz-json-1.1
Authorization: AUTHPARAMS
{
    "PolicyName": "myscalablepolicy",
    "ServiceNamespace": "elasticache",
    "ResourceId": "replication-group/myscalablecluster",
    "ScalableDimension": "elasticache:replication-group:Replicas",
    "PolicyType": "TargetTrackingScaling",
    "TargetTrackingScalingPolicyConfiguration": {
        "TargetValue": 40.0,
        "PredefinedMetricSpecification":
        {
            "PredefinedMetricType": "ElastiCacheReplicaEngineCPUUtilization"
        }
    }
}
```

# 编辑扩展策略
<a name="AutoScaling-Editing-Policy"></a>

您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 Application Auto Scaling API 编辑扩缩策略。

**使用 Amazon Web Services 管理控制台编辑扩展策略**

您只能通过 Amazon Web Services 管理控制台 使用预定义类型指标编辑策略

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/))。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**

1. 选择您要向其中添加策略的集群（选择集群名称，而不是其左侧的按钮）。

1. 选择 **Auto Scaling policies**（弹性伸缩策略）选项卡。

1. 在 **Scaling policies**（扩展策略）下，选择要更改的 Auto Scaling 策略左侧的按钮，然后选择 **Modify**（修改）。

1. 对该策略做出必要更改。

1. 选择 **Modify**(修改)。

1. 对该策略进行更改。

1. 选择 **Modify**(修改)。

**使用 Amazon CLI 或 Application Auto Scaling API 编辑扩缩策略**

您可以使用 Amazon CLI 或 Application Auto Scaling API 按照与应用扩缩策略相同的方式编辑扩缩策略：
+ 在使用 Application Auto Scaling API 时，请在 `PolicyName` 参数中指定要编辑的策略名称。为要更改的参数指定新的值。

有关更多信息，请参阅 [向 ElastiCache for Valkey and Redis OSS 集群应用扩缩策略](AutoScaling-Defining-Policy.md#AutoScaling-Applying-Policy)。

# 删除扩展策略
<a name="AutoScaling-Deleting-Policy"></a>

您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 Application Auto Scaling API 删除扩缩策略

**使用 Amazon Web Services 管理控制台删除扩展策略**

您只能通过 Amazon Web Services 管理控制台 使用预定义类型指标编辑策略

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**

1. 选择要删除其弹性伸缩策略的集群。

1. 选择 **Auto Scaling policies**（弹性伸缩策略）选项卡。

1. 在 **Scaling policies**（扩展策略）下，选择 Auto Scaling 策略，然后选择 **Delete**（删除）。

**使用 Amazon CLI 或 Application Auto Scaling API 删除扩缩策略**

您可以使用 Amazon CLI 或 Application Auto Scaling API 从 ElastiCache 集群中删除扩缩策略。

** CLI**

要删除 ElastiCache for Valkey and Redis OSS 集群的扩缩策略，请使用具有以下参数的 [delete-scaling-policy](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/delete-scaling-policy.html) 命令：
+ --policy-name – 扩缩策略的名称。
+ --resource-id – 集群的资源标识符。对于该参数，资源类型为 ReplicationGroup，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ --service-namespace – 将此值设置为 elasticache。
+ --scalable-dimension – 将此值设置为 `elasticache:replication-group:Replicas`。

**Example**  
在以下示例中，您从名为 `myscalablecluster` 的 ELC 集群中删除名为 `myscalablepolicy` 的目标跟踪扩缩策略。

对于 Linux、macOS 或 Unix：

```
aws application-autoscaling delete-scaling-policy \
    --policy-name myscalablepolicy \
    --resource-id replication-group/myscalablecluster \
    --service-namespace elasticache \
    --scalable-dimension elasticache:replication-group:Replicas \
```

对于 Windows：

```
aws application-autoscaling delete-scaling-policy ^
    --policy-name myscalablepolicy ^
    --resource-id replication-group/myscalablecluster ^
    --service-namespace elasticache ^
    --scalable-dimension elasticache:replication-group:Replicas ^
```

**API**

要删除 ElastiCache for Valkey and Redis OSS 集群的扩缩策略，请使用具有以下参数的 [DeleteScalingPolicy](https://docs.amazonaws.cn/ApplicationAutoScaling/latest/APIReference/API_DeleteScalingPolicy.html) Application Auto Scaling API 操作：
+ PolicyName – 扩展策略的名称。
+ ResourceID – 集群的资源标识符。对于该参数，资源类型为 ReplicationGroup，唯一标识符为集群的名称，例如 `replication-group/myscalablecluster`。
+ ServiceNamespace – 将此值设置为 elasticache。
+ ScalableDimension – 将此值设置为 `elasticache:replication-group:Replicas`。

在以下示例中，您将使用 Application Auto Scaling API 从名为 `myscalablecluster` 的集群中删除名为 `myscalablepolicy` 的目标跟踪扩缩策略。

```
POST / HTTP/1.1
>>>>>>> mainline
Host: autoscaling.us-east-2.amazonaws.com
Accept-Encoding: identity
Content-Length: 219
X-Amz-Target: AnyScaleFrontendService.DeleteScalingPolicy
X-Amz-Date: 20160506T182145Z
User-Agent: aws-cli/1.10.23 Python/2.7.11 Darwin/15.4.0 botocore/1.4.8
Content-Type: application/x-amz-json-1.1
Authorization: AUTHPARAMS
{
    "PolicyName": "myscalablepolicy",
    "ServiceNamespace": "elasticache",
    "ResourceId": "replication-group/myscalablecluster",
    "ScalableDimension": "elasticache:replication-group:Replicas"
}
```

# 将 Amazon CloudFormation 用于 Auto Scaling 策略
<a name="AutoScaling-with-Cloudformation"></a>

此代码段演示如何使用 [AWS::ApplicationAutoScaling::ScalableTarget](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html) 资源创建计划操作并将其应用于 [AWS::ElastiCache::ReplicationGroup](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html) 资源。此示例利用 [Fn::Join](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html) 和 [Ref](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) 内置函数，使用在同一模板中指定的 `AWS::ElastiCache::ReplicationGroup` 资源的逻辑名称来构建 `ResourceId` 属性。

```
ScalingTarget:
   Type: 'AWS::ApplicationAutoScaling::ScalableTarget'
   Properties:
     MaxCapacity: 0
     MinCapacity: 0
     ResourceId: !Sub replication-group/${logicalName}
     ScalableDimension: 'elasticache:replication-group:Replicas'
     ServiceNamespace: elasticache
     RoleARN: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/elasticache.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ElastiCacheRG"

  ScalingPolicy:
    Type: "AWS::ApplicationAutoScaling::ScalingPolicy"
    Properties:
      ScalingTargetId: !Ref ScalingTarget
      ServiceNamespace: elasticache
      PolicyName: testpolicy
      PolicyType: TargetTrackingScaling
      ScalableDimension: 'elasticache:replication-group:Replicas'
      TargetTrackingScalingPolicyConfiguration:
        PredefinedMetricSpecification:
          PredefinedMetricType: ElastiCacheReplicaEngineCPUUtilization
        TargetValue: 40
```

# 计划扩展
<a name="AutoScaling-with-Scheduled-Scaling-Replicas"></a>

按计划扩展使您可以按照可预测的需求变化来扩展应用程序。要使用计划扩缩，您需要创建计划操作，用于告知 ElastiCache for Valkey and Redis OSS 在特定时间执行扩缩活动。创建计划操作时，您需要指定现有的 ElastiCache 集群、执行扩缩活动的时间、最小容量和最大容量。您可以创建仅扩展一次或按重复计划扩展的计划操作。

 您只能为已存在的 ElastiCache 集群创建计划操作。您不能在创建集群的同时创建计划操作。

有关计划操作创建、管理和删除的相关术语的详细信息，请参阅[计划操作创建、管理和删除的常用命令](https://docs.amazonaws.cn/autoscaling/application/userguide/application-auto-scaling-scheduled-scaling.html#scheduled-scaling-commonly-used-commands) 

**创建一次性计划操作：**

类似于分区维度。请参阅[计划扩展](AutoScaling-with-Scheduled-Scaling-Shards.md)。

**删除计划操作**

类似于分区维度。请参阅[计划扩展](AutoScaling-with-Scheduled-Scaling-Shards.md)。

**使用 Amazon CLI 管理计划扩展**

使用以下 application-autoscaling API：
+ [put-scheduled-action](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/put-scheduled-action.html) 
+ [describe-scheduled-actions](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/describe-scheduled-actions.html) 
+ [delete-scheduled-action](https://docs.amazonaws.cn/cli/latest/reference/application-autoscaling/delete-scheduled-action.html) 

## 使用 Amazon CloudFormation 创建弹性伸缩策略
<a name="AutoScaling-with-Cloudformation-Update-Action"></a>

此代码段演示如何使用 [AWS::ApplicationAutoScaling::ScalableTarget](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-applicationautoscaling-scalabletarget.html) 资源创建计划操作并将其应用于 [AWS::ElastiCache::ReplicationGroup](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html) 资源。此示例利用 [Fn::Join](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html) 和 [Ref](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) 内置函数，使用在同一模板中指定的 `AWS::ElastiCache::ReplicationGroup` 资源的逻辑名称来构建 `ResourceId` 属性。

```
ScalingTarget:
   Type: 'AWS::ApplicationAutoScaling::ScalableTarget'
   Properties:
     MaxCapacity: 0
     MinCapacity: 0
     ResourceId: !Sub replication-group/${logicalName}
     ScalableDimension: 'elasticache:replication-group:Replicas'
     ServiceNamespace: elasticache
     RoleARN: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/elasticache.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ElastiCacheRG"
     ScheduledActions:
       - EndTime: '2020-12-31T12:00:00.000Z'
         ScalableTargetAction:
           MaxCapacity: '5'
           MinCapacity: '2'
         ScheduledActionName: First
         Schedule: 'cron(0 18 * * ? *)'
```

# 修改集群模式
<a name="modify-cluster-mode"></a>

Valkey 或 Redis OSS 是一种分布式内存数据库，支持分片和复制。ElastiCache（兼容 Valkey 或 Redis OSS）集群是分布式实现，它允许在多个节点间对数据进行分区。ElastiCache for Redis OSS 集群有两种操作模式：“已启用集群模式”（CME）和“已禁用集群模式”（CMD）。在 CME 中，Valkey 和 Redis OSS 引擎充当具有多个分片和节点的分布式数据库，而在 CMD 中，Valkey 和 Redis OSS 充当单个节点。

从 CMD 迁移到 CME 之前，必须满足以下条件：

**重要**  
集群模式配置只能从“已禁用集群模式”更改为“已启用集群模式”。无法还原此配置。
+ 集群只能在数据库 0 中拥有密钥。
+ 应用程序必须使用能够使用集群协议的 Valkey 或 Redis OSS 客户端，并使用配置端点。
+ 必须在至少有 1 个副本的集群上启用自动失效转移。
+ 迁移所需的最低引擎版本为 Valkey 7.2 及更高版本，或 Redis OSS 7.0 及更高版本。

要从 CMD 迁移到 CME，必须将集群模式配置从“已禁用集群模式”更改为“已启用集群模式”。这是一个两步过程，可确保迁移过程中集群的可用性。

**注意**  
您需要为参数组提供已启用集群的配置，也就是说，cluster-enabled 参数设置为 `yes`。如果您使用的是原定设置参数组，则 ElastiCache for Redis OSS 将自动选择具有已启用集群的配置的相应原定设置参数组。对于 CMD 集群，cluster-enabled 参数值设置为 `no`。当集群移至兼容模式时，作为修改操作的一部分，cluster-enabled 参数值将更新为 `yes`。  
有关更多信息，请参阅 [使用 ElastiCache 参数组配置引擎参数](ParameterGroups.md)。

1. **准备** – 创建一个测试 CME 集群，并确保您的堆栈已准备好使用它。ElastiCache for Redis OSS 无法验证您是否准备就绪。有关更多信息，请参阅 [创建 Valkey 或 Redis OSS 集群](Clusters.Create.md)。

1. **将现有 CMD 集群配置修改为“与集群模式兼容”**– 在此模式下，将部署单个分片，ElastiCache for Redis OSS 既可以用作单个节点，也可以用作单个分片集群。兼容模式意味着客户端应用程序可以使用任一协议与集群通信。在此模式下，必须重新配置应用程序才能开始使用 Valkey 或 Redis OSS 集群协议和配置端点。要将 Valkey 或 Redis OSS 集群模式更改为“与集群模式兼容”，请执行以下步骤：
**注意**  
在兼容模式下，不允许对集群执行其他修改操作，例如扩缩和引擎版本。此外，在 [ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html) 请求中定义集群模式参数时，无法修改参数（不包括 `cacheParameterGroupName`）。

   1. 使用 Amazon Web Services 管理控制台时，请参阅[修改复制组](Replication.Modify.md)并将集群模式设置为**兼容**

   1. 使用 API，请参阅 [ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html) 并将 `ClusterMode` 参数更新为 `compatible`。

   1. 使用 Amazon CLI，请参阅 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html) 并将 `cluster-mode` 参数更新为 `compatible`。

   将 Valkey 或 Redis OSS 集群模式更改为“与集群模式兼容”后，[DescribeReplicationGroups](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html) API 将返回 ElastiCache for Redis OSS 集群配置端点。集群配置端点是应用程序可以用来连接到集群的单个端点。有关更多信息，请参阅 [查找 ElastiCache 中的缓存连接端点](Endpoints.md)。

1. **将集群配置修改为“已启用集群模式”** - 在将集群模式设置为“与集群模式兼容”后，第二步是将集群配置修改为“已启用集群模式”。在此模式下，单个分片正在运行，客户现在可以扩缩其集群或修改其他集群配置。

   要将集群模式更改为已启用，请执行以下步骤：

   开始之前，请确保您的 Valkey 或 Redis OSS 客户端已迁移到使用集群协议，并且集群的配置端点未在使用中。

   1. 使用 Amazon Web Services 管理控制台时，请参阅[修改复制组](Replication.Modify.md)并将集群模式设置为**已启用**。

   1. 使用 API，请参阅 [ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html) 并将 `ClusterMode` 参数更新为 `enabled`。

   1. 使用 Amazon CLI，请参阅 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html) 并将 `cluster-mode` 参数更新为 `enabled`。

   在将集群模式更改为已启用后，端点将按照 Valkey 或 Redis OSS 集群规范进行配置。[DescribeReplicationGroups](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html) API 将返回集群模式参数（值为 `enabled`）和现在可供应用程序用于连接到集群的集群端点。

   请注意，一旦集群模式更改为已启用，集群端点就会发生变化。请确保使用新端点更新您的应用程序。

您也可以选择从“与集群模式兼容”恢复为“已禁用集群模式”（CMD）并保留原始配置。

**将集群配置从“与集群模式兼容”修改为“已禁用集群模式”**

1. 使用 Amazon Web Services 管理控制台时，请参阅[修改复制组](Replication.Modify.md)并将集群模式设置为**已禁用**

1. 使用 API，请参阅 [ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html) 并将 `ClusterMode` 参数更新为 `disabled`。

1. 使用 Amazon CLI，请参阅 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html) 并将 `cluster-mode` 参数更新为 `disabled`。

将集群模式更改为已禁用后，[DescribeReplicationGroups](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html) API 会将集群模式参数返回为 `disabled`。

# 使用全球数据存储跨Amazon区域复制
<a name="Redis-Global-Datastore"></a>

**注意**  
全局数据存储目前仅适用于基于节点的集群。

通过使用全球数据存储功能，您可以跨区域进行完全托管、快速、可靠和安全的 Valkey 或 Redis OSS 集群复制。Amazon使用此功能，您可以创建跨区域只读副本集群，以实现跨Amazon区域的低延迟读取和灾难恢复。

在以下部分中，您可以找到有关如何使用全局数据存储的说明。

**Topics**
+ [

## 概述
](#Redis-Global-Data-Stores-Overview)
+ [

# 先决条件和限制
](Redis-Global-Datastores-Getting-Started.md)
+ [

# 使用全局数据存储（控制台）
](Redis-Global-Datastores-Console.md)
+ [

# 使用全局数据存储 (CLI)
](Redis-Global-Datastores-CLI.md)

## 概述
<a name="Redis-Global-Data-Stores-Overview"></a>

每个*全局数据存储* 是一个或多个相互复制的集群的集合。

全局数据存储包含以下项：
+ **主（主动）集群** – 主集群接受复制到全局数据存储中的所有集群的写入。主集群也接受读取请求。
+ **辅助（被动）集群** – 辅助集群仅接受读取请求并从主集群复制数据更新。辅助群集必须与主群集位于不同的Amazon区域。

在中 ElastiCache 为 Valkey 或 Redis OSS 创建全局数据存储时，它会自动将您的数据从主集群复制到辅助集群。您可以选择应复制 Valkey 或 Redis OSS 数据的Amazon区域，然后在该区域中创建辅助集群。Amazon ElastiCache 然后设置并管理两个集群之间数据的自动、异步复制。

为 Valkey 或 Redis OSS 使用全局数据存储具有以下优势：
+ **地理本地性能**-通过在其他Amazon区域设置远程副本集群并在它们之间同步数据，可以减少该Amazon区域的数据访问延迟。全球数据存储可以通过提供跨区域的低延迟地理本地读取来帮助提高应用程序的响应能力。Amazon
+ **灾难恢复** – 如果全局数据存储中的主集群出现性能降级，则可以将辅助集群提升为新的主集群。您可以通过连接到任何包含辅助群集的Amazon区域来实现此目的。

下图显示了全局数据存储的工作方式。

![\[全局数据存储\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/Global-DataStore.png)


# 先决条件和限制
<a name="Redis-Global-Datastores-Getting-Started"></a>

开始使用全局数据存储之前，请注意以下事项：
+ 以下Amazon 区域支持全局数据存储：
  + **非洲** - 开普敦
  + **亚太地区** - 香港、海得拉巴、雅加达、马来西亚、墨尔本、孟买、大阪、首尔、新加坡、悉尼、泰国和东京 
  + **加拿大** - 加拿大（中部）和加拿大西部（卡尔加里）
  + **中国**- 北京和宁夏
  + **欧洲** - 法兰克福、伦敦、爱尔兰、米兰、巴黎、西班牙、斯德哥尔摩和苏黎世
  + **AmazonGovCloud** - 美国西部和美国东部
  + **以色列** - 特拉维夫
  + **中东** - 巴林和阿联酋
  + **美国** - 东部（弗吉尼亚州北部和俄亥俄州）和美国西部（北加利福尼亚和俄勒冈州）
  + **南美洲** - 墨西哥（中部）和圣保罗
+  全局数据存储中的所有集群（主集群和辅助集群）应具有相同数量的主节点、节点类型、引擎版本和分区数（如果启用了集群模式）。全局数据存储中的每个集群可以有不同数量的读取副本，以适应该集群本地的读取流量。

  如果您计划使用现有的单节点集群，则必须启用复制。
+ 大型及以上大小的实例支持全局数据存储。
+ 您可以设置从一个 Amazon 区域中的主集群复制到最多两个其他 Amazon 区域中的辅助集群。
**注意**  
中国（北京）区域和中国（宁夏）区域除外，只能在这两个区域之间进行复制。
+ 您只能在 VPC 集群中使用全局数据存储。有关更多信息，请参阅 [用于访问 Amazon VPC 中的 ElastiCache 缓存的访问模式](elasticache-vpc-accessing.md)。使用 EC2-Classic 时，不支持全局数据存储。有关更多信息，请参阅《Amazon EC2 用户指南》**中的 [EC2-Classic](https://docs.amazonaws.cn//AWSEC2/latest/UserGuide/ec2-classic-platform.html)。
**注意**  
目前，无法在 [将 Local Zones 与 ElastiCache 结合使用](Local_zones.md) 中使用全局数据存储。
+ ElastiCache 不支持从一个 Amazon 区域到另一个区域的自动故障转移。如果需要，您可以手动提升辅助集群。有关示例，请参阅[将辅助集群提升为主集群](Redis-Global-Datastores-Console.md#Redis-Global-Datastores-Console-Promote-Secondary)。
+ 要从现有数据引导，请使用现有集群作为主集群来创建全局数据存储。我们不支持将现有集群添加为辅助集群。将集群添加为辅助集群的过程会擦除数据，这可能会导致数据丢失。
+ 当您修改属于全局数据存储的某个集群的本地参数组时，参数更新应用于所有集群。
+ 您可以垂直（向上扩展和向下扩展）和水平扩展（向内扩展和向外扩展）区域集群。您可以通过修改全局数据存储来扩展集群。然后，全局数据存储中的所有区域集群都会在不中断的情况下扩展。有关更多信息，请参阅 [缩放 ElastiCache](Scaling.md)。
+ 全局数据存储支持[静态加密](at-rest-encryption.md)、[传输中加密](in-transit-encryption.md)和 [AUTH](auth.md)。
+ 全局数据存储不支持 Internet 协议版本 6（IPv6）。
+  全局数据存储支持 Amazon KMS 密钥。有关更多信息，请参阅 *Amazon Key Management Service 开发人员指南*中的 [Amazon 密钥管理服务概念](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#master_keys)。

**注意**  
全局数据存储支持[发布/订阅消息收发](https://docs.amazonaws.cn/AmazonElastiCache/latest/red-ug/elasticache-use-cases.html#elasticache-for-redis-use-cases-messaging)，且具有以下规定：  
如已禁用集群模式，则完全支持发布/订阅。在主 Amazon 区域的主集群上发布的事件会传播到辅助 Amazon 区域。
如已启用集群模式，则以下情况适用：  
对于不在键空间中的已发布事件，只有同一 Amazon 区域中的订阅者才会收到事件。
对于已发布的键空间事件，所有 Amazon 区域中的订阅者都会接收事件。

# 使用全局数据存储（控制台）
<a name="Redis-Global-Datastores-Console"></a>

要使用控制台创建全局数据存储，请遵循以下两步过程：

1. 通过使用现有集群或创建新集群来创建主集群。引擎必须是 Valkey 7.2 或更高版本，或者是 Redis OSS 5.0.6 或更高版本。

1. 在不同 Amazon 区域中添加最多两个辅助集群（也必须使用 Valkey 7.2 或更高版本或者是 Redis 5.0.6 或更高版本）。

以下过程指导您如何为 Valkey 或 Redis OSS 创建全局数据存储以及使用 ElastiCache 控制台执行其他操作。

**Topics**
+ [

## 使用现有集群创建全局数据存储
](#Redis-Global-Datastores-Console-Create-Primary)
+ [

## 使用新主集群创建新的全局数据存储
](#Redis-Global-Datastores-Create-From-Scratch)
+ [

## 查看全局数据存储详细信息
](#Redis-Global-Datastores-Console-Details)
+ [

## 将区域添加到全局数据存储
](#Redis-Global-Datastores-Console-Create-Secondary)
+ [

## 修改全局数据存储
](#Redis-Global-Datastores-Console-Modify-Regional-Clusters)
+ [

## 将辅助集群提升为主集群
](#Redis-Global-Datastores-Console-Promote-Secondary)
+ [

## 从全局数据存储中删除区域
](#Redis-Global-Datastore-Console-Remove-Region)
+ [

## 删除全局数据存储
](#Redis-Global-Datastores-Console-Delete-GlobalDatastore)

## 使用现有集群创建全局数据存储
<a name="Redis-Global-Datastores-Console-Create-Primary"></a>

在这种情况下，使用现有集群作为新全局数据存储的主集群。然后，您可以在单独的 Amazon 区域中创建辅助只读集群。此辅助集群接收来自主集群的自动和异步更新。

**重要**  
现有集群必须使用 Valkey 7.2 或更高版本，或者使用 Redis OSS 5.0.6 或更高版本。

**使用现有集群创建全局数据存储**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**，然后选择**创建全局数据存储**。

1. 在**主集群设置**页面上，执行以下操作：
   + 在**全局数据存储信息**字段中，输入新的全局数据存储的名称。
   + （可选）输入 **Description（描述）**值。

1. 在**区域集群**下，选择**使用现有区域集群**。

1. 在**现有集群**下，选择要使用的现有集群。

1. 使以下选项保持不变。它们会预先填入以匹配主集群配置，您无法对其进行更改。
   + 引擎版本
   + 节点类型
   + 参数组
**注意**  
ElastiCache 根据提供的参数组的值自动生成新参数组，并将新参数组应用于集群。使用这个新参数组修改全局数据存储上的参数。每个自动生成的参数组与一个（且只有一个）集群关联，因此只有一个全局数据存储。
   + 分片数量
   + 静态加密 – 对磁盘上存储的数据启用加密。有关更多信息，请参阅[静态加密](at-rest-encryption.md)。
**注意**  
您可以通过选择 **Customer Managed Amazon KMS key（客户托管式 Amazon KMS 密钥）**并选择该密钥来提供不同的加密密钥。有关更多信息，请参阅[使用客户托管式 Amazon KMS 密钥](at-rest-encryption.md#using-customer-managed-keys-for-elasticache-security)。
   + 传输中加密 – 对传输中的数据启用加密。有关更多信息，请参阅[传输中加密](in-transit-encryption.md)。对于 Valkey 7.2 及更高版本或 Redis OSS 6.0 及更高版本，如果您启用了传输中加密，则系统会提示您指定以下**访问控制**选项中的一个：
     + **No Access Control（无访问控制）**– 此选项为默认设置。表示无任何限制。
     + **User Group Access Control List（用户组访问控制列表）**– 选择具有对可用操作定义有用户集和权限的用户组。有关更多信息，请参阅 [使用控制台和 CLI 管理用户组](Clusters.RBAC.md#User-Groups)。
     + **Redis AUTH 默认用户** – Valkey 或 Redis OSS 服务器的身份验证机制。有关更多信息，请参阅 [AUTH](auth.md)。

1. （可选）根据需要更新剩余的辅助集群设置。这些设置会预先填入与主集群相同的值，但您可以对其进行更新，以满足该集群的特定要求。
   + 端口
   + 副本数量
   + 子网组
   + 首选可用区
   + 安全组
   + 客户托管式（Amazon KMS 密钥）
   + AUTH 令牌
   + 启用自动备份
   + 备份保留期
   + 备份时段
   + 维护时段
   + SNS 主题通知

1. 选择**创建**。这样做会将全局数据存储的状态设置为 **Creating（正在创建）**。在主集群与全局数据存储关联且辅助集群处于 **Associating（正在关联）**状态后，状态将转换为 **Modifying（正在修改）**。

   主集群和辅助集群与全局数据存储关联后，状态会更改为 **Available（可用）**。此时，您有一个接受读取和写入的主集群和接受从主集群复制的读取数据的辅助集群。

   页面更新为指示集群是否属于全局数据存储，包括：
   + **Global Datastore（全局数据存储）**– 集群所属的全局数据存储的名称。
   + **Global Datastore Role（全局数据存储角色）**– 主集群或辅助集群的角色。

在不同的 Amazon 区域中最多可以添加一个额外的辅助集群。有关更多信息，请参阅 [将区域添加到全局数据存储](#Redis-Global-Datastores-Console-Create-Secondary)。

## 使用新主集群创建新的全局数据存储
<a name="Redis-Global-Datastores-Create-From-Scratch"></a>

如果选择使用新集群创建全局数据存储，请按照以下过程操作。

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**，然后选择**创建全局数据存储**。

1. 在 **Primary cluster settings**（主集群设置）中，执行以下操作：

   1. 对于 **Cluster mode**（集群模式），选择 **Enabled**（已启用）或 **Disabled**（已禁用）。

   1. 针对 **Global Datastore info**（全局数据存储信息），为 **Name**（名称）输入一个值。ElastiCache 使用后缀为全局数据存储生成唯一名称。您可以使用在此处指定的后缀搜索全局数据存储。

   1. （可选）为 **Global Datastore Description（全局数据存储描述）**输入一个值。

1. 在 **Regional cluster**（区域集群）中：

   1. 对于 **Region**（区域），选择一个可用的 Amazon 区域。

   1. 选择 **Create new regional cluster**（创建新的区域集群）或 **Use existing regional cluster**（使用现有的区域集群）

   1. 如果选择 **Create new regional cluster**（创建新的区域集群），在 **Cluster info**（集群信息）下，输入集群的名称和可选描述。

   1. 在 **Location**（位置）下，我们建议您接受 **Multi-AZ**（多可用区）和 **Auto-failover**（自动失效转移）的默认设置。

1. 在 **Cluster settings**（集群设置）下

   1. 对于 **Engine version**（引擎版本），选择 5.0.6 或更高版本。

   1. 对于 **Port**（端口），使用默认端口 6379。如果您出于某个原因需要使用其他端口，请输入相应的端口号。

   1. 对于**参数组**，选择一个参数组或创建一个新参数组。参数组控制集群的运行时参数。有关参数组的更多信息，请参阅[Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis) 和[创建 ElastiCache 参数组](ParameterGroups.Creating.md)。
**注意**  
当您选择要设置引擎配置值的参数组时，该参数组将应用于全局数据存储中的所有集群。在 **Parameter Groups（参数组）**页面上，是/否 **Global（全局）**属性指示参数组是否属于全局数据存储。

   1. 对于 **Node type（节点类型）**，请选择向下箭头（![\[Downward-pointing triangle icon, typically used to indicate a dropdown menu.\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-DnArrow.png)）。在 **Change node type（更改节点类型）**对话框中，为所需节点类型选择 **Instance family（实例系列）**值。接着选择要用于此集群的节点类型，然后选择**保存**。

      有关更多信息，请参阅 [选择节点大小](CacheNodes.SelectSize.md)。

      如果您选择 r6gd 节点类型，则系统会自动启用数据分层。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

   1. 如果您要创建 Valkey 或 Redis OSS（已禁用集群模式）集群：

      对于 **Number of replicas**（副本数量），为此集群选择所需的副本数。

   1. 如果您要创建 Valkey 或 Redis OSS（已启用集群模式）集群：

      1. 对于**分片数**，选择要用于此 Valkey 或 Redis OSS（已启用集群模式）集群的分片（分区/节点组）数。

         对于某些版本的 Valkey 或 Redis OSS（已启用集群模式），您可以动态更改集群中的分片数量：
         + **Redis OSS 3.2.10 及更高版本** – 如果您的集群运行 Redis OSS 3.2.10 或更高版本，则可以动态更改集群中的分片数量。有关更多信息，请参阅 [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)。
         + **其他 Redis OSS 版本** – 如果您的集群正在运行 3.2.10 版之前的 Redis OSS 版本，则还有另一种方法。在这种情况下，要更改集群中的分片数量，请使用新分片数量创建一个新集群。有关更多信息，请参阅 [从备份还原到新缓存](backups-restoring.md)。

      1. 对于**每个分片的副本数量**，请选择每个分片中需要的只读副本节点数。

         Valkey 或 Redis OSS（已启用集群模式）存在以下限制。
         + 如果启用了多可用区，请确保每个分片至少有一个副本。
         + 使用控制台创建集群时，每个分片的副本数相同。
         + 每个分片的只读副本数固定，无法更改。如果您需要增加或减少各分片（API/CLI：节点组）的副本数，您必须使用新的副本数量创建一个新集群。有关更多信息，请参阅 [教程：使用外部创建的备份为新的基于节点的集群制作种子](backups-seeding-redis.md)。

1. 对于 **Subnet group settings**（子网组设置），选择要应用到该集群的子网。ElastiCache 提供了一个默认 IPv4 子网组，或者您可以选择创建一个新的 IPv4 子网组。对于 IPv6，您需要创建一个带有 IPv6 CIDR 块的子网组。如果您选择**双堆栈**，则必须选择发现 IP 类型，即 IPv6 或 IPv4。

   有关更多信息，请参阅[在 VPC 中创建子网](https://docs.amazonaws.cn/vpc/latest/userguide/working-with-vpcs.html#AddaSubnet)。

1. 对于 **Availability zone placements**（可用区位置），您有两种选择：
   + **No preference（无首选项）**– 由 ElastiCache 选择可用区。
   + **Specify availability zones（指定可用区）**– 您为各集群指定可用区。

     如果您选择指定可用区，则需从列表中为各分片中的每个集群选择可用区。

   有关更多信息，请参阅 [为 ElastiCache 选择区域和可用区](RegionsAndAZs.md)。  
![\[图像：指定键空间和可用区\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-ClusterOn-Slots-AZs.png)

   *指定键空间和可用区*

1. 选择 **Next**（下一步）

1. 在**高级 Valkey 和 Redis OSS 设置**下

   1. 对于 **Security**（安全）：

     1. 要加密您的数据，您有以下选项：
        + **Encryption at rest（静态加密）**– 对磁盘上存储的数据启用加密。有关更多信息，请参阅[静态加密](at-rest-encryption.md)。
**注意**  
您可以通过选择 **Customer Managed Amazon KMS key（客户自主管理型 Amazon KMS key）**并选择该密钥来提供不同的加密密钥。有关更多信息，请参阅[使用 Amazon KMS 客户自主管理型密钥](at-rest-encryption.md#using-customer-managed-keys-for-elasticache-security)。
        + **Encryption in-transit（传输中加密）**– 对传输中数据启用加密。有关更多信息，请参阅[传输中加密](in-transit-encryption.md)。对于 Valkey 7.2 及更高版本或 Redis OSS 6.0 及更高版本，如果您启用了传输中加密，则系统会提示您指定以下**访问控制**选项中的一个：
          + **No Access Control（无访问控制）**– 此选项为默认设置。这表示对用户访问集群的权限没有任何限制。
          + **User Group Access Control List（用户组访问控制列表）**– 选择具有集群访问权限的已定义用户组。有关更多信息，请参阅 [使用控制台和 CLI 管理用户组](Clusters.RBAC.md#User-Groups)。
          + **Redis AUTH 默认用户** – Valkey 或 Redis OSS 服务器的身份验证机制。有关更多信息，请参阅 [AUTH](auth.md)。
        + **AUTH** – Valkey 或 Redis OSS 服务器的身份验证机制。有关更多信息，请参阅 [AUTH](auth.md)。
**注意**  
对于 Redis OSS 3.2.6 及更高版本（版本 3.2.10 除外），只能选择 AUTH。

     1. 对于**安全组**，选择要用于该集群的安全组。*安全组* 充当防火墙来控制对集群的网络访问。您可以为 VPC 使用默认安全组或创建新安全组。

        有关安全组的更多信息，请参阅 *Amazon VPC 用户指南*中的[您的 VPC 的安全组](https://docs.amazonaws.cn/vpc/latest/userguide/VPC_SecurityGroups.html)。

1. 如果需要定期计划自动备份，请选择**启用自动备份**，然后输入每个自动备份在被自动删除前保留的天数。如果您不希望定期计划自动备份，请清除 **Enable automatic backups** 复选框。不论是哪种情况，您始终可以选择创建手动备份。

   有关备份和还原的更多信息，请参阅[快照和还原](backups.md)。

1. （可选）指定维护时段。*maintenance window（维护时段）*是每周 ElastiCache 为您的集群计划系统维护的时间，通常以小时为时间长度。您可以允许 ElastiCache 选择维护时段的日期和时间 [*No preference*（无首选项）]，或者自行选择日期、时间和持续时间 [*Specify maintenance window*（指定维护时段）]。如果您从列表中选择了*指定维护时段*，请为您的维护时段选择*开始日期*、*开始时间*和*持续时间*（以小时为单位）。所有时间均为 UCT 时间。

   有关更多信息，请参阅 [管理 ElastiCache 集群维护](maintenance-window.md)。

1. （可选）对于 **Logs（日志）**：
   + 在 **Log format（日志格式）**下，选择 **Text（文本）**或 **JSON**。
   + 在 **Destination Type**（目标类型）下，选择 **CloudWatch Logs** 或 **Kinesis Firehose**。
   + 在**日志目标**下，选择**新建**，然后输入您的 CloudWatch Logs 日志组名称或 Firehose 流名称，或选择**选择现有**，然后选择您的 CloudWatch Logs 日志组名称或您的 Firehose 流名称，

1. 对于 **Tags**（标签），为了帮助您管理集群和其他 ElastiCache 资源，您可以标签的形式为每个资源分配您自己的元数据。有关更多信息，请参阅 [为资源添加 ElastiCache 标签](Tagging-Resources.md)。

1. 查看您的所有输入和选择，然后进行任意所需的更正。准备就绪后，选择 **Next**（下一步）。

1. 在前面步骤中配置集群后，您现在可以配置辅助集群详细信息。

1. 在 **Regional cluster**（区域集群）下，选择集群所在的 Amazon 区域。

1. 在 **Cluster info**（集群信息）下，输入集群的名称和可选描述。

1. 以下选项已预先填入以匹配主集群配置，且无法更改：
   + 位置
   + 引擎版本
   + 实例类型
   + 节点类型
   + 分片数量
   + 参数组
**注意**  
ElastiCache 根据提供的参数组的值自动生成新参数组，并将新参数组应用于集群。使用这个新参数组修改全局数据存储上的参数。每个自动生成的参数组与一个（且只有一个）集群关联，因此只有一个全局数据存储。
   + 静态加密 – 对磁盘上存储的数据启用加密。有关更多信息，请参阅[静态加密](at-rest-encryption.md)。
**注意**  
您可以通过选择 **Customer Managed Amazon KMS key（客户托管式 Amazon KMS 密钥）**并选择该密钥来提供不同的加密密钥。有关更多信息，请参阅[使用客户托管式 Amazon KMS 密钥](at-rest-encryption.md#using-customer-managed-keys-for-elasticache-security)。
   + 传输中加密 – 对传输中的数据启用加密。有关更多信息，请参阅[传输中加密](in-transit-encryption.md)。对于 Valkey 7.2 及更高版本或 Redis OSS 6.4 及更高版本，如果您启用了传输中加密，则系统会提示您指定以下**访问控制**选项中的一个：
     + **No Access Control（无访问控制）**– 此选项为默认设置。这表示对用户访问集群的权限没有任何限制。
     + **User Group Access Control List（用户组访问控制列表）**– 选择具有集群访问权限的已定义用户组。有关更多信息，请参阅 [使用控制台和 CLI 管理用户组](Clusters.RBAC.md#User-Groups)。
     + **Redis AUTH 默认用户** – Valkey 或 Redis OSS 服务器的身份验证机制。有关更多信息，请参阅 [AUTH](auth.md)。
**注意**  
对于介于 4.0.2 和 6.0.4 之间的 Redis OSS 版本，当第一次支持传输中加密时，AUTH 是唯一的选择。

   剩下的辅助集群设置会预先填入与主集群相同的值，但您可以更新以下值来满足对该集群的特定要求：
   + 端口
   + 副本数量
   + 子网组
   + 首选可用区 
   + 安全组
   + 客户托管式（Amazon KMS 密钥） 
   + AUTH 令牌
   + 启用自动备份
   + 备份保留期
   + 备份时段
   + 维护时段
   + SNS 主题通知

1. 选择**创建**。这会将全局数据存储的状态设置为 **Creating（正在创建）**。主集群和辅助集群与全局数据存储关联后，状态会更改为 **Available（可用）**。您有一个接受读取和写入的主集群和接受从主集群复制的读取数据的辅助集群。

   页面也会更新为指示集群是否属于全局数据存储，包括以下项：
   + **Global Datastore（全局数据存储）**– 集群所属的全局数据存储的名称。
   + **Global Datastore Role（全局数据存储角色）**– 主集群或辅助集群的角色。

在不同的 Amazon 区域中最多可以添加一个额外的辅助集群。有关更多信息，请参阅 [将区域添加到全局数据存储](#Redis-Global-Datastores-Console-Create-Secondary)。

## 查看全局数据存储详细信息
<a name="Redis-Global-Datastores-Console-Details"></a>

您可以查看现有全局数据存储的详细信息，也可以在**全局数据存储**页面上对其进行修改。

**查看全局数据存储详细信息**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**，然后选择可用的全局数据存储。

然后，您可以检查以下全局数据存储属性：
+ **全局数据存储名称：**全局数据存储的名称
+ **描述：**全局数据存储的描述
+ **状态：**选项包括：
  + 创建
  + 修改
  + 可用
  + Deleting（正在删除）
  + 仅主集群 - 此状态表示全局数据存储仅包含主集群。所有辅助集群均已删除，或者未成功创建。
+ **集群模式：**启用或禁用
+ **引擎版本：**运行全局数据存储的 Valkey 或 Redis OSS 引擎版本
+ **实例节点类型：**全局数据存储所用的节点类型
+ **静态加密：**启用或禁用
+ **传输中加密：**启用或禁用
+ **AUTH：**启用或禁用

您可以对全局数据存储进行以下更改：
+ [将区域添加到全局数据存储](#Redis-Global-Datastores-Console-Create-Secondary) 
+ [从全局数据存储中删除区域](#Redis-Global-Datastore-Console-Remove-Region) 
+ [将辅助集群提升为主集群](#Redis-Global-Datastores-Console-Promote-Secondary)
+ [修改全局数据存储](#Redis-Global-Datastores-Console-Modify-Regional-Clusters)

“Global Datastore（全局数据存储）”页面还列出组成全局数据存储的各个集群以及每个集群的以下属性：
+ **Region（区域）**– 存储集群的 Amazon 区域
+ **Role（角色）**- 主集群或辅助集群
+ **Cluster name（集群名称）**- 集群的名称
+ **Status（状态）**- 选项包括：
  + **Associating（正在关联）**- 集群正在关联到全局数据存储
  + **Associated（已关联）**- 集群已与全局数据存储关联
  + **Disassociating（正在解除关联）**- 使用全局数据存储名称从全局数据存储中删除辅助集群的过程。此操作结束后，辅助集群不再接收来自主集群的更新，但它仍为该 Amazon 区域中的独立集群。
  + **Disassociated（已取消关联）**– 辅助集群已从全局数据存储中删除，现为其 Amazon 区域中的独立集群。
+ **Global Datastore Replica lag（全局数据存储副本滞后）**– 显示全局数据存储中每个辅助 Amazon 区域一个值。此为辅助区域的主节点与主区域的主节点之间的滞后。对于已启用集群模式的 Valkey 或 Redis OSS，滞后表示分片之间的最大延迟（以秒为单位）。

## 将区域添加到全局数据存储
<a name="Redis-Global-Datastores-Console-Create-Secondary"></a>

您最多可以向现有全局数据存储添加一个额外 Amazon 区域。在这种情况下，您将在单独的 Amazon 区域中创建只读集群，该集群接收来自主集群的自动和异步更新。

**将 Amazon 区域添加到全局数据存储**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**，然后选择现有的全局数据存储。

1. 选择**添加区域集群**，然后选择辅助集群所在的 Amazon 区域。

1. 在**集群信息**下面，输入集群的**名称**值和（可选）**描述**。

1. 使以下选项保持不变。它们会预先填入以匹配主集群配置，您无法对其进行更改。
   + 引擎版本
   + 实例类型
   + 节点类型
   + 分片数量
   + 参数组
**注意**  
ElastiCache 根据提供的参数组的值自动生成新参数组，并将新参数组应用于集群。使用这个新参数组修改全局数据存储上的参数。每个自动生成的参数组与一个（且只有一个）集群关联，因此只有一个全局数据存储。
   + 静态加密
**注意**  
您可以通过选择 **Customer Managed Amazon KMS key（客户托管式 Amazon KMS 密钥）**并选择该密钥来提供不同的加密密钥。
   + 传输中加密
   + AUTH

1. （可选）更新剩余的辅助集群设置。这些设置会预先填入与主集群相同的值，但您可以对其进行更新，以满足该集群的特定要求：
   + 端口
   + 副本数量
   + 子网组
   + 首选可用区
   + 安全组
   + 客户托管式（Amazon KMS 密钥） 
   + AUTH 令牌
   + 启用自动备份
   + 备份保留期
   + 备份时段
   + 维护时段
   + SNS 主题通知

1. 选择**添加**。

## 修改全局数据存储
<a name="Redis-Global-Datastores-Console-Modify-Regional-Clusters"></a>

您可以修改区域集群的属性。全局数据存储上只能进行一个修改操作，但将辅助集群提升为主集群除外。有关更多信息，请参阅 [将辅助集群提升为主集群](#Redis-Global-Datastores-Console-Promote-Secondary)。

**修改全局数据存储**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**，然后在**全局数据存储名称**下选择一个全局数据存储。

1. 选择 **Modify（修改）**并在以下选项中进行选择：
   + **Modify description（修改描述）**– 更新全局数据存储的描述
   + **修改引擎版本** – 只有 Valkey 7.2 及更高版本或 Redis OSS 5.0.6 及更高版本才可用。
   + **Modify node type（修改节点类型）**– 纵向（扩展和缩减）和横向（扩展和缩减）扩展区域集群。选项包括 R5 和 M5 节点系列。有关节点类型的更多信息，请参阅[受支持的节点类型](CacheNodes.SupportedTypes.md)。
   + **Modify Automatic Failover（修改自动故障转移）**– 启用或禁用自动故障转移。当您启用故障转移并且区域集群中的主节点意外关闭时，ElastiCache 会将故障转移到其中一个区域副本。有关更多信息，请参阅[自动故障转移](AutoFailover.md)。

   对于 Valkey 或 Redis OSS（已启用集群模式）集群：
   + **Add shards（添加分片）**– 输入要添加的分片数量，并有选择地指定一个或多个可用区。
   + **Delete shards（删除分片）**– 选择要在每个 Amazon 区域中删除的分片。
   + **Rebalance shards（重新平衡分片）**– 重新平衡插槽分配，以确保在集群中的现有分片之间均匀分配。

要修改全局数据存储的参数，请修改全局数据存储的任何成员集群的参数组。ElastiCache 会自动将此更改应用于该全局数据存储中的所有集群。若要修改该集群的参数组，请使用 Valkey 或 Redis OSS 控制台或 [ModifyCacheCluster](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyCacheCluster.html) API 操作。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。修改全局数据存储中包含的任何集群的参数组时，该参数组应用于该全局数据存储中的所有集群。

要重置整个参数组或特定参数，请使用 [ResetCacheParameterGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ResetCacheParameterGroup.html) API 操作。

## 将辅助集群提升为主集群
<a name="Redis-Global-Datastores-Console-Promote-Secondary"></a>

如果主集群或 Amazon 区域变得不可用或遇到性能问题，您可以将辅助集群提升为主集群。随时可进行提升，即使正在进行其他修改时也可以。您还可以并行进行多个提升，并且全局数据存储最终会解析为一个主集群。如果同时提升多个辅助集群，则 ElastiCache不保证哪个集群最终会解析为主集群。

**将辅助集群提升为主集群**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**。

1. 选择全局数据存储名称以查看详细信息。

1. 选择 **Secondary（辅助）**集群。

1. 选择 **Promote to primary（提升为主集群）**。

   然后，系统会提示您确认您的决定，并显示以下警告：` Promoting a region to primary will make the cluster in this region as read/writable. Are you sure you want to promote the secondary cluster to primary?`

   `The current primary cluster in primary region will become secondary and will stop accepting writes after this operation completes. Please ensure you update your application stack to direct traffic to the new primary region.`

1. 如果您希望继续提升，请选择 **Confirm（确认）**，如果您不希望继续提升，请选择 **Cancel（取消）**。

如果选择确认，则全局数据存储会转换为 **Modifying（正在修改）**状态，并且在提升完成之前不可用。

## 从全局数据存储中删除区域
<a name="Redis-Global-Datastore-Console-Remove-Region"></a>

您可以按照以下过程从全局数据存储中删除 Amazon 区域。

**从全局数据存储中删除 Amazon 区域**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**。

1. 选择一个全局数据存储。

1. 选择要删除的 **Region（区域）**。

1. 选择 **Remove region（删除区域）**。
**注意**  
此选项仅适用于辅助集群。

   然后，系统会提示您确认您的决定，并显示以下警告：` Removing the region will remove your only available cross region replica for the primary cluster. Your primary cluster will no longer be set up for disaster recovery and improved read latency in remote region. Are you sure you want to remove the selected region from the global datastore?`

1. 如果您希望继续提升，请选择 **Confirm（确认）**，如果您不希望继续提升，请选择 **Cancel（取消）**。

如果您选择确认，则会删除 Amazon 区域，且辅助集群不再接收复制更新。

## 删除全局数据存储
<a name="Redis-Global-Datastores-Console-Delete-GlobalDatastore"></a>

要删除全局数据存储，请先删除所有辅助集群。有关更多信息，请参阅 [从全局数据存储中删除区域](#Redis-Global-Datastore-Console-Remove-Region)。这样做会使全局数据存储处于 **primary-only（仅主集群）**状态。

**删除全局数据存储**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择**全局数据存储**。

1. 在 **Global Datastore Name（全局数据存储名称）**下，选择要删除的全局数据存储，然后选择 **Delete（删除）**。

   然后，系统会提示您确认您的决定，并显示以下警告：`Are you sure you want to delete this Global Datastore?`

1. 选择 **Delete（删除）**。

全局数据存储将转换为 **Deleting（正在删除）**状态。

# 使用全局数据存储 (CLI)
<a name="Redis-Global-Datastores-CLI"></a>

您可以使用 Amazon Command Line Interface (Amazon CLI) 从命令行管理多个 Amazon 服务并通过脚本自动执行这些服务。您可以使用 Amazon CLI 执行临时（一次性）操作。

## 下载和配置 Amazon CLI
<a name="Redis-Global-Datastores-Downloading-CLI"></a>

Amazon CLI 在 Windows、macOS 或 Linux 上运行。按照以下步骤下载和并对其进行配置。

**下载、安装和配置 CLI**

1. 在 [Amazon Command Line Interface](https://www.amazonaws.cn/cli) 网页上下载 Amazon CLI。

1. 按照 *Amazon Command Line Interface 用户指南*中的说明安装 Amazon CLI 和配置 Amazon CLI。

## 将 Amazon CLI 与全局数据存储结合使用
<a name="Redis-Global-Datastores-Using-CLI"></a>

使用以下 CLI 操作来处理全局数据存储：
+ [create-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-global-replication-group.html)

  ```
  aws elasticache create-global-replication-group \
     --global-replication-group-id-suffix my global datastore  \
     --primary-replication-group-id sample-repl-group  \
     --global-replication-group-description an optional description of the global datastore
  ```

  Amazon ElastiCache 会在全局数据存储 ID 被创建时自动对其应用前缀。每个 Amazon 区域有自己的前缀。例如，在美国西部（北加利福尼亚）区域创建的全局数据存储 ID 以“virxk”和您提供的后缀名称开头。后缀与自动生成的前缀相结合，保证了全局数据存储名称在多个区域中的唯一性。

  下表列出了每个 Amazon 区域及其全局数据存储 ID 前缀。

    
****    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/Redis-Global-Datastores-CLI.html)
+  [create-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-replication-group.html) – 使用此操作可通过向 `--global-replication-group-id` 参数提供全局数据存储的名称来创建全局数据存储的辅助集群。

  ```
  aws elasticache create-replication-group \
    --replication-group-id secondary replication group name \
    --replication-group-description “Replication group description" \
    --global-replication-group-id global datastore name
  ```

  当调用此操作并传入 `--global-replication-group-id` 值时，ElastiCache 会从全局复制组的主复制组中推断下列参数的值。请勿传入这些参数的值：

  `"PrimaryClusterId",`

  `"AutomaticFailoverEnabled",`

  ` "NumNodeGroups",`

  ` "CacheParameterGroupName",`

  ` "CacheNodeType",`

  ` "Engine",`

  ` "EngineVersion",`

  ` "CacheSecurityGroupNames",`

  ` "EnableTransitEncryption",`

  ` "AtRestEncryptionEnabled",`

  ` "SnapshotArns",`

  ` "SnapshotName"`
+ [describe-global-replication-groups](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-global-replication-groups.html)

  ```
  aws elasticache describe-global-replication-groups \
     --global-replication-group-id my global datastore  \
     --show-member-info an optional parameter that returns a list of the primary and secondary clusters that make up the global datastore
  ```
+ [modify-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-global-replication-group.html)

  ```
  aws elasticache modify-global-replication-group \
     --global-replication-group-id my global datastore  \
     --automatic-failover-enabled \
     --cache-node-type node type \
     --cache-parameter-group-name parameter group name \ 
     --engine-version engine version \
     -—apply-immediately \
     --global-replication-group-description description
  ```

  **ElastiCache GlobalDataStore 的 Redis 到 OSS Valkey 跨引擎升级**

  您可以使用控制台、API 或 CLI 将现有 Redis OSS 全局复制组升级到 Valkey。

  如果您有现成的 Redis OSS 全局复制组，您可以使用 modify-global-replication-group API 指定新引擎和引擎版本，从而升级到 Valkey。

  对于 Linux、macOS 或 Unix：

  ```
  aws elasticache modify-global-replication-group \
     --global-replication-group-id myGlobalReplGroup \
     --engine valkey \
     --apply-immediately \
     --engine-version 8.0
  ```

  对于 Windows：

  ```
  aws elasticache modify-global-replication-group ^
     --global-replication-group-id myGlobalReplGroup ^
     --engine valkey ^
     --apply-immediately ^
     --engine-version 8.0
  ```

  如果您对要升级的现有 Redis OSS 全局复制组应用了自定义缓存参数组，则还需要在请求中传递自定义 Valkey 缓存参数组。输入 Valkey 自定义参数组必须具有与现有 Redis OSS 自定义参数组相同的 Redis OSS 静态参数值。

  对于 Linux、macOS 或 Unix：

  ```
  aws elasticache modify-global-replication-group \
     --global-replication-group-id myGlobalReplGroup \
     --engine valkey \
     --engine-version 8.0 \
     --apply-immediately \
     --cache-parameter-group-name myParamGroup
  ```

  对于 Windows：

  ```
  aws elasticache modify-global-replication-group ^
     --global-replication-group-id myGlobalReplGroup ^
     --engine valkey ^
     --engine-version 8.0 ^
     --apply-immediately ^
     --cache-parameter-group-name myParamGroup
  ```
+ [delete-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-global-replication-group.html)

  ```
  aws elasticache delete-global-replication-group \
     --global-replication-group-id my global datastore  \
     --retain-primary-replication-group defaults to true
  ```
+ [disassociate-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/disassociate-global-replication-group.html)

  ```
  aws elasticache disassociate-global-replication-group \
     --global-replication-group-id my global datastore  \
     --replication-group-id my secondary cluster  \
     --replication-group-region the Amazon Region in which the secondary cluster resides
  ```
+ [failover-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/failover-global-replication-group.html)

  ```
  aws elasticache failover-replication-group \
     --global-replication-group-id my global datastore \
     --primary-region The Amazon Region of the primary cluster \  
     --primary-replication-group-id  The name of the global datastore, including the suffix.
  ```
+ [increase-node-groups-in-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/increase-node-groups-in-global-replication-group.html)

  ```
  aws elasticache increase-node-groups-in-global-replication-group \
     --apply-immediately yes \
     --global-replication-group-id global-replication-group-name \
     --node-group-count 3
  ```
+ [decrease-node-groups-in-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/decrease-node-groups-in-global-replication-group.html)

  ```
  aws elasticache decrease-node-groups-in-global-replication-group \
     --apply-immediately yes \
     --global-replication-group-id global-replication-group-name \
     --node-group-count 3
  ```
+ [rebalance-shards-in-global-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/rebalance-slots-in-global-replication-group.html)

  ```
  aws elasticache rebalance-shards-in-global-replication-group \
     --apply-immediately yes \
     --global-replication-group-id global-replication-group-name
  ```

使用 help 列出 ElastiCache for Valkey 或 ElastiCache for Redis OSS 的所有可用命令。

```
aws elasticache help
```

您还可以使用帮助来描述特定命令并了解有关其用法的详细信息：

```
aws elasticache create-global-replication-group help
```

# 使用复制组时的高可用性
<a name="Replication"></a>

单节点 Amazon ElastiCache（兼容 Valkey 或 Redis OSS）集群是具有有限数据保护服务（AOF）的内存中实体。如果您的集群出于任何原因发生故障，您将丢失集群中的所有数据。但是，如果您运行的是 Valkey 或 Redis OSS 引擎，则可将 2 到 6 个节点归入一个具有副本的集群，其中 1 到 5 个只读节点包含该组的单个读/写主节点的复制数据。在这种情况下，如果一个节点出于任何原因发生故障，您不会丢失所有数据，因为这些数据已在另外的一个或多个节点中复制。如果发生故障的是读/写主节点，由于复制延迟，某些数据可能会丢失。

如下图所示，复制结构包含在分片中（在 API/CLI 中称为*节点组*），而分片包含在 Valkey 或 Redis OSS 集群中。Valkey 或 Redis OSS（已禁用集群模式）集群始终有一个分片。Valkey 或 Redis OSS（已启用集群模式）集群最多可以拥有 500 个分片，而且集群的数据跨分片进行分区。您可以创建具有更多分片和更少副本的集群，每个集群最多可包含 90 个节点。此集群配置的范围可以从 90 个分片和 0 个副本到 15 个分片和 5 个副本，这是允许的最大副本数。

如果使用 ElastiCache for Valkey 和 ElastiCache for Redis OSS 5.0.6 或更高版本，您可以将每个集群的节点或分片限制增至最多 500 个。例如，您可以选择配置一个 500 节点的集群，范围介于 83 个分片（一个主分片和 5 个副本分片）和 500 个分片（一个主分片，无副本分片）之间。确保可提供足够的 IP 地址来满足增长需求。常见的陷阱包括子网组中的子网 CIDR 范围太小，或者子网被其他集群共享和大量使用。有关更多信息，请参阅 [创建子网组](SubnetGroups.Creating.md)。

 对于低于 5.0.6 的版本，每个集群的限制为 250。

若要请求提高限制，请参阅 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 并选择限制类型 **Nodes per cluster per instance type（每个实例类型的每个集群的节点数）**。

![\[图片：Valkey 或 Redis OSS（已禁用集群模式）集群拥有一个分片和 0 到 5 个副本节点\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCacheClusters-CSN-Redis-Replicas.png)


*Valkey 或 Redis OSS（已禁用集群模式）集群拥有一个分片和 0 到 5 个副本节点*

如果为具有副本的集群启用了多可用区，则当主节点发生故障时，主节点将故障转移到某个只读副本。由于在副本节点上异步更新数据，因此可能会因更新副本节点时存在延迟而导致丢失某些数据。有关更多信息，请参阅 [缓解运行 Valkey 或 Redis OSS 时发生的故障](disaster-recovery-resiliency.md#FaultTolerance.Redis)。

**Topics**
+ [

# 了解 Valkey 和 Redis OSS 复制
](Replication.Redis.Groups.md)
+ [

# 复制：Valkey 和 Redis OSS 已禁用集群模式与已启用集群模式
](Replication.Redis-RedisCluster.md)
+ [

# 利用多可用区以及 Valkey 和 Redis OSS 最大限度减少 ElastiCache 中的停机时间
](AutoFailover.md)
+ [

# 如何实施同步和备份
](Replication.Redis.Versions.md)
+ [

# 创建 Valkey 或 Redis OSS 复制组
](Replication.CreatingRepGroup.md)
+ [

# 查看复制组的详细信息
](Replication.ViewDetails.md)
+ [

# 查找复制组端点
](Replication.Endpoints.md)
+ [

# 修改复制组
](Replication.Modify.md)
+ [

# 删除复制组
](Replication.DeletingRepGroup.md)
+ [

# 更改副本数量
](increase-decrease-replica-count.md)
+ [

# 将 Valkey 或 Redis OSS（已禁用集群模式）复制组的只读副本提升为主节点
](Replication.PromoteReplica.md)

# 了解 Valkey 和 Redis OSS 复制
<a name="Replication.Redis.Groups"></a>

Redis OSS 通过两种方式实现复制：
+ 使用在每个节点中使用包含所有集群数据的单一分片 – Valkey 或 Redis OSS（已禁用集群模式）
+ 在最多 500 个分片之间对数据进行分区 – Valkey 或 Redis OSS（已启用集群模式）

复制组中的每个分片都包含一个读/写主节点和最多 5 个只读副本节点。您可以创建具有更多分片和更少副本的集群，每个集群最多可包含 90 个节点。此集群配置的范围可以从 90 个分片和 0 个副本到 15 个分片和 5 个副本，这是允许的最大副本数。

如果 Redis 引擎版本为 5.0.6 OSS 或更高版本，您可将每个集群的节点或分片限制提高到最大值 500。例如，您可以选择配置一个 500 节点的集群，范围介于 83 个分片（一个主分片和 5 个副本分片）和 500 个分片（一个主分片，无副本分片）之间。确保可提供足够的 IP 地址来满足增长需求。常见的陷阱包括子网组中的子网 CIDR 范围太小，或者子网被其他集群共享和大量使用。有关更多信息，请参阅 [创建子网组](SubnetGroups.Creating.md)。

 对于低于 5.0.6 的版本，每个集群的限制为 250。

若要请求提高限制，请参阅 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 并选择限制类型 **Nodes per cluster per instance type（每个实例类型的每个集群的节点数）**。

**Topics**
+ [

## Valkey 或 Redis OSS（已禁用集群模式）
](#Replication.Redis.Groups.Classic)
+ [

## Valkey 或 Redis OSS（已启用集群模式）
](#Replication.Redis.Groups.Cluster)

## Valkey 或 Redis OSS（已禁用集群模式）
<a name="Replication.Redis.Groups.Classic"></a>

Valkey 或 Redis OSS（已禁用集群模式）集群拥有一个分片，其中包含一个节点集合；一个读/写主节点和最多 5 个辅助只读副本节点。每个只读副本保留一个集群主节点数据的副本。可使用异步复制机制使只读副本与主集群同步。应用程序可以从集群中的任何节点进行读取。应用程序只能对主节点进行写入。只读副本增加了读取吞吐量，并在节点发生故障时防止数据丢失。

![\[图片：具有一个分片和多个副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCacheClusters-CSN-Redis-Replicas.png)


*具有一个分片和多个副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群*

您可以使用具有副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群扩展针对 ElastiCache 的解决方案，以处理读取操作密集的应用程序或是支持同时从同一个集群进行读取的大量客户端。

Valkey 或 Redis OSS（已禁用集群模式）集群中的所有节点必须位于同一区域内。

在向集群添加只读副本时，主集群中的所有数据都会复制到新节点。从此之后，只要向主集群写入数据，更改便会异步传播到所有只读副本。

要增强容错能力并减少写入停机时间，请对具有副本的 Valkey 或 Redis OSS（已禁用集群模式）集群启用带自动失效转移功能的多可用区。有关更多信息，请参阅 [利用多可用区以及 Valkey 和 Redis OSS 最大限度减少 ElastiCache 中的停机时间](AutoFailover.md)。

您可以更改 Valkey 或 Redis OSS（已禁用集群模式）集群中的节点的角色，在这种情况下，主集群会与一个副本交换角色。您可能会为了优化性能执行此操作。例如，对于具有大量写入活动的 Web 应用程序，您可以选择网络延迟最低的节点。有关更多信息，请参阅 [将 Valkey 或 Redis OSS（已禁用集群模式）复制组的只读副本提升为主节点](Replication.PromoteReplica.md)。

## Valkey 或 Redis OSS（已启用集群模式）
<a name="Replication.Redis.Groups.Cluster"></a>

Valkey 或 Redis OSS（已启用集群模式）集群由 1 到 500 个分片（API/CLI：节点组）组成。每个分片有一个主节点和最多 5 个只读副本节点。配置的范围可以从 90 个分片和 0 个副本到 15 个分片和 5 个副本，这是允许的最大副本数。

如果引擎为 Valkey 7.2 及更高版本或 Redis OSS 5.0.6 及更高版本，您可以将每个集群的节点或分片限制增至最多 500 个。例如，您可以选择配置一个 500 节点的集群，范围介于 83 个分片（一个主分片和 5 个副本分片）和 500 个分片（一个主分片，无副本分片）之间。确保可提供足够的 IP 地址来满足增长需求。常见的陷阱包括子网组中的子网 CIDR 范围太小，或者子网被其他集群共享和大量使用。有关更多信息，请参阅 [创建子网组](SubnetGroups.Creating.md)。

 对于低于 5.0.6 的版本，每个集群的限制为 250。

若要请求提高限制，请参阅 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 并选择限制类型 **Nodes per cluster per instance type（每个实例类型的每个集群的节点数）**。

 分片中的每个只读副本均保留分片主集群中数据的一份副本。可使用异步复制机制使只读副本与主集群同步。应用程序可以从集群中的任何节点进行读取。应用程序只能对主节点进行写入。只读副本可增强读取可扩展性和防止数据丢失。数据在 Valkey 或 Redis OSS（已启用集群模式）集群中的分片上进行分区。

应用程序使用 Valkey 或 Redis OSS（已启用集群模式）集群的*配置端点*连接集群中的节点。有关更多信息，请参阅 [查找 ElastiCache 中的缓存连接端点](Endpoints.md)。

![\[图片：具有多个分片和副本节点的 Valkey 或 Redis OSS（已启用集群模式）集群\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCacheClusters-CSN-RedisClusters.png)


*具有多个分片和副本节点的 Valkey 或 Redis OSS（已启用集群模式）集群*

Valkey 或 Redis OSS（已启用集群模式）集群中的所有节点必须位于同一区域内。要增强容错能力，您可在该区域内的多个可用区中预配置主副本和只读副本。

目前，Valkey 或 Redis OSS（已启用集群模式）功能有一些限制。
+ 您无法手动将任何副本节点提升为主节点。

# 复制：Valkey 和 Redis OSS 已禁用集群模式与已启用集群模式
<a name="Replication.Redis-RedisCluster"></a>

从 Valkey 7.2 和 Redis OSS 3.2 版开始，您可以创建两种不同类型的集群（API/CLI：复制组）。Valkey 或 Redis OSS（已禁用集群模式）集群始终具有单个分片（API/CLI：节点组），包含最多 5 个只读副本节点。Valkey 或 Redis OSS（已启用集群模式）集群最多拥有 500 个分片，每个分片中包含 1 到 5 个只读副本节点。

![\[图片：Valkey 或 Redis OSS（已禁用集群模式）集群与 Valkey 或 Redis OSS（已启用集群模式）集群\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-NodeGroups.png)


*Valkey 或 Redis OSS（已禁用集群模式）集群与 Valkey 或 Redis OSS（已启用集群模式）集群*

下表总结了 Valkey 或 Redis OSS（禁用集群模式）集群和 Valkey 或 Redis OSS（已启用集群模式）集群之间的重要差异。


**比较 Valkey 或 Redis OSS（已禁用集群模式）集群与 Valkey 或 Redis OSS（已启用集群模式）集群**  

| 功能 | Valkey 或 Redis OSS（已禁用集群模式） | Valkey 或 Redis OSS（已启用集群模式） | 
| --- | --- | --- | 
| 可修改 | 是。支持添加和删除副本节点，以及纵向扩展节点类型。 | 有限。有关更多信息，请参阅 [的版本管理 ElastiCache](VersionManagement.md) 和 [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)。 | 
| 数据分区 | 否 | 是 | 
| 分片 | 1 | 1 至 500  | 
| 只读副本 | 0 到 5 如果您没有副本并且节点失败，就会遇到全部数据丢失的情况。 | 每个分区 0 至 5 个。如果您没有副本并且节点失败，则分片中的所有数据将丢失。 | 
| 多可用区  | 是，至少 1 个副本。可选。默认情况下处于打开状态。 | 是可选。默认情况下处于打开状态。 | 
| 快照（备份） | 是，创建单个 .rdb 文件。 | 是，为每个分片创建单个 .rdb 文件。 | 
| 还原 | 是，使用 Valkey 或 Redis OSS（已禁用集群模式）集群中的单个 .rdb 文件。 | 是，使用 Valkey 或 Redis OSS（已禁用集群模式）集群或 Valkey 或 Redis OSS（已启用集群模式）集群中的 .rdb 文件。 | 
| 支持 | 所有 Valkey 和 Redis OSS 版本 | 所有 Valkey 版本和 Redis OSS 3.2 及更高版本 | 
| 可升级引擎 | 是，但有一些限制。有关更多信息，请参阅 [的版本管理 ElastiCache](VersionManagement.md)。 | 是，但有一些限制。有关更多信息，请参阅 [的版本管理 ElastiCache](VersionManagement.md)。 | 
| 加密 | 版本 3.2.6（计划终止生命周期，请参阅 [Redis OSS 版本生命周期终止计划](engine-versions.md#deprecated-engine-versions)）、4.0.10 及更高版本。 | 版本 3.2.6（计划终止生命周期，请参阅 [Redis OSS 版本生命周期终止计划](engine-versions.md#deprecated-engine-versions)）、4.0.10 及更高版本。 | 
| 符合 HIPAA 要求 | 版本 3.2.6（计划终止生命周期，请参阅 [Redis OSS 版本生命周期终止计划](engine-versions.md#deprecated-engine-versions)）、4.0.10 及更高版本。 | 版本 3.2.6（计划终止生命周期，请参阅 [Redis OSS 版本生命周期终止计划](engine-versions.md#deprecated-engine-versions)）、4.0.10 及更高版本。 | 
| 与 PCI DSS 兼容 | 版本 3.2.6（计划终止生命周期，请参阅 [Redis OSS 版本生命周期终止计划](engine-versions.md#deprecated-engine-versions)）、4.0.10 及更高版本。 | 版本 3.2.6（计划终止生命周期，请参阅 [Redis OSS 版本生命周期终止计划](engine-versions.md#deprecated-engine-versions)）、4.0.10 及更高版本。 | 
| 在线重新分片 | 不适用 | 版本 3.2.10（计划终止生命周期，请参阅 [Redis OSS 版本生命周期终止计划](engine-versions.md#deprecated-engine-versions)）及更高版本。 | 

## 我应该使用哪一种？
<a name="Replication.Redis-RedisCluster.Choose"></a>

在 Valkey 或 Redis OSS（已禁用集群模式）或 Valkey 或 Redis OSS（已启用集群模式）之间进行选择时，请考虑以下因素：
+ **扩展与分区** – 业务需求在发生变化。您需要针对峰值需求进行预置，还是随需求变化进行扩展。Valkey 或 Redis OSS（已禁用集群模式）支持扩缩。您可以通过添加或删除副本节点来扩展读取容量，或者通过纵向扩展到更大的节点类型来扩展容量。所有这些操作都需要一些时间。有关更多信息，请参阅[扩缩单节点 Valkey 或 Redis OSS（已禁用集群模式）副本节点](Scaling.RedisReplGrps.md)。

   

  Valkey 或 Redis OSS（已启用集群模式）支持在最多 500 个节点组之间对数据进行分区。您可以根据业务的变更需求，动态更改分片数量。分区的优势之一是您可以将负载分散到更多数量的终端节点上，从而减少峰值期间的访问瓶颈。此外，由于数据可分散到多个服务器上，您可以容纳更大的数据集。有关扩缩分区的信息，请参阅[扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)。

   
+ **节点大小与节点数** – 由于 Valkey 或 Redis OSS（已禁用集群模式）集群只有一个分片，节点类型必须足够大才能容纳所有集群的数据以及涵盖所需开销。另一方面，由于您在使用 Valkey 或 Redis OSS（已启用集群模式）集群时可以在多个分片上对数据进行分区，节点类型可以更小，虽然这样一来您需要的节点的数量更多。有关更多信息，请参阅 [选择节点大小](CacheNodes.SelectSize.md)。

   
+ **读取与写入** – 如果集群上的主要负载是读取数据的应用程序，则您可以通过添加和删除只读副本来扩展 Valkey 或 Redis OSS（已禁用集群模式）集群。不过，最多只能有 5 个只读副本。如果集群上的负载为写入密集型负载，则您可以获益于具有多个分片的 Valkey 或 Redis OSS（已启用集群模式）集群上的额外写入端点。

不论您选择实施什么类型的集群，请确保选择足以满足您现在和未来需求的节点类型。

# 利用多可用区以及 Valkey 和 Redis OSS 最大限度减少 ElastiCache 中的停机时间
<a name="AutoFailover"></a>

在许多情况下，ElastiCache for Valkey and Redis OSS 可能需要替换主节点；这些情况包括特定类型的计划维护以及主节点或可用区出现故障的意外事件。

在这些情形下进行替换时，会导致集群出现停机时间，但如果启用了多可用区，则会最大限度缩短停机时间。主节点的角色会自动将故障转移到其中一个只读副本。ElastiCache 会透明地处理这一点，因此无需创建和预置新的主节点。此故障转移和副本提升可确保您在提升完成后立即继续写入新的主节点。

ElastiCache 还可以传播已提升副本的域名服务 (DNS) 名称。这样做的原因是，如果您的应用程序写入到主终端节点，则无需在应用程序中进行终端节点更改。如果您从单个终端节点进行读取，请确保将提升为主节点的副本的读取终端节点更改为新副本的终端节点。

如果由于维护更新或自助服务更新而启动了计划的节点替换，请注意以下事项：
+ 对于 Valkey 和 Redis OSS 集群，计划的节点替换会在集群处理传入的写入请求时完成。
+ 对于启用了多可用区并在 5.0.6 或更高版本引擎上运行的已禁用 Valkey 和 Redis OSS 集群模式的集群，计划的节点替换会在集群处理传入的写入请求时完成。
+ 对于启用了多可用区且在 4.0.10 或更早版本的引擎上运行的已禁用 Valkey 和 Redis OSS 集群模式的集群，您可能会发现与 DNS 更新关联的短暂写入中断。此中断可能需要几秒钟。此过程比重新创建并预置新的主节点过程要快得多，后者是在您未启用多可用区的情况下使用的过程。

您可以使用 ElastiCache 管理控制台、Amazon CLI 或 ElastiCache API 启用多可用区。

在 Valkey 或 Redis OSS 集群上启用 ElastiCache 多可用区（在 API 和 CLI 中为复制组）可提高容错能力。在集群的读取/写入主集群出于任何原因变得无法连接或发生故障时，此情况尤其如此。仅在每个分片中有多个节点的 Valkey 或 Redis OSS 集群上支持多可用区。

**Topics**
+ [

## 启用多可用区
](#AutoFailover.Enable)
+ [

## 故障情形及多可用区响应
](#AutoFailover.Scenarios)
+ [

## 测试自动故障转移
](#auto-failover-test)
+ [

## 多可用区限制
](#AutoFailover.Limitations)

## 启用多可用区
<a name="AutoFailover.Enable"></a>

您可以在使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 创建或修改集群（API 或 CLI：复制组）时启用多可用区。

您只能在具有至少一个可用只读副本的 Valkey 或 Redis OSS（已禁用集群模式）集群上启用多可用区。没有只读副本的集群不提供高可用性或容错能力。有关创建具有复制功能的集群的更多信息，请参阅[创建 Valkey 或 Redis OSS 复制组](Replication.CreatingRepGroup.md)。有关将只读副本添加到具有复制功能的集群的信息，请参阅[为 Valkey 或 Redis OSS（已禁用集群模式）添加只读副本](Replication.AddReadReplica.md)。

**Topics**
+ [

### 启用多可用区（控制台）
](#AutoFailover.Enable.Console)
+ [

### 启用多可用区 (Amazon CLI)
](#AutoFailover.Enable.CLI)
+ [

### 启用多可用区 (ElastiCache API)
](#AutoFailover.Enable.API)

### 启用多可用区（控制台）
<a name="AutoFailover.Enable.Console"></a>

您可以在创建新的 Valkey 或 Redis OSS 集群时使用 ElastiCache 控制台，或通过修改具有复制功能的现有集群来启用多可用区。

默认情况下，Valkey 或 Redis OSS（已启用集群模式）集群上已启用多可用区。

**重要**  
仅当集群在除所有分区中的主可用区以外的可用区中包含至少一个副本时，ElastiCache 才会自动启用多可用区。

#### 使用 ElastiCache 控制台在创建集群时启用多可用区
<a name="AutoFailover.Enable.Console.NewCacheCluster"></a>

有关此过程的更多信息，请参阅 [创建 Valkey（已禁用集群模式）集群（控制台）](SubnetGroups.designing-cluster-pre.valkey.md#Clusters.Create.CON.valkey-gs)。确保有一个或多个副本并启用多可用区。

#### 在现有集群上启用多可用区（控制台）
<a name="AutoFailover.Enable.Console.ReplGrp"></a>

有关此过程的更多信息，请参阅修改集群[使用 ElastiCache Amazon Web Services 管理控制台](Clusters.Modify.md#Clusters.Modify.CON)。

### 启用多可用区 (Amazon CLI)
<a name="AutoFailover.Enable.CLI"></a>

以下代码示例使用 Amazon CLI 为复制组 `redis12` 启用多可用区。

**重要**  
复制组 `redis12` 必须已存在且具有至少一个可用只读副本。

对于 Linux、macOS 或 Unix：

```
aws elasticache modify-replication-group \
    --replication-group-id redis12 \
    --automatic-failover-enabled \
    --multi-az-enabled \
    --apply-immediately
```

对于 Windows：

```
aws elasticache modify-replication-group ^
    --replication-group-id redis12 ^
    --automatic-failover-enabled ^
    --multi-az-enabled ^
    --apply-immediately
```

该命令的 JSON 输出内容应如下所示。

```
{
    "ReplicationGroup": {
        "Status": "modifying", 
        "Description": "One shard, two nodes", 
        "NodeGroups": [
            {
                "Status": "modifying", 
                "NodeGroupMembers": [
                    {
                        "CurrentRole": "primary", 
                        "PreferredAvailabilityZone": "us-west-2b", 
                        "CacheNodeId": "0001", 
                        "ReadEndpoint": {
                            "Port": 6379, 
                            "Address": "redis12-001.v5r9dc.0001.usw2.cache.amazonaws.com"
                        }, 
                        "CacheClusterId": "redis12-001"
                    }, 
                    {
                        "CurrentRole": "replica", 
                        "PreferredAvailabilityZone": "us-west-2a", 
                        "CacheNodeId": "0001", 
                        "ReadEndpoint": {
                            "Port": 6379, 
                            "Address": "redis12-002.v5r9dc.0001.usw2.cache.amazonaws.com"
                        }, 
                        "CacheClusterId": "redis12-002"
                    }
                ], 
                "NodeGroupId": "0001", 
                "PrimaryEndpoint": {
                    "Port": 6379, 
                    "Address": "redis12.v5r9dc.ng.0001.usw2.cache.amazonaws.com"
                }
            }
        ], 
        "ReplicationGroupId": "redis12", 
        "SnapshotRetentionLimit": 1, 
        "AutomaticFailover": "enabling", 
        "MultiAZ": "enabled", 
        "SnapshotWindow": "07:00-08:00", 
        "SnapshottingClusterId": "redis12-002", 
        "MemberClusters": [
            "redis12-001", 
            "redis12-002"
        ], 
        "PendingModifiedValues": {}
    }
}
```

有关更多信息，请参阅 *Amazon CLI 命令参考*中的下列主题：
+ [create-cache-cluster](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-cache-cluster.html)
+ [create-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-replication-group.html)
+ *Amazon CLI 命令参考*中的 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)。

### 启用多可用区 (ElastiCache API)
<a name="AutoFailover.Enable.API"></a>

以下代码示例使用 ElastiCache API 为复制组 `redis12` 启用多可用区。

**注意**  
要使用此示例，复制组 `redis12` 必须已存在且具有至少一个可用只读副本。

```
https://elasticache.us-west-2.amazonaws.com/
    ?Action=ModifyReplicationGroup
    &ApplyImmediately=true
    &AutoFailover=true
    &MultiAZEnabled=true
    &ReplicationGroupId=redis12
    &Version=2015-02-02
    &SignatureVersion=4
    &SignatureMethod=HmacSHA256
    &Timestamp=20140401T192317Z
    &X-Amz-Credential=<credential>
```

有关更多信息，请参阅 *ElastiCache API 参考*中的下列主题：
+ [CreateCacheCluster](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateCacheCluster.html)：
+ [CreateReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateReplicationGroup.html)：
+ [ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)

## 故障情形及多可用区响应
<a name="AutoFailover.Scenarios"></a>

在引入多可用区之前，ElastiCache 检测集群的故障节点，并通过重新创建及重新预置故障节点来替换这些节点。如果启用多可用区，发生故障的主节点将故障转移至复制滞后最小的副本。选定副本会自动提升为主节点，这比创建并重新预配置新的主节点快得多。提升过程通常只需几秒钟的时间，然后您可以再次对集群进行写入。

在启用多可用区时，ElastiCache 会持续监控主节点的状态。如果主节点发生故障，则根据故障的类型执行以下操作之一。

**Topics**
+ [

### 仅主节点出现故障时的故障情形
](#AutoFailover.Scenarios.PrimaryOnly)
+ [

### 当主节点和一些只读副本发生故障时的故障情形
](#AutoFailover.Scenarios.PrimaryAndReplicas)
+ [

### 整个集群出现故障时的故障情形
](#AutoFailover.Scenarios.AllFail)

### 仅主节点出现故障时的故障情形
<a name="AutoFailover.Scenarios.PrimaryOnly"></a>

如果只有主节点出现故障，则复制滞后最小的只读副本将提升为主节点。然后，将在与发生故障的主节点相同的可用区域中创建和预置替换只读副本。

仅当主节点出现故障时，ElastiCache 多可用区才执行以下操作：

1. 发生故障的主节点脱机。

1. 复制滞后最小的只读副本将提升为主节点。

   一旦提升过程完成（通常只需几秒钟的时间），写入操作就会恢复。如果应用程序正在向主端点写入，则无需更改用于写入或读取的端点。ElastiCache 会传播已提升副本的 DNS 名称。

1. 启动和预配置替代只读副本。

   将在可用区 (发生故障的主节点的位置) 启动替换只读副本，以便维护节点的分配。

1. 该副本将与新的主节点同步。

新的副本可用后，请注意以下影响：
+ **主端点** – 由于新主节点的 DNS 名称会传播到主端点，因此您不需要对应用程序进行任何更改。
+ **读取端点** – 读取器终端节点会自动更新为指向新的副本节点。

有关查找集群的终端节点的信息，请参阅以下主题：
+ [查找 Valkey 或 Redis OSS（已禁用集群模式）集群端点（控制台）](Endpoints.md#Endpoints.Find.Redis)
+ [查找 Valkey 或 Redis OSS 复制组的端点（Amazon CLI）](Endpoints.md#Endpoints.Find.CLI.ReplGroups)
+ [查找 Valkey 或 Redis OSS 复制组的端点（ElastiCache API）](Endpoints.md#Endpoints.Find.API.ReplGroups)

 

### 当主节点和一些只读副本发生故障时的故障情形
<a name="AutoFailover.Scenarios.PrimaryAndReplicas"></a>

如果主节点和至少一个只读副本发生故障，则具有最低复制滞后的可用副本将提升到主集群，并在与故障节点以及提升为主节点的副本相同的可用区中创建新只读副本。

当主节点和一些只读副本发生故障时，ElastiCache 多可用区执行以下操作：

1. 发生故障的主节点和发生故障的只读副本脱机。

1. 复制滞后最小的可用副本将提升为主节点。

   一旦提升过程完成（通常只需几秒钟的时间），写入操作就会恢复。如果应用程序正在向主端点写入，则无需更改用于写入的端点。ElastiCache 会传播已提升副本的 DNS 名称。

1. 创建和预调配替换副本。

   将在可用区（发生故障的节点的位置）创建替换副本，以便维护节点的分配。

1. 所有集群将与新的主节点同步。

在新节点可用后，对应用程序进行以下更改：
+ **主端点** – 不要对应用程序进行任何更改。新主节点的 DNS 名称将传播到主终端节点。
+ **读取端点** – 读取端点会自动更新为指向新的副本节点。

有关查找复制组的终端节点的信息，请参阅以下主题：
+ [查找 Valkey 或 Redis OSS（已禁用集群模式）集群端点（控制台）](Endpoints.md#Endpoints.Find.Redis)
+ [查找 Valkey 或 Redis OSS 复制组的端点（Amazon CLI）](Endpoints.md#Endpoints.Find.CLI.ReplGroups)
+ [查找 Valkey 或 Redis OSS 复制组的端点（ElastiCache API）](Endpoints.md#Endpoints.Find.API.ReplGroups)

 

### 整个集群出现故障时的故障情形
<a name="AutoFailover.Scenarios.AllFail"></a>

如果整个集群全部发生故障，则在与原始节点相同的可用区中重新创建所有节点并预配置。

在此情况下，由于集群中的每个节点均发生故障，因此集群中的所有数据将丢失。这种情况很少出现。

当整个集群发生故障时，ElastiCache 多可用区将执行以下操作：

1. 发生故障的主节点和只读副本脱机。

1. 创建和预配置替换主节点。

1. 创建和预调配替换副本。

   将在可用区（发生故障的节点的位置）创建替换，以便维护节点的分配。

   由于整个集群发生故障，因此数据将丢失，并且所有新节点将冷启动。

由于每个替换节点具有与其要替换的节点相同的终端节点，因此不需要在应用程序中对任何终端节点进行更改。

有关查找复制组的终端节点的信息，请参阅以下主题：
+ [查找 Valkey 或 Redis OSS（已禁用集群模式）集群端点（控制台）](Endpoints.md#Endpoints.Find.Redis)
+ [查找 Valkey 或 Redis OSS 复制组的端点（Amazon CLI）](Endpoints.md#Endpoints.Find.CLI.ReplGroups)
+ [查找 Valkey 或 Redis OSS 复制组的端点（ElastiCache API）](Endpoints.md#Endpoints.Find.API.ReplGroups)

建议您在不同的可用区内创建主节点和只读副本以提高容错能力水平。

## 测试自动故障转移
<a name="auto-failover-test"></a>

在您启用自动故障转移之后，您可以使用 ElastiCache 控制台、Amazon CLI 和 ElastiCache API 进行测试。

在测试时，请注意以下内容：
+ 在任意 24 小时滚动期间，您可以使用此操作测试最多 15 个分片（在 ElastiCache API 和 Amazon CLI 中称为节点组）上的失效转移。
+ 如果在不同集群的分片 (在 API 和 CLI 中称为复制组) 上调用此操作，您可以让调用同时进行。
+ 在某些情况下，您可能会在同一 Valkey 或 Redis OSS（已启用集群模式）复制组中的不同分片上多次调用此操作。在这种情况下，必须先完成第一个节点替换，然后再进行后续调用。
+ 要确定节点替换是否已完成，您可以使用 Amazon ElastiCache 控制台、Amazon CLI 或 ElastiCache API 检查事件。查找下列与自动故障转移相关的事件，此处按事件的可能发生顺序列出：

  1. 复制组消息：`Test Failover API called for node group <node-group-id>`

  1. 缓存集群消息：`Failover from primary node <primary-node-id> to replica node <node-id> completed`

  1. 复制组消息：`Failover from primary node <primary-node-id> to replica node <node-id> completed`

  1. 缓存集群消息：`Recovering cache nodes <node-id>`

  1. 缓存集群消息：`Finished recovery for cache nodes <node-id>`

  有关更多信息，请参阅下列内容：
  + *ElastiCache 用户指南*中的 [查看 ElastiCache 事件](ECEvents.Viewing.md)
  + *ElastiCache API 参考*中的 [DescribeEvents](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeEvents.html)
  + *Amazon CLI 命令参考*中的 [describe-events](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-events.html)。
+ 此 API 旨在测试发生 ElastiCache 故障转移时的应用程序行为。它不是用于启动故障转移以解决集群问题的操作工具。此外，在大型运营活动等特定情况下，Amazon 可能会阻止此 API。

**Topics**
+ [

### 使用 Amazon Web Services 管理控制台 测试自动故障转移
](#auto-failover-test-con)
+ [

### 使用 Amazon CLI 测试自动故障转移
](#auto-failover-test-cli)
+ [

### 使用 ElastiCache API 测试自动故障转移
](#auto-failover-test-api)

### 使用 Amazon Web Services 管理控制台 测试自动故障转移
<a name="auto-failover-test-con"></a>

使用以下过程测试通过控制台进行自动故障转移。

**测试自动故障转移**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**。

1. 从集群列表选择要测试的集群名称左侧的复选框。此集群必须至少有一个只读副本节点。

1. 在 **Details** 区域中，确认此集群已启用多可用区。如果集群未启用多可用区，则选择其他集群或者修改此集群以启用多可用区。有关更多信息，请参阅 [使用 ElastiCache Amazon Web Services 管理控制台](Clusters.Modify.md#Clusters.Modify.CON)。  
![\[图：启用多可用区的集群的“详细信息”区域\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-AutoFailover-MultiAZ-Enabled.png)

1. 对于 Valkey 或 Redis OSS（已禁用集群模式），请选择集群的名称。

   对于 Valkey 或 Redis OSS（已启用集群模式），请执行以下操作：

   1. 选择集群的名称。

   1. 在 **Shards** 页面上，对于要测试故障转移的分片 (在 API 和 CLI 中称为节点组)，选择分片的名称。

1. 在“Nodes”页面上，选择 **Failover Primary**。

1. 选择 **Continue** 可对主节点进行故障转移，选择 **Cancel** 可取消操作，不对主节点进行故障转移。

   故障转移过程中，控制台继续将节点状态显示为*可用*。要跟踪您的故障转移测试进度，请从控制台导航窗格选择 **Events**。在 **Events** 选项卡上，观察指示故障转移已开始（`Test Failover API called`）和已完成（`Recovery completed`）的事件。

 

### 使用 Amazon CLI 测试自动故障转移
<a name="auto-failover-test-cli"></a>

您可以使用 Amazon CLI 操作 `test-failover` 在任何启用多可用区的集群上测试自动故障转移。

**参数**
+ `--replication-group-id` – 必需。要测试的复制组 (在控制台上为集群)。
+ `--node-group-id` – 必需。要在其上测试自动故障转移的节点组的名称。在 24 小时滚动期间您最多可以测试 15 个节点组。

以下示例使用 Amazon CLI 在 Valkey 或 Redis OSS（已启用集群模式）集群 `redis00` 中的节点组 `redis00-0003` 上测试自动失效转移。

**Example 测试自动故障转移**  
对于 Linux、macOS 或 Unix：  

```
aws elasticache test-failover \
   --replication-group-id redis00 \
   --node-group-id redis00-0003
```
对于 Windows：  

```
aws elasticache test-failover ^
   --replication-group-id redis00 ^
   --node-group-id redis00-0003
```

上面命令的输出类似于下面所示。

```
{
    "ReplicationGroup": {
        "Status": "available", 
        "Description": "1 shard, 3 nodes (1 + 2 replicas)", 
        "NodeGroups": [
            {
                "Status": "available", 
                "NodeGroupMembers": [
                    {
                        "CurrentRole": "primary", 
                        "PreferredAvailabilityZone": "us-west-2c", 
                        "CacheNodeId": "0001", 
                        "ReadEndpoint": {
                            "Port": 6379, 
                            "Address": "redis1x3-001.7ekv3t.0001.usw2.cache.amazonaws.com"
                        }, 
                        "CacheClusterId": "redis1x3-001"
                    }, 
                    {
                        "CurrentRole": "replica", 
                        "PreferredAvailabilityZone": "us-west-2a", 
                        "CacheNodeId": "0001", 
                        "ReadEndpoint": {
                            "Port": 6379, 
                            "Address": "redis1x3-002.7ekv3t.0001.usw2.cache.amazonaws.com"
                        }, 
                        "CacheClusterId": "redis1x3-002"
                    }, 
                    {
                        "CurrentRole": "replica", 
                        "PreferredAvailabilityZone": "us-west-2b", 
                        "CacheNodeId": "0001", 
                        "ReadEndpoint": {
                            "Port": 6379, 
                            "Address": "redis1x3-003.7ekv3t.0001.usw2.cache.amazonaws.com"
                        }, 
                        "CacheClusterId": "redis1x3-003"
                    }
                ], 
                "NodeGroupId": "0001", 
                "PrimaryEndpoint": {
                    "Port": 6379, 
                    "Address": "redis1x3.7ekv3t.ng.0001.usw2.cache.amazonaws.com"
                }
            }
        ], 
        "ClusterEnabled": false, 
        "ReplicationGroupId": "redis1x3", 
        "SnapshotRetentionLimit": 1, 
        "AutomaticFailover": "enabled", 
        "MultiAZ": "enabled",
        "SnapshotWindow": "11:30-12:30", 
        "SnapshottingClusterId": "redis1x3-002", 
        "MemberClusters": [
            "redis1x3-001", 
            "redis1x3-002", 
            "redis1x3-003"
        ], 
        "CacheNodeType": "cache.m3.medium", 
        "DataTiering": "disabled",
        "PendingModifiedValues": {}
    }
}
```

要跟踪故障转移的进度，请使用 Amazon CLI `describe-events` 操作。

有关更多信息，请参阅下列内容：
+ *Amazon CLI 命令参考*中的 [test-failover](https://docs.amazonaws.cn/cli/latest/reference/elasticache/test-failover.html)。
+ *Amazon CLI 命令参考*中的 [describe-events](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-events.html)。

 

### 使用 ElastiCache API 测试自动故障转移
<a name="auto-failover-test-api"></a>

您可以使用 ElastiCache API 操作 `TestFailover`，对任意启用了多可用区的集群测试自动故障转移。

**参数**
+ `ReplicationGroupId` – 必需。要测试的复制组（在控制台上为集群）。
+ `NodeGroupId` – 必需。要在其上测试自动故障转移的节点组的名称。在 24 小时滚动期间您最多可以测试 15 个节点组。

以下示例在复制组 (在控制台上为集群) `redis00-0003` 中的节点组 `redis00` 上测试自动故障转移。

**Example 测试自动故障转移**  

```
https://elasticache.us-west-2.amazonaws.com/
    ?Action=TestFailover
    &NodeGroupId=redis00-0003
    &ReplicationGroupId=redis00
    &Version=2015-02-02
    &SignatureVersion=4
    &SignatureMethod=HmacSHA256
    &Timestamp=20140401T192317Z
    &X-Amz-Credential=<credential>
```

要跟踪故障转移的进度，请使用 ElastiCache `DescribeEvents` API 操作。

有关更多信息，请参阅下列内容：
+ *ElastiCache API 参考*中的 [TestFailover](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_TestFailover.html) 
+ *ElastiCache API 参考*中的 [DescribeEvents](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeEvents.html) 

 

## 多可用区限制
<a name="AutoFailover.Limitations"></a>

请注意多可用区的以下限制：
+ Valkey 以及 Redis OSS 版本 2.8.6 和更高版本支持多可用区。
+ T1 节点类型不支持多可用区。
+ Valkey 和 Redis OSS 复制是异步的。因此，当主节点故障转移到副本时，可能因复制滞后导致丢失少量数据。

  在选择要提升为主节点的副本时，ElastiCache 会选择复制滞后最小的副本。换句话说，它选择最新的副本。这样做有助于最大程度地减少丢失的数据量。复制滞后最小的副本可以位于同一发生故障的主节点中，也可以位于不同于发生故障的主节点的可用区中。
+ 在 Valkey 或 Redis OSS 集群（已禁用集群模式）上手动将只读副本提升为主副本时，您只能在多可用区和自动失效转移功能已禁用时才能执行此操作。要将只读副本提升为主副本，请执行以下步骤：

  1. 禁用集群上的多可用区。

  1. 禁用集群上的自动故障转移。您可以在控制台中取消选中复制组的**自动失效转移**复选框来执行此操作。您可以使用 Amazon CLI 来执行此操作，具体方法是在调用 `ModifyReplicationGroup` 操作时将 `AutomaticFailoverEnabled` 属性设置为 `false`。

  1. 将只读副本提升为主集群。

  1. 重新启用多可用区。
+ ElastiCache for Redis OSS 多可用区和仅附加文件（AOF）相互排斥。启用了一个则不能启用另一个。
+ 节点的故障可能是因极少出现的整个可用区故障造成的。在此情况下，仅在备份可用区时才会创建替换故障主副本的副本。例如，假设一个复制组的主节点在 AZ-a 中且副本在 AZ-b 和 AZ-c 中。如果主节点出现故障，则复制滞后最小的副本将提升为主集群。随后，只有在 AZ-a 已备份且可用时，ElastiCache 才会在 AZ-a（发生故障的主集群的位置）中创建新的副本。
+ 客户发起的主节点重启不会触发自动故障转移。其他重启和故障会触发自动故障转移。
+ 在重启主节点后，将在其重新联机时清除其数据。当只读副本查看清除的主集群时，它们将清除其数据的副本，这会导致数据丢失。
+ 在提升只读副本后，另一个副本将与新的主节点同步。初始同步后，副本的内容将被删除，它们会同步来自新主节点的数据。此同步过程会导致短暂的中断，在此期间无法访问复制副本。此同步过程还导致在与副本同步时增加主节点上的临时负载。此行为是 Valkey 和 Redis OSS 原生的，不是 ElastiCache 多可用区所独有的。有关此行为的详细信息，请参阅 Valkey 网站上的[复制](http://valkey.io/topics/replication)。

**重要**  
对于 Valkey 7.2.6 及更高版本或 Redis OSS 2.8.22 及更高版本，您无法创建外部副本。  
对于 2.8.22 之前的 Redis OSS 版本，建议您不要将外部副本连接到启用了多可用区的 ElastiCache 集群。这些版本的配置不受支持，会引发导致 ElastiCache 无法正常执行故障转移和恢复的问题。要将外部副本连接到 ElastiCache 集群，请确保在建立连接之前未启用多可用区。

# 如何实施同步和备份
<a name="Replication.Redis.Versions"></a>

所有支持的 Valkey 和 Redis OSS 版本均支持在主节点与副本节点之间备份和同步。但是，实施备份和同步的方式因版本而异。

## Redis OSS 版本 2.8.22 及更高版本
<a name="Replication.Redis.Version2-8-22"></a>

在 2.8.22 及更高版本中，Redis OSS 复制有两种方法可以选择。有关更多信息，请参阅[2.8.22 版之前的 Redis OSS](#Replication.Redis.Earlier2-8-22)和[快照和还原](backups.md)。

在无分支过程中，如果写入负载较重，则对集群的写入将延迟，以确保您不会累积太多更改并因而阻止成功快照。

## 2.8.22 版之前的 Redis OSS
<a name="Replication.Redis.Earlier2-8-22"></a>

2.8.22 版之前的 Redis OSS 备份和同步过程分为三步。

1. 分支以及后台进程会将集群数据序列化到磁盘。这将创建时间点快照。

1. 在前台中，在*客户端输出缓冲区* 中累积更改日志。
**重要**  
如果更改日志超出了*客户端输出缓冲区* 大小，则备份或同步将失败。有关更多信息，请参阅 [确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)。

1. 最后，依次将缓存数据和更改日志传输到副本节点。

# 创建 Valkey 或 Redis OSS 复制组
<a name="Replication.CreatingRepGroup"></a>

在创建具有副本节点的集群时，您有以下选择。当您已有一个可用 Valkey 或 Redis OSS（已禁用集群模式）集群且此集群未与具有要用作主节点的副本的任何集群关联时，其中一个选项适用。当您需要使用集群和只读副本创建主节点时，会应用另一个选择。目前，Valkey 或 Redis OSS（已启用集群模式）集群必须从头开始创建。

**选项 1：[使用现有集群创建复制组](Replication.CreatingReplGroup.ExistingCluster.md)**  
使用此选项可使用现有单节点 Valkey 或 Redis OSS（已禁用集群模式）集群。您可以指定此现有节点作为新集群中的主节点，然后单独向集群中添加 1 到 5 个只读副本。如果现有集群处于活动状态，则只读副本在创建时都将与该集群同步。请参阅[使用现有集群创建复制组](Replication.CreatingReplGroup.ExistingCluster.md)。  
无法使用现有集群创建 Valkey 或 Redis OSS（已启用集群模式）集群。若要使用 ElastiCache 控制台创建 Valkey 或 Redis OSS（已启用集群模式）集群（API/CLI：复制组），请参阅 [创建 Valkey 或 Redis OSS（已启用集群模式）集群（控制台）](Clusters.Create.md#Clusters.Create.CON.RedisCluster)。

**选项 2：[从头开始创建 Valkey 或 Redis OSS 复制组](Replication.CreatingReplGroup.NoExistingCluster.md)**  
如果您还没有任何可用的 Valkey 或 Redis OSS（禁用集群模式）集群以用作集群的主节点，或者您希望创建 Valkey 或 Redis OSS（启用集群模式）集群，请使用此选项。请参阅[从头开始创建 Valkey 或 Redis OSS 复制组](Replication.CreatingReplGroup.NoExistingCluster.md)。

# 使用现有集群创建复制组
<a name="Replication.CreatingReplGroup.ExistingCluster"></a>

以下操作将向您的 Valkey 或 Redis OSS（已禁用集群模式）单节点集群添加一个复制组，这是将集群升级至 Valkey 最新版本的必要步骤。这是一个就地操作，全程零停机时间且零数据丢失。当您为单节点集群创建复制组时，该集群节点将成为新集群的主节点。如果您没有可用作新集群的主集群的 Valkey 或 Redis OSS（已禁用集群模式）集群，请参阅[从头开始创建 Valkey 或 Redis OSS 复制组](Replication.CreatingReplGroup.NoExistingCluster.md)。

可用的集群是现有的单节点 Valkey 或 Redis OSS 集群。当前，Valkey 或 Redis OSS（已启用集群模式）不支持使用可用的单节点集群创建具有副本的集群。如果您要创建 Valkey 或 Redis OSS（已启用集群模式）集群，请参阅[创建 Valkey 或 Redis OSS（已启用集群模式）集群（控制台）](Replication.CreatingReplGroup.NoExistingCluster.Cluster.md#Replication.CreatingReplGroup.NoExistingCluster.Cluster.CON)。

## 使用现有集群创建复制组（控制台）
<a name="Replication.CreatingReplGroup.ExistingCluster.CON"></a>

请参阅主题[使用 ElastiCache Amazon Web Services 管理控制台](Clusters.AddNode.md#Clusters.AddNode.CON)。

## 使用可用 Valkey 或 Redis OSS 集群创建复制组（Amazon CLI）
<a name="Replication.CreatingReplGroup.ExistingCluster.CLI"></a>

使用Amazon CLI时，在将可用 Valkey 或 Redis OSS 缓存集群用作主集群时，可使用只读副本通过两个步骤创建复制组。

使用时，Amazon CLI您可以创建一个复制组，将可用的独立节点指定为集群的主节点，`--primary-cluster-id`并使用 CLI 命令指定集群中要包含的节点数量`create-replication-group`。包括以下参数。

**--replication-group-id**  
正在创建的复制组的名称。此参数的值用作所添加节点的名称的基础，方法是向 `--replication-group-id` 末尾添加一个连续的 3 位数。例如 `sample-repl-group-001`。  
Valkey 或 Redis OSS（已禁用集群模式）复制组命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。

**--replication-group-description**  
复制组的描述。

**--num-node-groups**  
您希望此集群中包含的节点数。此值包含主节点。此参数的最大值为 6。

**--primary-cluster-id**  
要用作此复制组中主节点的可用 Valkey 或 Redis OSS（已禁用集群模式）集群的节点的名称。

以下命令通过将可用 Valkey 或 Redis OSS（已禁用集群模式）集群 `redis01` 用作复制组的主节点来创建复制组 `sample-repl-group`。它将创建 2 个为只读副本的新节点。`redis01` 的设置（即参数组、安全组、节点类型、引擎版本等）将应用于复制组中的所有节点。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-replication-group \
   --replication-group-id sample-repl-group \
   --replication-group-description "demo cluster with replicas" \
   --num-cache-clusters 3 \
   --primary-cluster-id redis01
```

对于 Windows：

```
aws elasticache create-replication-group ^
   --replication-group-id sample-repl-group ^
   --replication-group-description "demo cluster with replicas" ^
   --num-cache-clusters 3 ^
   --primary-cluster-id redis01
```

有关您可能要使用的其他信息和参数，请参阅Amazon CLI主题[create-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-replication-group.html)。

**接下来，向复制组添加只读副本**  
创建复制组后，使用 `create-cache-cluster` 命令向复制组添加 1 到 5 个只读副本，并确保包含以下参数。

**--cache-cluster-id**  
正在向复制组添加的集群的名称。  
集群命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。


**--replication-group-id**  
正在将此集群添加到的复制组的名称。

对要添加到复制组的每个只读副本重复此命令，并仅更改 `--cache-cluster-id` 参数的值。

**注意**  
请记住，一个复制组最多只能有五个只读副本。尝试向已有五个只读副本的复制组添加只读副本会导致操作失败。

以下代码将只读副本 `my-replica01` 添加到复制组 `sample-repl-group`。主集群的设置（参数组、安全组、节点类型等）将在节点添加到复制组时应用到节点。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-cache-cluster \
   --cache-cluster-id my-replica01 \
   --replication-group-id sample-repl-group
```

对于 Windows：

```
aws elasticache create-cache-cluster ^
   --cache-cluster-id my-replica01 ^
   --replication-group-id sample-repl-group
```

此命令的输出如下所示。

```
{
    "ReplicationGroup": {
        "Status": "creating",
        "Description": "demo cluster with replicas",
        "ClusterEnabled": false,
        "ReplicationGroupId": "sample-repl-group",
        "SnapshotRetentionLimit": 1,
        "AutomaticFailover": "disabled",
        "SnapshotWindow": "00:00-01:00",
        "SnapshottingClusterId": "redis01",
        "MemberClusters": [
            "sample-repl-group-001",
            "sample-repl-group-002",
            "redis01"
        ],
        "CacheNodeType": "cache.m4.large",
        "DataTiering": "disabled",
        "PendingModifiedValues": {}
    }
}
```

有关更多信息，请参阅以下Amazon CLI主题：
+ [create-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-replication-group.html)
+ [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)

## 向独立 Valkey 或 Redis OSS（已禁用集群模式）集群添加副本 (API) ElastiCache
<a name="Replication.CreatingReplGroup.ExistingCluster.API"></a>

使用 ElastiCache API 时，您可以创建一个复制组，将可用的独立节点指定为集群的主节点，`PrimaryClusterId`并使用 CLI 命令指定集群中要包含的节点数量`CreateReplicationGroup`。包括以下参数。

**ReplicationGroupId**  
正在创建的复制组的名称。此参数的值用作所添加节点的名称的基础，方法是向 `ReplicationGroupId` 末尾添加一个连续的 3 位数。例如 `sample-repl-group-001`。  
Valkey 或 Redis OSS（已禁用集群模式）复制组命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。

**ReplicationGroupDescription**  
有副本的集群的描述。

**NumCacheClusters**  
您希望此集群中包含的节点数。此值包含主节点。此参数的最大值为 6。

**PrimaryClusterId**  
要用作此集群中主节点的可用 Valkey 或 Redis OSS（已禁用集群模式）集群的名称。

以下命令通过将可用 Valkey 或 Redis OSS（已禁用集群模式）集群 `redis01` 用作复制组的主节点来创建具有副本的集群 `sample-repl-group`。它将创建 2 个为只读副本的新节点。`redis01` 的设置（即参数组、安全组、节点类型、引擎版本等）将应用于复制组中的所有节点。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=CreateReplicationGroup 
   &Engine=redis
   &EngineVersion=6.0
   &ReplicationGroupDescription=Demo%20cluster%20with%20replicas
   &ReplicationGroupId=sample-repl-group
   &PrimaryClusterId=redis01
   &Version=2015-02-02
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

有关更多信息，请参阅 ElastiCache APL 主题：
+ [CreateReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateReplicationGroup.html)
+ [ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)

**接下来，向复制组添加只读副本**  
创建复制组后，使用 `CreateCacheCluster` 操作向复制组添加 1 到 5 个只读副本，并确保包含以下参数。

**CacheClusterId**  
正在向复制组添加的集群的名称。  
集群命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。


**ReplicationGroupId**  
正在将此集群添加到的复制组的名称。

对要添加到复制组的每个只读副本重复此操作，并仅更改 `CacheClusterId` 参数的值。

以下代码将只读副本 `myReplica01` 添加到复制组 `myReplGroup`。主集群的设置（参数组、安全组、节点类型等）将在节点添加到复制组时应用到节点。

```
https://elasticache.us-west-2.amazonaws.com/
	?Action=CreateCacheCluster
	&CacheClusterId=myReplica01
	&ReplicationGroupId=myReplGroup
	&SignatureMethod=HmacSHA256
	&SignatureVersion=4
	&Version=2015-02-02
	&X-Amz-Algorithm=&AWS;4-HMAC-SHA256
	&X-Amz-Credential=[your-access-key-id]/20150202/us-west-2/elasticache/aws4_request
	&X-Amz-Date=20150202T170651Z
	&X-Amz-SignedHeaders=content-type;host;user-agent;x-amz-content-sha256;x-amz-date
	&X-Amz-Signature=[signature-value]
```

有关您可能要使用的其他信息和参数，请参阅 ElastiCache API 主题[CreateCacheCluster](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateCacheCluster.html)。

# 从头开始创建 Valkey 或 Redis OSS 复制组
<a name="Replication.CreatingReplGroup.NoExistingCluster"></a>

接下来，您可以找到如何在不将现有 Valkey 或 Redis OSS 集群用作主集群的情况下创建 Valkey 或 Redis OSS 复制组。您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 从头开始创建 Valkey 或 Redis OSS（已禁用集群模式）或 Valkey 或 Redis OSS（已启用集群模式）复制组。

在继续之前，请确定您希望创建 Valkey 或 Redis OSS（已禁用集群模式）复制组还是 Valkey 或 Redis OSS（已启用集群模式）复制组。有关如何做出决定的指南，请参阅[复制：Valkey 和 Redis OSS 已禁用集群模式与已启用集群模式](Replication.Redis-RedisCluster.md)。

**Topics**
+ [

# 从头创建 Valkey 或 Redis OSS（已禁用集群模式）复制组
](Replication.CreatingReplGroup.NoExistingCluster.Classic.md)
+ [

# 从头开始在 Valkey 或 Redis OSS（已启用集群模式）中创建复制组
](Replication.CreatingReplGroup.NoExistingCluster.Cluster.md)

# 从头创建 Valkey 或 Redis OSS（已禁用集群模式）复制组
<a name="Replication.CreatingReplGroup.NoExistingCluster.Classic"></a>

您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 从头创建 Valkey 或 Redis OSS（已禁用集群模式）复制组。Valkey 或 Redis OSS（已禁用集群模式）复制组始终有一个节点组、一个主集群和最多 5 个只读副本。Valkey 或 Redis OSS（已禁用集群模式）复制组不支持对数据分区。

**注意**  
每个集群的节点/分片限制最高可提高到 500。若要请求提高限制，请参阅 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 并在请求中包含实例类型。

要从头开始创建 Valkey 或 Redis OSS（已禁用集群模式）复制组，请采用以下方法之一：

## 从头创建 Valkey 或 Redis OSS（已禁用集群模式）复制组（Amazon CLI）
<a name="Replication.CreatingReplGroup.NoExistingCluster.Classic.CLI"></a>

以下过程使用 Amazon CLI 创建 Valkey 或 Redis OSS（已禁用集群模式）复制组。

在从头开始创建 Valkey 或 Redis OSS（已禁用集群模式）复制组时，会通过单次调用 Amazon CLI `create-replication-group` 命令创建该复制组及其所有节点。包括以下参数。

**--replication-group-id**  
正在创建的复制组的名称。  
Valkey 或 Redis OSS（已禁用集群模式）复制组命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。

**--replication-group-description**  
复制组的描述。

**--num-cache-clusters**  
要使用此复制组、主集群和只读副本创建的节点的数目。  
如果您启用多可用区 (`--automatic-failover-enabled`)，则 `--num-cache-clusters` 值必须至少为 2。

**--cache-node-type**  
复制组中的每个节点的节点类型。  
ElastiCache 支持以下节点类型。一般而言，与其上一代类型对应项相比，最新一代类型以更低的成本提供了更多内存和计算能力。  
有关各节点类型性能详细信息，请参阅 [Amazon EC2 实例类型](https://www.amazonaws.cn/ec2/instance-types/)。

**--data-tiering-enabled**  
如果您使用的是 r6gd 节点类型，请设置此参数。如果您不想使用数据分层功能，则设置 `--no-data-tiering-enabled`。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

**--cache-parameter-group**  
指定与您的引擎版本对应的参数组。如果您运行的是 Redis OSS 3.2.4 或更高版本，请指定 `default.redis3.2` 参数组或者从 `default.redis3.2` 派生的参数组来创建 Valkey 或 Redis OSS（已禁用集群模式）复制组。有关更多信息，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。

**--network-type**  
`ipv4`、`ipv6` 或 `dual-stack`。如果选择双堆栈，则必须将 `--IpDiscovery` 参数设置为 `ipv4` 或 `ipv6`。

**--engine**  
redis

**--engine-version**  
要拥有最丰富的功能，请选择最新的引擎版本。

节点的名称会通过将 `-00`*\$1* 添加到复制组名称的后面，从复制组名称得出。例如，通过使用复制组名称 `myReplGroup`，主集群的名称将为 `myReplGroup-001` 以及只读副本的名称将为 `myReplGroup-002` 到 `myReplGroup-006`。

如果要在复制组上启用传输中加密或静态加密，请添加 `--transit-encryption-enabled` 和/或 `--at-rest-encryption-enabled` 参数并满足以下条件。
+ 您的复制组必须运行 Redis OSS 版本 3.2.6 或 4.0.10。
+ 复制组必须在 Amazon VPC 中创建。
+ 还必须包含参数 `--cache-subnet-group`。
+ 还必须提供 `--auth-token` 参数以及客户为对此集群执行操作所需的 AUTH 令牌指定的字符串值（密码）。

以下操作使用三个节点（一个主节点和两个副本节点）创建 Valkey 或 Redis OSS（已禁用集群模式）复制组 `sample-repl-group`。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-replication-group \
   --replication-group-id sample-repl-group \
   --replication-group-description "Demo cluster with replicas" \
   --num-cache-clusters 3 \
   --cache-node-type cache.m4.large \ 
   --engine redis
```

对于 Windows：

```
aws elasticache create-replication-group ^
   --replication-group-id sample-repl-group ^
   --replication-group-description "Demo cluster with replicas" ^
   --num-cache-clusters 3 ^
   --cache-node-type cache.m4.large ^  
   --engine redis
```

此命令的输出如下所示。

```
{
    "ReplicationGroup": {
        "Status": "creating",
        "Description": "Demo cluster with replicas",
        "ClusterEnabled": false,
        "ReplicationGroupId": "sample-repl-group",
        "SnapshotRetentionLimit": 0,
        "AutomaticFailover": "disabled",
        "SnapshotWindow": "01:30-02:30",
        "MemberClusters": [
            "sample-repl-group-001",
            "sample-repl-group-002",
            "sample-repl-group-003"
        ],
        "CacheNodeType": "cache.m4.large",
        "DataTiering": "disabled",
        "PendingModifiedValues": {}
    }
}
```

有关其他信息和可能要使用的参数，请参阅 Amazon CLI 主题 [create-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-replication-group.html)。

## 从头开始创建 Valkey 或 Redis OSS（已禁用集群模式）复制组（ElastiCache API）
<a name="Replication.CreatingReplGroup.NoExistingCluster.Classic.API"></a>

以下过程使用 ElastiCache API 创建 Valkey 或 Redis OSS（已禁用集群模式）复制组。

在从头开始创建 Valkey 或 Redis OSS（已禁用集群模式）复制组时，会通过单次调用 ElastiCache API `CreateReplicationGroup` 操作来创建该复制组及其所有节点。包括以下参数。

**ReplicationGroupId**  
正在创建的复制组的名称。  
Valkey 或 Redis OSS（已启用集群模式）复制组命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。

**ReplicationGroupDescription**  
您对复制组的描述。

**NumCacheClusters**  
要使用此复制组、主集群和只读副本创建的节点的总数。  
如果您启用多可用区 (`AutomaticFailoverEnabled=true`)，则 `NumCacheClusters` 值必须至少为 2。

**CacheNodeType**  
复制组中的每个节点的节点类型。  
ElastiCache 支持以下节点类型。一般而言，与其上一代类型对应项相比，最新一代类型以更低的成本提供了更多内存和计算能力。  
有关各节点类型性能详细信息，请参阅 [Amazon EC2 实例类型](https://www.amazonaws.cn/ec2/instance-types/)。

**--data-tiering-enabled**  
如果您使用的是 r6gd 节点类型，请设置此参数。如果您不想使用数据分层功能，则设置 `--no-data-tiering-enabled`。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

**CacheParameterGroup**  
指定与您的引擎版本对应的参数组。如果您运行的是 Redis OSS 3.2.4 或更高版本，请指定 `default.redis3.2` 参数组或者从 `default.redis3.2` 派生的参数组来创建 Valkey 或 Redis OSS（已禁用集群模式）复制组。有关更多信息，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。

**--network-type**  
`ipv4`、`ipv` 或 `dual-stack`。如果选择双堆栈，则必须将 `--IpDiscovery` 参数设置为 `ipv4` 或 `ipv6`。

**引擎**  
redis

**EngineVersion**  
6.0

节点的名称会通过将 `-00`*\$1* 添加到复制组名称的后面，从复制组名称得出。例如，通过使用复制组名称 `myReplGroup`，主集群的名称将为 `myReplGroup-001` 以及只读副本的名称将为 `myReplGroup-002` 到 `myReplGroup-006`。

如果要在复制组上启用传输中加密或静态加密，请添加 `TransitEncryptionEnabled=true` 和/或 `AtRestEncryptionEnabled=true` 参数并满足以下条件。
+ 您的复制组必须运行 Redis OSS 版本 3.2.6 或 4.0.10。
+ 复制组必须在 Amazon VPC 中创建。
+ 还必须包含参数 `CacheSubnetGroup`。
+ 还必须提供 `AuthToken` 参数以及客户为对此集群执行操作所需的 AUTH 令牌指定的字符串值（密码）。

以下操作使用三个节点（一个主节点和两个副本节点）创建 Valkey 或 Redis OSS（已禁用集群模式）复制组 `myReplGroup`。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=CreateReplicationGroup 
   &CacheNodeType=cache.m4.large
   &CacheParameterGroup=default.redis6.x
   &Engine=redis
   &EngineVersion=6.0
   &NumCacheClusters=3
   &ReplicationGroupDescription=test%20group
   &ReplicationGroupId=myReplGroup
   &Version=2015-02-02
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

有关其他信息和可能要使用的参数，请参阅 ElastiCache API 主题 [CreateReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateReplicationGroup.html)。

# 从头开始在 Valkey 或 Redis OSS（已启用集群模式）中创建复制组
<a name="Replication.CreatingReplGroup.NoExistingCluster.Cluster"></a>

您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 创建 Valkey 或 Redis OSS（已启用集群模式）集群（API/CLI：*复制组*）。Valkey 或 Redis OSS（已启用集群模式）复制组可以有 1 到 500 个分片（API/CLI：节点组）；每个分片中可以有一个主节点，以及最多 5 个只读副本。您可以创建具有更多分片和更少副本的集群，每个集群最多可包含 90 个节点。此集群配置的范围可以从 90 个分片和 0 个副本到 15 个分片和 5 个副本，这是允许的最大副本数。

如果引擎为 Valkey 或 Redis OSS 5.0.6 或更高版本，您可以将每个集群的节点或分片限制增至最多 500 个。例如，您可以选择配置一个 500 节点的集群，范围介于 83 个分片（一个主分片和 5 个副本分片）和 500 个分片（一个主分片，无副本分片）之间。确保可提供足够的 IP 地址来满足增长需求。常见的陷阱包括子网组中的子网 CIDR 范围太小，或者子网被其他集群共享和大量使用。有关更多信息，请参阅 [创建子网组](SubnetGroups.Creating.md)。

 对于低于 5.0.6 的版本，每个集群的限制为 250。

若要请求提高限制，请参阅 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 并选择限制类型 **Nodes per cluster per instance type（每个实例类型的每个集群的节点数）**。

**Topics**
+ [使用 ElastiCache 控制台](#Replication.CreatingReplGroup.NoExistingCluster.Cluster.CON)
+ [

## 从头开始创建 Valkey 或 Redis OSS（已启用集群模式）复制组（Amazon CLI）
](#Replication.CreatingReplGroup.NoExistingCluster.Cluster.CLI)
+ [

## 从头开始在 Valkey 或 Redis OSS（已启用集群模式）中创建复制组（ElastiCache API）
](#Replication.CreatingReplGroup.NoExistingCluster.Cluster.API)

## 创建 Valkey 或 Redis OSS（已启用集群模式）集群（控制台）
<a name="Replication.CreatingReplGroup.NoExistingCluster.Cluster.CON"></a>

要创建 Valkey 或 Redis OSS（已启用集群模式）集群，请参阅[创建 Valkey 或 Redis OSS（已启用集群模式）集群（控制台）](Clusters.Create.md#Clusters.Create.CON.RedisCluster)。请确保启用集群模式 **Cluster Mode enabled (Scale Out)（启用集群模式（横向扩展））**，并在每个模式中指定至少两个分片和一个副本节点。

## 从头开始创建 Valkey 或 Redis OSS（已启用集群模式）复制组（Amazon CLI）
<a name="Replication.CreatingReplGroup.NoExistingCluster.Cluster.CLI"></a>

以下过程为使用 Amazon CLI 创建 Valkey 或 Redis OSS（已启用集群模式）复制组。

在从头开始创建 Valkey 或 Redis OSS（已启用集群模式）复制组时，会通过单次调用 Amazon CLI `create-replication-group` 命令创建该复制组及其所有节点。包括以下参数。

**--replication-group-id**  
正在创建的复制组的名称。  
Valkey 或 Redis OSS（已启用集群模式）复制组命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。

**--replication-group-description**  
复制组的描述。

**--cache-node-type**  
复制组中的每个节点的节点类型。  
ElastiCache 支持以下节点类型。一般而言，与其上一代类型对应项相比，最新一代类型以更低的成本提供了更多内存和计算能力。  
有关各节点类型性能详细信息，请参阅 [Amazon EC2 实例类型](https://www.amazonaws.cn/ec2/instance-types/)。

**--data-tiering-enabled**  
如果您使用的是 r6gd 节点类型，请设置此参数。如果您不想使用数据分层功能，则设置 `--no-data-tiering-enabled`。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

**--cache-parameter-group**  
指定 `default.redis6.x.cluster.on` 参数组或者派生自 `default.redis6.x.cluster.on` 的参数组以创建 Valkey 或 Redis OSS（已启用集群模式）复制组。有关更多信息，请参阅 [Redis OSS 6.x 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.6-x)。

**--engine**  
redis

**--engine-version**  
3.2.4

**--num-node-groups**  
此复制组中的节点组数量。有效值为 1 到 500。  
每个集群的节点/分片限制最高可提高到 500。若要请求提高限制，请参阅 [Amazon Service Limits](https://docs.amazonaws.cn/general/latest/gr/aws_service_limits.html) 并选择限制类型“Nodes per cluster per instance type（每个实例类型的每个集群的节点数）”。

**--replicas-per-node-group**  
各节点组中的副本节点数量。有效值为 0 到 5。

**--network-type**  
`ipv4`、`ipv` 或 `dual-stack`。如果选择双堆栈，则必须将 `--IpDiscovery` 参数设置为 `ipv4` 或 `ipv6`。

如果要在复制组上启用传输中加密或静态加密，请添加 `--transit-encryption-enabled` 和/或 `--at-rest-encryption-enabled` 参数并满足以下条件。
+ 您的复制组必须运行 Redis OSS 版本 3.2.6 或 4.0.10。
+ 复制组必须在 Amazon VPC 中创建。
+ 还必须包含参数 `--cache-subnet-group`。
+ 还必须提供 `--auth-token` 参数以及客户为对此集群执行操作所需的 AUTH 令牌指定的字符串值（密码）。

以下操作创建具有三个节点组/分片（--num-node-groups）的 Valkey 或 Redis OSS（已启用集群模式）复制组 `sample-repl-group`，每个节点组/分片具有三个节点，即一个主节点和两个只读副本（--replicas-per-node-group）。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-replication-group \
   --replication-group-id sample-repl-group \
   --replication-group-description "Demo cluster with replicas" \
   --num-node-groups 3 \
   --replicas-per-node-group 2 \
   --cache-node-type cache.m4.large \ 
   --engine redis \   
   --security-group-ids SECURITY_GROUP_ID \    
   --cache-subnet-group-name SUBNET_GROUP_NAME>
```

对于 Windows：

```
aws elasticache create-replication-group ^
   --replication-group-id sample-repl-group ^
   --replication-group-description "Demo cluster with replicas" ^
   --num-node-groups 3 ^
   --replicas-per-node-group 2 ^
   --cache-node-type cache.m4.large ^ 
   --engine redis ^   
   --security-group-ids SECURITY_GROUP_ID ^      
   --cache-subnet-group-name SUBNET_GROUP_NAME>
```

之前的命令生成以下输出。

```
{
    "ReplicationGroup": {
        "Status": "creating", 
        "Description": "Demo cluster with replicas", 
        "ReplicationGroupId": "sample-repl-group", 
        "SnapshotRetentionLimit": 0, 
        "AutomaticFailover": "enabled", 
        "SnapshotWindow": "05:30-06:30", 
        "MemberClusters": [
            "sample-repl-group-0001-001", 
            "sample-repl-group-0001-002", 
            "sample-repl-group-0001-003", 
            "sample-repl-group-0002-001", 
            "sample-repl-group-0002-002", 
            "sample-repl-group-0002-003", 
            "sample-repl-group-0003-001", 
            "sample-repl-group-0003-002", 
            "sample-repl-group-0003-003"
        ], 
        "PendingModifiedValues": {}
    }
}
```

在您从头开始创建 Valkey 或 Redis OSS（已启用集群模式）复制组时，您可以使用 `--node-group-configuration` 参数配置集群中的每个分片，如下例中所示，其中配置了两个节点组（控制台：分片）。第一个分片有两个节点：一个主节点和一个只读副本节点。第二个分片有三个节点：一个主节点和两个只读副本节点。

**--node-group-configuration**  
各节点组的配置。`--node-group-configuration` 参数包括以下字段。  
+ `PrimaryAvailabilityZone` – 此节点组的主节点所在的可用区。如果忽略此参数，ElastiCache 会选择主节点的可用区。

  **示例：** us-west-2a。
+ `ReplicaAvailabilityZones` – 只读副本所在可用区的列表，以逗号分隔。此列表中的可用区数量必须与 `ReplicaCount` 的值匹配。如果忽略此参数，ElastiCache 会选择复制节点的可用区。

  **示例：**"us-west-2a,us-west-2b,us-west-2c"
+ `ReplicaCount` – 此节点组中的副本节点数量。
+ `Slots` – 指定节点组的键空间的字符串。字符串的格式为 `startKey-endKey`。如果忽略此参数，ElastiCache 会在所有节点组之间均匀分配键。

  **示例：** "0-4999"

   

以下操作创建具有两个节点组/分片（`--num-node-groups`）的 Valkey 或 Redis OSS（已启用集群模式）复制组 `new-group`。与前例不同，各节点组配置为彼此不同 (`--node-group-configuration`)。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-replication-group \
  --replication-group-id new-group \
  --replication-group-description "Sharded replication group" \
  --engine redis \    
  --snapshot-retention-limit 8 \
  --cache-node-type cache.m4.medium \
  --num-node-groups 2 \
  --node-group-configuration \
      "ReplicaCount=1,Slots=0-8999,PrimaryAvailabilityZone='us-east-1c',ReplicaAvailabilityZones='us-east-1b'" \
      "ReplicaCount=2,Slots=9000-16383,PrimaryAvailabilityZone='us-east-1a',ReplicaAvailabilityZones='us-east-1a','us-east-1c'"
```

对于 Windows：

```
aws elasticache create-replication-group ^
  --replication-group-id new-group ^
  --replication-group-description "Sharded replication group" ^
  --engine redis ^    
  --snapshot-retention-limit 8 ^
  --cache-node-type cache.m4.medium ^
  --num-node-groups 2 ^
  --node-group-configuration \
      "ReplicaCount=1,Slots=0-8999,PrimaryAvailabilityZone='us-east-1c',ReplicaAvailabilityZones='us-east-1b'" \
      "ReplicaCount=2,Slots=9000-16383,PrimaryAvailabilityZone='us-east-1a',ReplicaAvailabilityZones='us-east-1a','us-east-1c'"
```

之前的操作生成以下输出。

```
{
    "ReplicationGroup": {
        "Status": "creating", 
        "Description": "Sharded replication group", 
        "ReplicationGroupId": "rc-rg", 
        "SnapshotRetentionLimit": 8, 
        "AutomaticFailover": "enabled", 
        "SnapshotWindow": "10:00-11:00", 
        "MemberClusters": [
            "rc-rg-0001-001", 
            "rc-rg-0001-002", 
            "rc-rg-0002-001", 
            "rc-rg-0002-002", 
            "rc-rg-0002-003"
        ], 
        "PendingModifiedValues": {}
    }
}
```

有关其他信息和可能要使用的参数，请参阅 Amazon CLI 主题 [create-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-replication-group.html)。

## 从头开始在 Valkey 或 Redis OSS（已启用集群模式）中创建复制组（ElastiCache API）
<a name="Replication.CreatingReplGroup.NoExistingCluster.Cluster.API"></a>

以下过程使用 ElastiCache API 创建 Valkey 或 Redis OSS（已启用集群模式）复制组。

在从头开始创建 Valkey 或 Redis OSS（已启用集群模式）复制组时，会通过单次调用 ElastiCache API `CreateReplicationGroup` 操作来创建该复制组及其所有节点。包括以下参数。

**ReplicationGroupId**  
正在创建的复制组的名称。  
Valkey 或 Redis OSS（已启用集群模式）复制组命名约束如下：  
+ 必须包含 1 – 40 个字母数字字符或连字符。
+ 必须以字母开头。
+ 不能包含两个连续连字符。
+ 不能以连字符结束。

**ReplicationGroupDescription**  
复制组的描述。

**NumNodeGroups**  
您希望对此复制组创建的节点组数量。有效值为 1 到 500。

**ReplicasPerNodeGroup**  
各节点组中的副本节点数量。有效值为 0 到 5。

**NodeGroupConfiguration**  
各节点组的配置。`NodeGroupConfiguration` 参数包括以下字段。  
+ `PrimaryAvailabilityZone` – 此节点组的主节点所在的可用区。如果忽略此参数，ElastiCache 会选择主节点的可用区。

  **示例：** us-west-2a。
+ `ReplicaAvailabilityZones` – 只读副本所在可用区的列表。此列表中的可用区数量必须与 `ReplicaCount` 的值匹配。如果忽略此参数，ElastiCache 会选择复制节点的可用区。
+ `ReplicaCount` – 此节点组中的副本节点数量。
+ `Slots` – 指定节点组的键空间的字符串。字符串的格式为 `startKey-endKey`。如果忽略此参数，ElastiCache 会在所有节点组之间均匀分配键。

  **示例：** "0-4999"

   

**CacheNodeType**  
复制组中的每个节点的节点类型。  
ElastiCache 支持以下节点类型。一般而言，与其上一代类型对应项相比，最新一代类型以更低的成本提供了更多内存和计算能力。  
有关各节点类型性能详细信息，请参阅 [Amazon EC2 实例类型](https://www.amazonaws.cn/ec2/instance-types/)。

**--data-tiering-enabled**  
如果您使用的是 r6gd 节点类型，请设置此参数。如果您不想使用数据分层功能，则设置 `--no-data-tiering-enabled`。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

**CacheParameterGroup**  
指定 `default.redis6.x.cluster.on` 参数组或者派生自 `default.redis6.x.cluster.on` 的参数组以创建 Valkey 或 Redis OSS（已启用集群模式）复制组。有关更多信息，请参阅 [Redis OSS 6.x 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.6-x)。

**--network-type**  
`ipv4`、`ipv` 或 `dual-stack`。如果选择双堆栈，则必须将 `--IpDiscovery` 参数设置为 `ipv4` 或 `ipv6`。

**引擎**  
redis

**EngineVersion**  
6.0

如果要在复制组上启用传输中加密或静态加密，请添加 `TransitEncryptionEnabled=true` 和/或 `AtRestEncryptionEnabled=true` 参数并满足以下条件。
+ 您的复制组必须运行 Redis OSS 版本 3.2.6 或 4.0.10。
+ 复制组必须在 Amazon VPC 中创建。
+ 还必须包含参数 `CacheSubnetGroup`。
+ 还必须提供 `AuthToken` 参数以及客户为对此集群执行操作所需的 AUTH 令牌指定的字符串值（密码）。

添加换行符以便于阅读。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=CreateReplicationGroup 
   &CacheNodeType=cache.m4.large
   &CacheParemeterGroup=default.redis6.xcluster.on
   &Engine=redis
   &EngineVersion=6.0
   &NumNodeGroups=3
   &ReplicasPerNodeGroup=2
   &ReplicationGroupDescription=test%20group
   &ReplicationGroupId=myReplGroup
   &Version=2015-02-02
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

有关其他信息和可能要使用的参数，请参阅 ElastiCache API 主题 [CreateReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateReplicationGroup.html)。

# 查看复制组的详细信息
<a name="Replication.ViewDetails"></a>

有时候您可能希望查看复制组的详细信息。您可以使用 ElastiCache 控制台、Amazon CLI for ElastiCache 或 ElastiCache API。Valkey 或 Redis OSS（已禁用集群模式）和 Valkey 或 Redis OSS（已启用集群模式）的控制台流程不同。

**Contents**
+ [

# 查看具有副本的 Valkey 或 Redis OSS（已禁用集群模式）
](Replication.ViewDetails.Redis.md)
  + [使用 ElastiCache 控制台](Replication.ViewDetails.Redis.md#Replication.ViewDetails.Redis.CON)
  + [使用 Amazon CLI](Replication.ViewDetails.Redis.md#Replication.ViewDetails.Redis.CLI)
  + [使用 ElastiCache API](Replication.ViewDetails.Redis.md#Replication.ViewDetails.Redis.API)
+ [

# 查看复制组：Valkey 或 Redis OSS（已启用集群模式）
](Replication.ViewDetails.RedisCluster.md)
  + [使用 ElastiCache 控制台](Replication.ViewDetails.RedisCluster.md#Replication.ViewDetails.RedisCluster.CON)
  + [使用 Amazon CLI](Replication.ViewDetails.RedisCluster.md#Replication.ViewDetails.RedisCluster.CLI)
  + [使用 ElastiCache API](Replication.ViewDetails.RedisCluster.md#Replication.ViewDetails.RedisCluster.API)
+ [

# 查看复制组的详细信息 (Amazon CLI)
](Replication.ViewDetails.CLI.md)
+ [

# 查看复制组的详细信息 (ElastiCache API)
](Replication.ViewDetails.API.md)

# 查看具有副本的 Valkey 或 Redis OSS（已禁用集群模式）
<a name="Replication.ViewDetails.Redis"></a>

您可以使用 ElastiCache 控制台、Amazon CLI for ElastiCache 或 ElastiCache API 查看 Valkey 或 Redis OSS（已禁用集群模式）集群的详细信息（API/CLI：*复制组*）。

**Contents**
+ [使用 ElastiCache 控制台](#Replication.ViewDetails.Redis.CON)
+ [使用 Amazon CLI](#Replication.ViewDetails.Redis.CLI)
+ [使用 ElastiCache API](#Replication.ViewDetails.Redis.API)

## 查看 Valkey 或 Redis OSS（已禁用集群模式）复制组（控制台）
<a name="Replication.ViewDetails.Redis.CON"></a>

要使用 ElastiCache 控制台查看具有副本的 Valkey 或 Redis OSS（已禁用集群模式）集群的详细信息，请参阅主题[查看 Valkey 或 Redis OSS（已禁用集群模式）详细信息（控制台）](Clusters.ViewDetails.md#Clusters.ViewDetails.CON.Redis)。

## 查看 Valkey 或 Redis OSS（已禁用集群模式）复制组（Amazon CLI）
<a name="Replication.ViewDetails.Redis.CLI"></a>

有关演示 Valkey 或 Redis OSS（已禁用集群模式）复制组的详细信息的 Amazon CLI 示例，请参阅[查看复制组的详细信息 (Amazon CLI)](Replication.ViewDetails.CLI.md)。

## 查看 Valkey 或 Redis OSS（已禁用集群模式）复制组（ElastiCache API）
<a name="Replication.ViewDetails.Redis.API"></a>

有关演示 Valkey 或 Redis OSS（已禁用集群模式）复制组的详细信息的 ElastiCache API 示例，请参阅[查看复制组的详细信息 (ElastiCache API)](Replication.ViewDetails.API.md)。

# 查看复制组：Valkey 或 Redis OSS（已启用集群模式）
<a name="Replication.ViewDetails.RedisCluster"></a>

## 查看 Valkey 或 Redis OSS（已启用集群模式）集群（控制台）
<a name="Replication.ViewDetails.RedisCluster.CON"></a>

要使用 ElastiCache 控制台查看 Valkey 或 Redis OSS（已启用集群模式）集群的详细信息，请参阅[查看 Valkey 或 Redis OSS（已启用集群模式）集群的详细信息（控制台）](Clusters.ViewDetails.md#Clusters.ViewDetails.CON.RedisCluster)。

## 查看 Valkey 或 Redis OSS（已启用集群模式）集群的详细信息（Amazon CLI）
<a name="Replication.ViewDetails.RedisCluster.CLI"></a>

有关演示 Valkey 或 Redis OSS（已启用集群模式）复制组的详细信息的 ElastiCache CLI 示例，请参阅[查看复制组的详细信息 (Amazon CLI)](Replication.ViewDetails.CLI.md)。

## 查看 Valkey 或 Redis OSS（已启用集群模式）集群的详细信息（ElastiCache API）
<a name="Replication.ViewDetails.RedisCluster.API"></a>

有关演示 Valkey 或 Redis OSS（已启用集群模式）复制组的详细信息的 ElastiCache API 示例，请参阅[查看复制组的详细信息 (ElastiCache API)](Replication.ViewDetails.API.md)。

# 查看复制组的详细信息 (Amazon CLI)
<a name="Replication.ViewDetails.CLI"></a>

您可以使用 Amazon CLI `describe-replication-groups` 命令查看复制组的详细信息。使用以下可选参数来细化列表。忽略该参数将返回最多 100 个复制组的详细信息。

**可选参数**
+ `--replication-group-id` – 使用此参数列出特定复制组的详细信息。如果指定的复制组有多个节点组，则将按照节点组分组返回的结果。
+ `--max-items` – 使用此参数限制列出的复制组数量。`--max-items` 的值不能低于 20 或超过 100。

**Example**  
以下代码列出了最多 100 个复制组的详细信息。  

```
aws elasticache describe-replication-groups
```
以下代码列出了 `sample-repl-group` 的详细信息。  

```
aws elasticache describe-replication-groups --replication-group-id sample-repl-group
```
以下代码列出了 `sample-repl-group` 的详细信息。  

```
aws elasticache describe-replication-groups --replication-group-id sample-repl-group
```
以下代码列出了最多 25 个复制组的详细信息。  

```
aws elasticache describe-replication-groups --max-items 25
```
该操作输出类似以下的内容（JSON 格式）。  

```
{
   "ReplicationGroups": [
     {
       "Status": "available", 
       "Description": "test", 
       "NodeGroups": [
         {
            "Status": "available", 
               "NodeGroupMembers": [
                  {
                     "CurrentRole": "primary", 
                     "PreferredAvailabilityZone": "us-west-2a", 
                     "CacheNodeId": "0001", 
                     "ReadEndpoint": {
                        "Port": 6379, 
                        "Address": "rg-name-001.1abc4d.0001.usw2.cache.amazonaws.com"
                     }, 
                     "CacheClusterId": "rg-name-001"
                  }, 
                  {
                     "CurrentRole": "replica", 
                     "PreferredAvailabilityZone": "us-west-2b", 
                     "CacheNodeId": "0001", 
                     "ReadEndpoint": {
                        "Port": 6379, 
                        "Address": "rg-name-002.1abc4d.0001.usw2.cache.amazonaws.com"
                     }, 
                     "CacheClusterId": "rg-name-002"
                  }, 
                  {
                     "CurrentRole": "replica", 
                     "PreferredAvailabilityZone": "us-west-2c", 
                     "CacheNodeId": "0001", 
                     "ReadEndpoint": {
                        "Port": 6379, 
                        "Address": "rg-name-003.1abc4d.0001.usw2.cache.amazonaws.com"
                     }, 
                     "CacheClusterId": "rg-name-003"
                  }
               ], 
               "NodeGroupId": "0001", 
               "PrimaryEndpoint": {
                  "Port": 6379, 
                  "Address": "rg-name.1abc4d.ng.0001.usw2.cache.amazonaws.com"
               }
            }
         ], 
         "ReplicationGroupId": "rg-name", 
         "AutomaticFailover": "enabled", 
         "SnapshottingClusterId": "rg-name-002", 
         "MemberClusters": [
            "rg-name-001", 
            "rg-name-002", 
            "rg-name-003"
         ], 
         "PendingModifiedValues": {}
      }, 
      {
      ... some output omitted for brevity
      }
   ]
}
```

有关更多信息，请参阅 Amazon CLI for ElastiCache 主题 [describe-replication-groups](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-replication-groups.html)。

# 查看复制组的详细信息 (ElastiCache API)
<a name="Replication.ViewDetails.API"></a>

您可以使用 Amazon CLI `DescribeReplicationGroups` 操作查看复制的详细信息。使用以下可选参数来细化列表。忽略该参数将返回最多 100 个复制组的详细信息。

**可选参数**
+ `ReplicationGroupId` – 使用此参数列出特定复制组的详细信息。如果指定的复制组有多个节点组，则将按照节点组分组返回的结果。
+ `MaxRecords` – 使用此参数限制列出的复制组数量。`MaxRecords` 的值不能低于 20 或超过 100。默认值为 100。

**Example**  
以下代码列出了最多 100 个复制组的详细信息。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeReplicationGroups
   &Version=2015-02-02
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```
以下代码列出了 `myReplGroup` 的详细信息。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeReplicationGroups
   &ReplicationGroupId=myReplGroup
   &Version=2015-02-02
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```
以下代码列出了最多 25 个集群的详细信息。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeReplicationGroups
   &MaxRecords=25
   &Version=2015-02-02
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

有关更多信息，请参阅 ElastiCache API 参考主题 [DescribeReplicationGroups](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html)。

# 查找复制组端点
<a name="Replication.Endpoints"></a>

应用程序可以连接到复制组中的任何节点，前提是它具有该节点的 DNS 终端节点和端口号。根据您运行的是 Valkey 或 Redis（已禁用集群模式）还是 Valkey 或 Redis（已启用集群模式）复制组，您可能会关注不同的端点。

**Valkey 或 Redis OSS（已禁用集群模式）**  
具有副本的 Valkey 或 Redis（已禁用集群模式）集群有三种类型的端点：*主端点*、*读取器端点*和*节点端点*。主端点是一个 DNS 名称，始终解析为集群中的主节点。主端点不受集群更改的影响，如将只读副本提升为主角色。对于写入活动，我们建议您的应用程序连接到主端点。

读取器端点将在 ElastiCache 集群中的所有只读副本之间均匀地分配指向端点的传入连接。应用程序何时创建连接或应用程序如何（重复）使用连接等附加因素将决定流量分配。读取器端点会在添加或删除副本时实时跟踪集群更改。您可以将 ElastiCache for Redis OSS 集群的多个只读副本置于不同的 Amazon 可用区（AZ）中以确保读取器端点的高可用性。

**注意**  
读取器端点不是负载均衡器。它是一个 DNS 记录，将以循环方式解析为副本节点之一的 IP 地址。

对于读取活动，应用程序还可以连接到集群中的任何节点。与主端点不同，节点端点会解析为特定端点。如果您在您的集群中进行更改（例如添加或删除副本），则必须在您的应用程序中更新节点端点。

**Valkey 或 Redis OSS（已启用集群模式）**  
带有副本的 Valkey 或 Redis OSS（已启用集群模式）集群有多个分片（API/CLI：节点组），这意味着它们也有多个主节点，因此其端点结构与 Valkey 或 Redis OSS（已禁用集群模式）集群的不同。Valkey 或 Redis OSS（已启用集群模式）具有一个*配置端点*，其“知道”集群中的所有主端点和节点端点。您的应用程序连接到配置终端节点。只要您的应用程序对集群的配置端点进行写入或读取，Valkey 和 Redis OSS 在后台确定密钥所属的分片以及分片所使用的端点。这对于您的应用程序是完全透明的。

您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 查找集群的端点。

**查找复制组的终端节点**

要查找复制组的终端节点，请参阅以下主题之一：
+ [查找 Valkey 或 Redis OSS（已禁用集群模式）集群端点（控制台）](Endpoints.md#Endpoints.Find.Redis)
+ [查找 Valkey 或 Redis OSS（已启用集群模式）集群的端点（控制台）](Endpoints.md#Endpoints.Find.RedisCluster)
+ [查找 Valkey 或 Redis OSS 复制组的端点（Amazon CLI）](Endpoints.md#Endpoints.Find.CLI.ReplGroups)
+ [查找 Valkey 或 Redis OSS 复制组的端点（ElastiCache API）](Endpoints.md#Endpoints.Find.API.ReplGroups)

# 修改复制组
<a name="Replication.Modify"></a>

**重要约束**  
目前， ElastiCache 支持对 Valkey 或 Redis OSS（已启用集群模式）复制组进行有限的修改，例如使用 API 操作 (`ModifyReplicationGroup`CLI:`modify-replication-group`) 更改引擎版本。您可以使用 API 操作 [https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroupShardConfiguration.html](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroupShardConfiguration.html)（CLI：[https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group-shard-configuration.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group-shard-configuration.html)）修改 Valkey 或 Redis OSS（已启用集群模式）集群中的分片（节点组）数量。有关更多信息，请参阅 [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)。  
要对 Valkey 或 Redis OSS（已启用集群模式）集群进行其他修改，您需要使用集成了更改的新集群重新创建新集群。
您可以将 Valkey 或 Redis OSS（已禁用集群模式）和 Valkey 或 Redis OSS（已启用集群模式）集群和复制组升级到较新的引擎版本。不过，您不能降级到较早的引擎版本，除非删除现有集群或复制组并重新创建它。有关更多信息，请参阅 [的版本管理 ElastiCache](VersionManagement.md)。
您可以使用控制台、[ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)API 或 CL [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)I 命令将已禁用集群模式的 Valkey 或 Redis OSS 集群升级为启用集群模式的现有 ElastiCache 集群，如下例所示。也可以按照[修改集群模式](modify-cluster-mode.md)中的步骤进行操作。

您可以使用 ElastiCache 控制台、或 API 修改 Valkey 或 Redis OSS（已禁用集群模式）集群的 Amazon CLI设置。 ElastiCache 目前， ElastiCache 支持对 Valkey 或 Redis OSS（已启用集群模式）复制组进行有限数量的修改。其他修改要求您创建当前复制组的备份，然后使用此备份为新 Valkey 或 Redis OSS（已启用集群模式）复制组制作种子的方式进行修改。

**Topics**
+ [

## 使用 Amazon Web Services 管理控制台
](#Replication.Modify.CON)
+ [

## 使用 Amazon CLI
](#Replication.Modify.CLI)
+ [

## 使用 ElastiCache API
](#Replication.Modify.API)

## 使用 Amazon Web Services 管理控制台
<a name="Replication.Modify.CON"></a>

要修改 Valkey 或 Redis OSS（已禁用集群模式）集群，请参阅[修改 ElastiCache 集群](Clusters.Modify.md)。

## 使用 Amazon CLI
<a name="Replication.Modify.CLI"></a>

以下是该`modify-replication-group`命令的 Amazon CLI 示例。您可以使用同样的命令对复制组进行其他修改。

**在现有 Valkey 或 Redis OSS 复制组上启用多可用区：**

对于 Linux、macOS 或 Unix：

```
aws elasticache modify-replication-group \
   --replication-group-id myReplGroup \
   --multi-az-enabled = true
```

对于 Windows：

```
aws elasticache modify-replication-group ^
   --replication-group-id myReplGroup ^
   --multi-az-enabled
```

**将集群模式从已禁用修改为已启用：**

要将集群模式从*已禁用*修改为*已启用*，必须先将集群模式设置为*兼容*。兼容模式让 Valkey 或 Redis 客户端在启用集群模式和禁用集群模式的情况下都能进行连接。在将所有 Valkey 或 Redis OSS 客户端迁移到使用*已启用*集群模式后，就可以完成集群模式配置并将集群模式设置为已启用。

对于 Linux、macOS 或 Unix：

将集群模式设置为*兼容*。

```
aws elasticache modify-replication-group \
   --replication-group-id myReplGroup \
   --cache-parameter-group-name myParameterGroupName \
   --cluster-mode compatible
```

将集群模式设置为*已启用*。

```
aws elasticache modify-replication-group \
   --replication-group-id myReplGroup \
   --cluster-mode enabled
```

对于 Windows：

将集群模式设置为*兼容*。

```
aws elasticache modify-replication-group ^
   --replication-group-id myReplGroup ^
   --cache-parameter-group-name myParameterGroupName ^
   --cluster-mode compatible
```

将集群模式设置为*已启用*。

```
aws elasticache modify-replication-group ^
   --replication-group-id myReplGroup ^
   --cluster-mode enabled
```

有关该 Amazon CLI `modify-replication-group`命令的更多信息，请参阅 For *Redis OSS 用户指南*中的[modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)ElastiCache 或[修改集群模式]()。

## 使用 ElastiCache API
<a name="Replication.Modify.API"></a>

以下 ElastiCache API 操作在现有 Valkey 或 Redis OSS 复制组上启用多可用区。您可以使用同样的操作对复制组进行其他修改。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=ModifyReplicationGroup
   &AutomaticFailoverEnabled=true  
   &Mutli-AZEnabled=true  
   &ReplicationGroupId=myReplGroup
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20141201T220302Z
   &Version=2014-12-01
   &X-Amz-Algorithm=&AWS;4-HMAC-SHA256
   &X-Amz-Date=20141201T220302Z
   &X-Amz-SignedHeaders=Host
   &X-Amz-Expires=20141201T220302Z
   &X-Amz-Credential=<credential>
   &X-Amz-Signature=<signature>
```

有关 ElastiCache API `ModifyReplicationGroup` 操作的更多信息，请参阅[ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)。

# 删除复制组
<a name="Replication.DeletingRepGroup"></a>

如果您不再需要某个具有副本的集群（在 API/CLI 中称作*复制组*），可将其删除。在删除复制组时，ElastiCache 会删除该组中的所有节点。

此操作开始执行后，就无法中断或取消。

**警告**  
当您删除 ElastiCache for Redis OSS 集群时，您的手动快照会保留。您还可以选择在删除集群前创建最后一个快照。自动缓存快照不会保留。
创建最终快照需要 `CreateSnapshot` 权限。如果没有此权限，API 调用将失败，并出现 `Access Denied` 异常。

## 删除复制组（控制台）
<a name="Replication.DeletingRepGroup.CON"></a>

要删除具有副本的集群，请参阅[删除中的集群 ElastiCache](Clusters.Delete.md)。

## 删除复制组 (Amazon CLI)
<a name="Replication.DeletingRepGroup.CLI"></a>

使用命令 [delete-replication-group](https://docs.amazonaws.cn/AmazonElastiCache/latest/CommandLineReference/CLIReference-cmd-DeleteReplicationGroup.html) 删除复制组。

```
aws elasticache delete-replication-group --replication-group-id my-repgroup 
```

系统会提示您确认您的决定。输入 *y*（是）立即开始操作。此过程一经启动便无法撤销。

```
						
   After you begin deleting this replication group, all of its nodes will be deleted as well.
   Are you sure you want to delete this replication group? [Ny]y

REPLICATIONGROUP  my-repgroup  My replication group  deleting
```

## 删除复制组 (ElastiCache API)
<a name="Replication.DeletingRepGroup.API"></a>

调用带 [DeleteReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DeleteReplicationGroup.html) 参数的 `ReplicationGroup`。

**Example**  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DeleteReplicationGroup
   &ReplicationGroupId=my-repgroup
   &Version=2014-12-01
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20141201T220302Z
   &X-Amz-Algorithm=&AWS;4-HMAC-SHA256
   &X-Amz-Date=20141201T220302Z
   &X-Amz-SignedHeaders=Host
   &X-Amz-Expires=20141201T220302Z
   &X-Amz-Credential=<credential>
   &X-Amz-Signature=<signature>
```

**注意**  
如果您将 `RetainPrimaryCluster` 参数设置为 `true`，则会删除所有只读副本，但是将保留主集群。

# 更改副本数量
<a name="increase-decrease-replica-count"></a>

您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 ElastiCache API 动态地增加或减少 Valkey 或 Redis OSS 复制组中的只读副本数量。如果您的复制组为 Valkey 或 Redis OSS（已启用集群模式）复制组，则可以选择要在其中增加或减少副本数量的分片（节点组）。

要动态更改您的复制组中的副本数量，请从下表中选择符合您情况的操作。


| 要执行的操作 | 对于 Valkey 或 Redis OSS（已启用集群模式） | 对于 Valkey 或 Redis OSS（已禁用集群模式） | 
| --- | --- | --- | 
|  添加副本  |  [增加分区中的副本数量](increase-replica-count.md)  |  [增加分区中的副本数量](increase-replica-count.md) [为 Valkey 或 Redis OSS（已禁用集群模式）添加只读副本](Replication.AddReadReplica.md)  | 
|  删除副本  |  [减少分区中的副本数量](decrease-replica-count.md)  |  [减少分区中的副本数量](decrease-replica-count.md) [为 Valkey 或 Redis OSS（已禁用集群模式）删除只读副本](Replication.RemoveReadReplica.md)  | 

# 增加分区中的副本数量
<a name="increase-replica-count"></a>

您可以增加 Valkey 或 Redis OSS（已启用集群模式）分片或 Valkey 或 Redis OSS（已禁用集群模式）复制组中的副本数量，最多不超过 5 个。您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 ElastiCache API 执行此操作。

**Topics**
+ [

## 使用 Amazon Web Services 管理控制台
](#increase-replica-count-con)
+ [

## 使用 Amazon CLI
](#increase-replica-count-cli)
+ [

## 使用 ElastiCache API
](#increase-replica-count-api)

## 使用 Amazon Web Services 管理控制台
<a name="increase-replica-count-con"></a>

以下过程使用控制台增加 Valkey 或 Redis OSS（已启用集群模式）复制组中的副本数量。

**增加分片中的副本数量**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**，然后选择要向其添加副本的复制组的名称。

1. 选中要将副本添加到的每个分片对应的框。

1. 选择 **Add replicas (添加副本)**。

1. 完成 **Add Replicas to Shards (将副本添加到分片)** 页面：
   + 对于 **New number of replicas/shard (新副本/分片数量)**，输入您希望所有选定的分片应具有的副本数量。此值必须大于或造型 **Current Number of Replicas per shard (每个分片的当前副本数量)** 且小于或等于 5。我们建议使用至少两个副本作为有效的最小值。
   + 对于 **Availability Zones（可用区）**，选择 **No preference（无首选项）**以让 ElastiCache 为每个新副本选择可用区，或者选择 **Specify Availability Zones（指定可用区）**以为每个新副本选择可用区。

     如果选择 **Specify Availability Zones (指定可用区)**，对于每个新副本，请使用列表指定可用区。

1. 选择 **Add (添加)** 以添加副本，或选择 **Cancel (取消)** 以取消该操作。

## 使用 Amazon CLI
<a name="increase-replica-count-cli"></a>

要增加 Valkey 或 Redis OSS 分片中的副本数量，请使用带有以下参数的 `increase-replica-count` 命令：
+ `--replication-group-id` – 必需。确定要在其中增加副本数量的复制组。
+ `--apply-immediately` 或 `--no-apply-immediately` – 必需。指定是立即增加副本数量 (`--apply-immediately`) 还是在下一维护时段增加副本数量 (`--no-apply-immediately`)。当前不支持 `--no-apply-immediately`。
+ `--new-replica-count` – 可选。指定完成时所希望的副本节点数量（最多 5 个）。对其中仅有一个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组或您希望其中的所有节点组均有相同副本数量的 Valkey 或 Redis OSS（已启用集群模式）复制组使用此参数。如果此值小于或等于节点组中的当前副本数量，则调用失败并返回异常。
+ `--replica-configuration` – 可选。允许您单独地为每个节点组设置副本和可用区的数量。对您希望单独配置其中每个节点组的 Valkey 或 Redis OSS（已启用集群模式）组使用此参数。

  `--replica-configuration` 具有三位可选成员：
  + `NodeGroupId` – 您要配置的节点组的四位数 ID。对于 Valkey 或 Redis OSS（已禁用集群模式）复制组，分片 ID 始终为 `0001`。若要查找 Valkey 或 Redis OSS（已启用集群模式）节点组（分片）ID，请参阅 [查找分区的 ID](Shards.md#shard-find-id)。
  + `NewReplicaCount` – 您希望在此操作结束时此节点组中所具有的副本数量。此值必须大于当前副本数量，最多为 5 个。如果此值小于或等于节点组中的当前副本数量，则调用失败并返回异常。
  + `PreferredAvailabilityZones` – `PreferredAvailabilityZone` 字符串的列表，指定复制组的节点即将位于的可用区。`PreferredAvailabilityZone` 值的数字必须等于 `NewReplicaCount` 的值再加上 1 以形成主节点。如果忽略 `--replica-configuration` 的此成员，ElastiCache for Redis OSS 会为每个新副本选择可用区。

**重要**  
您必须在调用中包含 `--new-replica-count` 或 `--replica-configuration` 参数，但不能同时包含这两项。

**Example**  
以下示例将复制组 `sample-repl-group` 中的副本数量增加到 3 个。在完成此示例后，每个节点组中将有 3 个副本。无论是具有单个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，还是具多个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，此数字都适用。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache increase-replica-count \
    --replication-group-id sample-repl-group \
    --new-replica-count 3 \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache increase-replica-count ^
    --replication-group-id sample-repl-group ^
    --new-replica-count 3 ^
    --apply-immediately
```
以下示例将复制组 `sample-repl-group` 中的副本数量增加到两个指定节点组指定的值。假定存在多个节点组，则这是一个 Valkey 或 Redis OSS（已启用集群模式）复制组。指定可选 `PreferredAvailabilityZones` 时，所列可用区的数量必须等于 `NewReplicaCount` 的值再加上 1。此方法适用于由 `NodeGroupId` 标识的组的主节点。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache increase-replica-count \
    --replication-group-id sample-repl-group \
    --replica-configuration \
        NodeGroupId=0001,NewReplicaCount=2,PreferredAvailabilityZones=us-east-1a,us-east-1c,us-east-1b \
        NodeGroupId=0003,NewReplicaCount=3,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c,us-east-1c \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache increase-replica-count ^
    --replication-group-id sample-repl-group ^
    --replica-configuration ^
        NodeGroupId=0001,NewReplicaCount=2,PreferredAvailabilityZones=us-east-1a,us-east-1c,us-east-1b ^
        NodeGroupId=0003,NewReplicaCount=3,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c,us-east-1c \
    --apply-immediately
```

有关使用 CLI 增加副本数量的更多信息，请参阅 *Amazon ElastiCache 命令行参考* 中的 [increase-replica-count](https://docs.amazonaws.cn/cli/latest/reference/elasticache/increase-replica-count.html)。

## 使用 ElastiCache API
<a name="increase-replica-count-api"></a>

要增加 Valkey 或 Redis OSS 分片中的副本数量，请使用带有以下参数的 `IncreaseReplicaCount` 操作：
+ `ReplicationGroupId` – 必需。确定要在其中增加副本数量的复制组。
+ `ApplyImmediately` – 必需。指定是立即增加副本数量 (`ApplyImmediately=True`) 还是在下一维护时段增加副本数量 (`ApplyImmediately=False`)。当前不支持 `ApplyImmediately=False`。
+ `NewReplicaCount` – 可选。指定完成时所希望的副本节点数量（最多 5 个）。对其中仅有一个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组或您希望其中的所有节点组均有相同副本数量的 Valkey 或 Redis OSS（已启用集群模式）复制组使用此参数。如果此值小于或等于节点组中的当前副本数量，则调用失败并返回异常。
+ `ReplicaConfiguration` – 可选。允许您单独地为每个节点组设置副本和可用区的数量。对您希望单独配置其中每个节点组的 Valkey 或 Redis OSS（已启用集群模式）组使用此参数。

  `ReplicaConfiguraion` 具有三位可选成员：
  + `NodeGroupId` – 您要配置的节点组的四位数 ID。对于 Valkey 或 Redis OSS（已禁用集群模式）复制组，节点组（分片）ID 始终为 `0001`。若要查找 Valkey 或 Redis OSS（已启用集群模式）节点组（分片）ID，请参阅 [查找分区的 ID](Shards.md#shard-find-id)。
  + `NewReplicaCount` – 您希望在此操作结束时此节点组中所具有的副本数量。此值必须大于当前副本数量，且最多为 5 个。如果此值小于或等于节点组中的当前副本数量，则调用失败并返回异常。
  + `PreferredAvailabilityZones` – `PreferredAvailabilityZone` 字符串的列表，指定复制组的节点即将位于的可用区。`PreferredAvailabilityZone` 值的数字必须等于 `NewReplicaCount` 的值再加上 1 以形成主节点。如果忽略 `ReplicaConfiguration` 的此成员，ElastiCache for Redis OSS 会为每个新副本选择可用区。

**重要**  
您必须在调用中包含 `NewReplicaCount` 或 `ReplicaConfiguration` 参数，但不能同时包含这两项。

**Example**  
以下示例将复制组 `sample-repl-group` 中的副本数量增加到 3 个。在完成此示例后，每个节点组中将有 3 个副本。无论是具有单个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，还是具多个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，此数字都适用。  

```
https://elasticache.us-west-2.amazonaws.com/
      ?Action=IncreaseReplicaCount
      &ApplyImmediately=True
      &NewReplicaCount=3
      &ReplicationGroupId=sample-repl-group
      &Version=2015-02-02
      &SignatureVersion=4
      &SignatureMethod=HmacSHA256
      &Timestamp=20150202T192317Z
      &X-Amz-Credential=<credential>
```
以下示例将复制组 `sample-repl-group` 中的副本数量增加到两个指定节点组指定的值。假定存在多个节点组，则这是一个 Valkey 或 Redis OSS（已启用集群模式）复制组。指定可选 `PreferredAvailabilityZones` 时，所列可用区的数量必须等于 `NewReplicaCount` 的值再加上 1。此方法适用于由 `NodeGroupId` 标识的组的主节点。  

```
https://elasticache.us-west-2.amazonaws.com/
      ?Action=IncreaseReplicaCount
      &ApplyImmediately=True
      &ReplicaConfiguration.ConfigureShard.1.NodeGroupId=0001
      &ReplicaConfiguration.ConfigureShard.1.NewReplicaCount=2
      &ReplicaConfiguration.ConfigureShard.1.PreferredAvailabilityZones.PreferredAvailabilityZone.1=us-east-1a
      &ReplicaConfiguration.ConfigureShard.1.PreferredAvailabilityZones.PreferredAvailabilityZone.2=us-east-1c
      &ReplicaConfiguration.ConfigureShard.1.PreferredAvailabilityZones.PreferredAvailabilityZone.3=us-east-1b
      &ReplicaConfiguration.ConfigureShard.2.NodeGroupId=0003
      &ReplicaConfiguration.ConfigureShard.2.NewReplicaCount=3
      &ReplicaConfiguration.ConfigureShard.2.PreferredAvailabilityZones.PreferredAvailabilityZone.1=us-east-1a
      &ReplicaConfiguration.ConfigureShard.2.PreferredAvailabilityZones.PreferredAvailabilityZone.2=us-east-1b
      &ReplicaConfiguration.ConfigureShard.2.PreferredAvailabilityZones.PreferredAvailabilityZone.3=us-east-1c
      &ReplicaConfiguration.ConfigureShard.2.PreferredAvailabilityZones.PreferredAvailabilityZone.4=us-east-1c
      &ReplicationGroupId=sample-repl-group
      &Version=2015-02-02
      &SignatureVersion=4
      &SignatureMethod=HmacSHA256
      &Timestamp=20150202T192317Z
      &X-Amz-Credential=<credential>
```

有关使用 API 增加副本数量的更多信息，请参阅 *Amazon ElastiCache API 参考*中的 [IncreaseReplicaCount](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_IncreaseReplicaCount.html)。

# 减少分区中的副本数量
<a name="decrease-replica-count"></a>

您可以减少 Valkey 或 Redis OSS（已启用集群模式）分片中的副本数量，或 Valkey 或 Redis OSS（已禁用集群模式）复制组中的副本数量：
+ 对于 Valkey 或 Redis OSS（已禁用集群模式），如果启用了多可用区，则可以将副本数量减少到 1 个；如果未启用，则可以将副本数量减少到 0。
+ 对于 Valkey 或 Redis OSS（已启用集群模式），您可以将副本数量减少到 0。但是，如果您的主节点发生故障，则无法故障转移到副本。

您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 ElastiCache API 来减少节点组（分区）或复制组中的副本数量。

**Topics**
+ [

## 使用 Amazon Web Services 管理控制台
](#decrease-replica-count-con)
+ [

## 使用 Amazon CLI
](#decrease-replica-count-cli)
+ [

## 使用 ElastiCache API
](#decrease-replica-count-api)

## 使用 Amazon Web Services 管理控制台
<a name="decrease-replica-count-con"></a>

以下过程使用控制台减少 Valkey 或 Redis OSS（已启用集群模式）复制组中的副本数量。

**减少 Valkey 或 Redis OSS 分片中的副本数量**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)）。

1. 在导航窗格中，选择 **Valkey** 或 **Redis OSS**，然后选择要从其中删除副本的复制组的名称。

1. 选中要从其中删除副本的每个分片对应的框。

1. 选择 **Delete replicas (删除副本)**。

1. 完成 **Delete Replicas from Shards (从分片中删除副本)** 页面：

   1. 对于 **New number of replicas/shard (新副本/分片数量)**，输入您希望选定的分片应具有的副本数量。此数字必须大于或等于 1。我们建议每个分片使用至少两个副本作为有效的最小值。

   1. 选择 **Delete (删除)** 以删除副本，或选择 **Cancel (取消)** 以取消该操作。

**重要**  
如果您未指定要删除的副本节点，ElastiCache for Redis OSS 会自动选择副本节点来进行删除。在此过程中，ElastiCache for Redis OSS 会尝试为您的复制组保留多可用区架构，然后保留具有最小复制滞后的副本以及主节点。
无法删除复制组中的主节点。如果指定主节点进行删除，此操作会失败并显示指示已选中主节点进行删除的错误事件。

## 使用 Amazon CLI
<a name="decrease-replica-count-cli"></a>

要减少 Valkey 或 Redis OSS 分片中的副本数量，请使用带有以下参数的 `decrease-replica-count` 命令：
+ `--replication-group-id` – 必需。确定要在其中减少副本数量的复制组。
+ `--apply-immediately` 或 `--no-apply-immediately` – 必需。指定是立即减少副本数量（`--apply-immediately`）还是在下一维护时段减少副本数量（`--no-apply-immediately`）。当前不支持 `--no-apply-immediately`。
+ `--new-replica-count` – 可选。指定希望的副本节点数。`--new-replica-count` 的值必须为小于节点组中的当前副本数量的有效值。有关允许的最小值，请参阅[减少分区中的副本数量](#decrease-replica-count)。如果 `--new-replica-count` 的值不满足此要求，则调用失败。
+ `--replicas-to-remove` – 可选。包含指定要删除的副本节点的节点 ID 的列表。
+ `--replica-configuration` – 可选。允许您单独地为每个节点组设置副本和可用区的数量。对您希望单独配置其中每个节点组的 Valkey 或 Redis OSS（已启用集群模式）组使用此参数。

  `--replica-configuration` 具有三位可选成员：
  + `NodeGroupId` – 您要配置的节点组的四位数 ID。对于 Valkey 或 Redis OSS（已禁用集群模式）复制组，分片 ID 始终为 `0001`。若要查找 Valkey 或 Redis OSS（已启用集群模式）节点组（分片）ID，请参阅 [查找分区的 ID](Shards.md#shard-find-id)。
  + `NewReplicaCount` – 指定希望的副本节点数的可选参数。`NewReplicaCount` 的值必须为小于节点组中的当前副本数量的有效值。有关允许的最小值，请参阅[减少分区中的副本数量](#decrease-replica-count)。如果 `NewReplicaCount` 的值不满足此要求，则调用失败。
  + `PreferredAvailabilityZones` – `PreferredAvailabilityZone` 字符串的列表，指定复制组的节点所在的可用区。`PreferredAvailabilityZone` 值的数字必须等于 `NewReplicaCount` 的值再加上 1 以形成主节点。如果忽略 `--replica-configuration` 的此成员，ElastiCache for Redis OSS 会为每个新副本选择可用区。

**重要**  
您必须包含且只能包含 `--new-replica-count`、`--replicas-to-remove` 或 `--replica-configuration` 参数之一。

**Example**  
以下示例使用 `--new-replica-count` 将复制组 `sample-repl-group` 中的副本数量减少为 1 个。在完成此示例后，每个节点组中将有一个副本。无论是具有单个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，还是具多个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，此数字都适用。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache decrease-replica-count
    --replication-group-id sample-repl-group \
    --new-replica-count 1 \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache decrease-replica-count ^
    --replication-group-id sample-repl-group ^
    --new-replica-count 1 ^
    --apply-immediately
```
以下示例通过从节点组中删除两个指定的副本（`sample-repl-group` 和 `0001`）来减少复制 `0003` 中的副本数量。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache decrease-replica-count \
    --replication-group-id sample-repl-group \
    --replicas-to-remove 0001,0003 \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache decrease-replica-count ^
    --replication-group-id sample-repl-group ^
    --replicas-to-remove 0001,0003 \
    --apply-immediately
```
以下示例使用 `--replica-configuration` 将复制组 `sample-repl-group` 中的副本数量减少为两个指定节点组指定的值。假定存在多个节点组，则这是一个 Valkey 或 Redis OSS（已启用集群模式）复制组。指定可选 `PreferredAvailabilityZones` 时，所列可用区的数量必须等于 `NewReplicaCount` 的值再加上 1。此方法适用于由 `NodeGroupId` 标识的组的主节点。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache decrease-replica-count \
    --replication-group-id sample-repl-group \
    --replica-configuration \
        NodeGroupId=0001,NewReplicaCount=1,PreferredAvailabilityZones=us-east-1a,us-east-1c \
        NodeGroupId=0003,NewReplicaCount=2,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache decrease-replica-count ^
    --replication-group-id sample-repl-group ^
    --replica-configuration ^
        NodeGroupId=0001,NewReplicaCount=2,PreferredAvailabilityZones=us-east-1a,us-east-1c ^
        NodeGroupId=0003,NewReplicaCount=3,PreferredAvailabilityZones=us-east-1a,us-east-1b,us-east-1c \
    --apply-immediately
```

有关使用 CLI 减少副本数量的更多信息，请参阅 *Amazon ElastiCache 命令行参考*中的 [decrease-replica-count](https://docs.amazonaws.cn/cli/latest/reference/elasticache/decrease-replica-count.html)。

## 使用 ElastiCache API
<a name="decrease-replica-count-api"></a>

要减少 Valkey 或 Redis OSS 分片中的副本数量，请使用带有以下参数的 `DecreaseReplicaCount` 操作：
+ `ReplicationGroupId` – 必需。确定要在其中减少副本数量的复制组。
+ `ApplyImmediately` – 必需。指定是立即减少副本数量（`ApplyImmediately=True`）还是在下一维护时段减少副本数量（`ApplyImmediately=False`）。当前不支持 `ApplyImmediately=False`。
+ `NewReplicaCount` – 可选。指定希望的副本节点数。`NewReplicaCount` 的值必须为小于节点组中的当前副本数量的有效值。有关允许的最小值，请参阅[减少分区中的副本数量](#decrease-replica-count)。如果 `--new-replica-count` 的值不满足此要求，则调用失败。
+ `ReplicasToRemove` – 可选。包含指定要删除的副本节点的节点 ID 的列表。
+ `ReplicaConfiguration` – 可选。包含节点组列表，这些节点组允许您单独地为每个节点组设置副本和可用区的数量。对您希望单独配置其中每个节点组的 Valkey 或 Redis OSS（已启用集群模式）组使用此参数。

  `ReplicaConfiguraion` 具有三位可选成员：
  + `NodeGroupId` – 您要配置的节点组的四位数 ID。对于 Valkey 或 Redis OSS（已禁用集群模式）复制组，节点组 ID 始终为 `0001`。若要查找 Valkey 或 Redis OSS（已启用集群模式）节点组（分片）ID，请参阅 [查找分区的 ID](Shards.md#shard-find-id)。
  + `NewReplicaCount` – 您希望在此操作结束时此节点组中所具有的副本数量。如果启用了多可用区，则此值必须小于当前副本数量（最少为 1 个）；如果未启用具有自动故障转移功能的多可用区，则此值为 0。如果此值大于或等于节点组中的当前副本数量，则调用失败并返回异常。
  + `PreferredAvailabilityZones` – `PreferredAvailabilityZone` 字符串的列表，指定复制组的节点所在的可用区。`PreferredAvailabilityZone` 值的数字必须等于 `NewReplicaCount` 的值再加上 1 以形成主节点。如果忽略 `ReplicaConfiguration` 的此成员，ElastiCache for Redis OSS 会为每个新副本选择可用区。

**重要**  
您必须包含且只能包含 `NewReplicaCount`、`ReplicasToRemove` 或 `ReplicaConfiguration` 参数之一。

**Example**  
以下示例使用 `NewReplicaCount` 将复制组 `sample-repl-group` 中的副本数量减少为 1 个。在完成此示例后，每个节点组中将有一个副本。无论是具有单个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，还是具多个节点组的 Valkey 或 Redis OSS（已禁用集群模式）复制组，此数字都适用。  

```
https://elasticache.us-west-2.amazonaws.com/
      ?Action=DecreaseReplicaCount
      &ApplyImmediately=True
      &NewReplicaCount=1
      &ReplicationGroupId=sample-repl-group
      &Version=2015-02-02
      &SignatureVersion=4
      &SignatureMethod=HmacSHA256
      &Timestamp=20150202T192317Z
      &X-Amz-Credential=<credential>
```
以下示例通过从节点组中删除两个指定的副本（`sample-repl-group` 和 `0001`）来减少复制 `0003` 中的副本数量。  

```
https://elasticache.us-west-2.amazonaws.com/
      ?Action=DecreaseReplicaCount
      &ApplyImmediately=True
      &ReplicasToRemove.ReplicaToRemove.1=0001
      &ReplicasToRemove.ReplicaToRemove.2=0003
      &ReplicationGroupId=sample-repl-group
      &Version=2015-02-02
      &SignatureVersion=4
      &SignatureMethod=HmacSHA256
      &Timestamp=20150202T192317Z
      &X-Amz-Credential=<credential>
```
以下示例使用 `ReplicaConfiguration` 将复制组 `sample-repl-group` 中的副本数量减少为两个指定节点组指定的值。假定存在多个节点组，则这是一个 Valkey 或 Redis OSS（已启用集群模式）复制组。指定可选 `PreferredAvailabilityZones` 时，所列可用区的数量必须等于 `NewReplicaCount` 的值再加上 1。此方法适用于由 `NodeGroupId` 标识的组的主节点。  

```
https://elasticache.us-west-2.amazonaws.com/
      ?Action=DecreaseReplicaCount
      &ApplyImmediately=True
      &ReplicaConfiguration.ConfigureShard.1.NodeGroupId=0001
      &ReplicaConfiguration.ConfigureShard.1.NewReplicaCount=1
      &ReplicaConfiguration.ConfigureShard.1.PreferredAvailabilityZones.PreferredAvailabilityZone.1=us-east-1a
      &ReplicaConfiguration.ConfigureShard.1.PreferredAvailabilityZones.PreferredAvailabilityZone.2=us-east-1c
      &ReplicaConfiguration.ConfigureShard.2.NodeGroupId=0003
      &ReplicaConfiguration.ConfigureShard.2.NewReplicaCount=2
      &ReplicaConfiguration.ConfigureShard.2.PreferredAvailabilityZones.PreferredAvailabilityZone.1=us-east-1a
      &ReplicaConfiguration.ConfigureShard.2.PreferredAvailabilityZones.PreferredAvailabilityZone.2=us-east-1b
      &ReplicaConfiguration.ConfigureShard.2.PreferredAvailabilityZones.PreferredAvailabilityZone.4=us-east-1c
      &ReplicationGroupId=sample-repl-group
      &Version=2015-02-02
      &SignatureVersion=4
      &SignatureMethod=HmacSHA256
      &Timestamp=20150202T192317Z
      &X-Amz-Credential=<credential>
```

有关使用 API 减少副本数量的更多信息，请参阅 *Amazon ElastiCache API 参考*中的 [DecreaseReplicaCount](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DecreaseReplicaCount.html)。

# 为 Valkey 或 Redis OSS（已禁用集群模式）添加只读副本
<a name="Replication.AddReadReplica"></a>

以下主题中的信息仅适用于 Valkey 或 Redis OSS（已禁用集群模式）复制组。

随着您的读取流量的增加，您可能需要跨多个节点分布这些读取操作，并且减少任一节点上的读取压力。在本主题中，您可以了解如何向 Valkey 或 Redis OSS（已禁用集群模式）集群添加只读副本。

Valkey 或 Redis OSS（已禁用集群模式）复制组最多可以有五个只读副本。如果您尝试向已有 5 个只读副本的复制组添加只读副本，则此操作将失败。

有关向 Valkey 或 Redis OSS（已启用集群模式）复制组添加副本的信息，请参阅以下内容：
+ [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)
+ [增加分区中的副本数量](increase-replica-count.md)

您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 向 Valkey 或 Redis OSS（已禁用集群模式）集群添加只读副本。

**相关主题**
+ [向 ElastiCache 集群添加节点](Clusters.AddNode.md)
+ [向复制组添加只读副本 (Amazon CLI)](#Replication.AddReadReplica.CLI)
+ [使用 API 向复制组添加只读副本](#Replication.AddReadReplica.API)

## 向复制组添加只读副本 (Amazon CLI)
<a name="Replication.AddReadReplica.CLI"></a>

要向 Valkey 或 Redis OSS（已禁用集群模式）复制组添加只读副本，请使用 Amazon CLI `create-cache-cluster` 命令，其中参数 `--replication-group-id` 指定要向其添加集群（节点）的复制组。

以下示例创建集群 `my-read replica` 并将其添加到复制组 `my-replication-group`。该只读副本的节点类型、参数组、安全组、维护时段及其他设置与 `my-replication-group` 中的其他节点的相同。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-cache-cluster \
      --cache-cluster-id my-read-replica \
      --replication-group-id my-replication-group
```

对于 Windows：

```
aws elasticache create-cache-cluster ^
      --cache-cluster-id my-read-replica ^
      --replication-group-id my-replication-group
```

有关使用 CLI 添加只读副本的更多信息，请参阅 *Amazon ElastiCache 命令行参考*中的 [create-cache-cluster](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-cache-cluster.html)。

## 使用 API 向复制组添加只读副本
<a name="Replication.AddReadReplica.API"></a>

要向 Valkey 或 Redis OSS（已禁用集群模式）复制组添加只读副本，请使用 ElastiCache `CreateCacheCluster` 操作，其中参数 `ReplicationGroupId` 指定要向其添加集群（节点）的复制组。

以下示例创建集群 `myReadReplica` 并将其添加到复制组 `myReplicationGroup`。该只读副本的节点类型、参数组、安全组、维护时段及其他设置与 `myReplicationGroup` 中的其他节点的相同。

```
https://elasticache.us-west-2.amazonaws.com/
      ?Action=CreateCacheCluster
      &CacheClusterId=myReadReplica
      &ReplicationGroupId=myReplicationGroup
      &Version=2015-02-02
      &SignatureVersion=4
      &SignatureMethod=HmacSHA256
      &Timestamp=20150202T192317Z
      &X-Amz-Credential=<credential>
```

有关使用 API 添加只读副本的更多信息，请参阅 *Amazon ElastiCache API 参考*中的 [CreateCacheCluster](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateCacheCluster.html)。

# 为 Valkey 或 Redis OSS（已禁用集群模式）删除只读副本
<a name="Replication.RemoveReadReplica"></a>

以下主题中的信息仅适用于 Valkey 或 Redis OSS（已禁用集群模式）复制组。

由于 Valkey 或 Redis OSS 复制组上的读取流量是不断变化的，您可能需要添加或移除只读副本。从 复制组中移除节点的过程与删除集群的过程一样，但存在一些限制：
+ 您无法从复制组中移除主集群。如果要删除主集群，请执行以下操作：

  1. 将只读副本提升为主集群。有关将只读副本提升为主集群的更多信息，请参阅[将 Valkey 或 Redis OSS（已禁用集群模式）复制组的只读副本提升为主节点](Replication.PromoteReplica.md)。

  1. 删除旧的主集群。有关此方法的限制，请参阅下一要点。
+ 如果在复制组上启用了多可用区，则无法从复制组中移除上一个只读副本。在此情况下，请执行以下操作：

  1. 通过禁用多可用区来修改复制组。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

  1. 删除只读副本。

您可以使用 ElastiCache 控制台、Amazon CLI for ElastiCache 或 ElastiCache API 删除 Valkey 或 Redis OSS（已禁用集群模式）复制组中的只读副本。

有关从 Valkey 或 Redis OSS 复制组中删除集群的说明，请参阅以下内容：
+ [使用Amazon Web Services 管理控制台](Clusters.Delete.md#Clusters.Delete.CON)
+ [使用Amazon CLI删除集 ElastiCache 群](Clusters.Delete.md#Clusters.Delete.CLI)
+ [使用 ElastiCache API](Clusters.Delete.md#Clusters.Delete.API)
+ [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)
+ [减少分区中的副本数量](decrease-replica-count.md)

# 将 Valkey 或 Redis OSS（已禁用集群模式）复制组的只读副本提升为主节点
<a name="Replication.PromoteReplica"></a>

以下主题中的信息仅适用于 Valkey 或 Redis OSS（已禁用集群模式）复制组。

您可以使用 Amazon Web Services 管理控制台、Amazon CLI 或 ElastiCache API 将 Valkey 或 Redis OSS（已禁用集群模式）只读副本提升为主节点。在 复制组上启用了具有自动故障转移功能的多可用区的同时，您无法将只读副本提升为主集群。若要在启用了多可用区的复制组上将 Valkey 或 Redis OSS（已禁用集群模式）副本提升为主节点，请执行以下操作：

1. 修改复制组以禁用多可用区（执行此操作不要求所有集群都位于同一个可用区）。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

1. 将只读副本提升为主集群。

1. 修改复制组以重新启用多可用区。

在运行 Redis OSS 2.6.13 或更早版本的复制组上，多可用区不可用。

## 使用 Amazon Web Services 管理控制台
<a name="Replication.PromoteReplica.CON"></a>

以下过程使用控制台将副本节点提升为主集群。

**将只读副本提升为主节点（控制台）**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/))。

1. 如果要提升的副本是启用了多可用区的 Valkey 或 Redis OSS（已禁用集群模式）复制组中的成员，请先修改复制组以禁用多可用区，然后再继续。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

1. 选择 **Valkey** 或 **Redis OSS**，然后从集群列表中选择要修改的复制组。该复制组必须运行“Redis”引擎，而不是“集群化 Redis”引擎，而且必须具有 2 个或更多个节点。

1. 从节点列表中，选择要提升为主集群的副本节点，然后对于 **Actions (操作)**，选择 **Promote (提升)**。

1. 在 **Promote Read Replica (提升只读副本)** 对话框中，执行以下操作：

   1. 对于 **Apply Immediately (立即应用)**，选择 **Yes (是)** 立即提升只读副本，或者选择 **No (否)** 在集群的下一维护时段提升它。

   1. 选择 **Promote** 提升只读副本，或选择 **Cancel** 取消该操作。

1. 如果在开始提升过程之前集群已启用多可用区，请等待直到复制组的状态为 **available (可用)**，然后修改集群以重新启用多可用区。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

## 使用 Amazon CLI
<a name="Replication.PromoteReplica.CLI"></a>

当复制组启用多可用区时，您无法将只读副本提升为主集群。在某些情况下，要提升的副本可能是启用了多可用区的复制组的成员。在这些情况下，您必须先修改复制组以禁用多可用区，然后再继续。执行此操作不要求所有集群都位于同一个可用区。有关修改复制组的更多信息，请参阅[修改复制组](Replication.Modify.md)。

以下 Amazon CLI 命令修改复制组 `sample-repl-group`，并使只读副本 `my-replica-1` 成为复制组中的主集群。

对于 Linux、macOS 或 Unix：

```
aws elasticache modify-replication-group \
   --replication-group-id sample-repl-group \
   --primary-cluster-id my-replica-1
```

对于 Windows：

```
aws elasticache modify-replication-group ^
   --replication-group-id sample-repl-group ^
   --primary-cluster-id my-replica-1
```

有关修改复制组的更多信息，请参阅 *Amazon ElastiCache 命令行参考*中的 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)。

## 使用 ElastiCache API
<a name="Replication.PromoteReplica.API"></a>

当复制组启用多可用区时，您无法将只读副本提升为主集群。在某些情况下，要提升的副本可能是启用了多可用区的复制组的成员。在这些情况下，您必须先修改复制组以禁用多可用区，然后再继续。执行此操作不要求所有集群都位于同一个可用区。有关修改复制组的更多信息，请参阅[修改复制组](Replication.Modify.md)。

以下 ElastiCache API 操作修改复制组 `myReplGroup`，并使只读副本 `myReplica-1` 成为复制组中的主节点。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=ModifyReplicationGroup
   &ReplicationGroupId=myReplGroup
   &PrimaryClusterId=myReplica-1  
   &Version=2014-12-01
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20141201T220302Z
   &X-Amz-Algorithm=&AWS;4-HMAC-SHA256
   &X-Amz-Date=20141201T220302Z
   &X-Amz-SignedHeaders=Host
   &X-Amz-Expires=20141201T220302Z
   &X-Amz-Credential=<credential>
   &X-Amz-Signature=<signature>
```

有关修改复制组的更多信息，请参阅 *Amazon ElastiCache API 参考*中的 [ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)。

# 管理 ElastiCache 集群维护
<a name="maintenance-window"></a>

每个集群都有一个每周维护时段，在此期间会应用任何系统更改。在 Valkey 和 Redis OSS 中，复制组的每周维护时段相同。如果在创建或修改集群或复制组时未指定首选维护时段，则 ElastiCache 随机选择一周中的某一天，在您区域的维护时段内分配 60 分钟的维护时段。

这个 60 分钟维护时段是随机从每个地区的 8 小时时间段中选择出来的。下表列出了每个区域分配默认维护时段的时间段。您可以选择区域的维护时段之外的首选维护时段。


| 区域代码 | 区域名称 | 区域维护时段 | 
| --- | --- | --- | 
| ap-northeast-1 | 亚太（东京）区域 | 13:00–21:00 UTC | 
| ap-northeast-2 | 亚太地区（首尔）区域 | 12:00–20:00 UTC | 
| ap-northeast-3 | 亚太地区（大阪）区域 | 12:00–20:00 UTC | 
| ap-southeast-3 | 亚太地区（雅加达）区域 | 14:00–22:00 UTC | 
| ap-south-1 | 亚太地区（孟买）区域 | 17:30–1:30 UTC | 
| ap-southeast-1 | 亚太（新加坡）区域 | 14:00–22:00 UTC | 
| cn-north-1 | 中国（北京）区域 | 14:00–22:00 UTC | 
| cn-northwest-1 | 中国（宁夏）区域 | 14:00–22:00 UTC | 
| ap-east-1 | 亚太地区（香港）区域 | 13:00–21:00 UTC | 
| ap-southeast-2 | 亚太（悉尼）区域 | 12:00–20:00 UTC | 
| eu-west-3 | 欧洲（巴黎）区域 | 23:59–07:29 UTC | 
| af-south-1 | 非洲（开普敦）区域 | 13:00–21:00 UTC | 
| eu-central-1 | 欧洲地区（法兰克福）区域 | 23:00–07:00 UTC | 
| eu-west-1 | 欧洲地区（爱尔兰）区域 | 22:00–06:00 UTC | 
| eu-west-2 | 欧洲地区（伦敦）区域 | 23:00–07:00 UTC | 
| me-south-1 | 中东（巴林）区域 | 13:00–21:00 UTC | 
| me-central-1 | 中东（阿联酋）区域 | 13:00–21:00 UTC | 
| eu-south-1 | 欧洲地区（米兰） | 21:00–05:00 UTC | 
| sa-east-1 | 南美洲（圣保罗）区域 | 01:00–09:00 UTC | 
| us-east-1 | 美国东部（弗吉尼亚州北部）区域 | 03:00–11:00 UTC | 
| us-east-2 | 美国东部（俄亥俄州）区域 | 04:00–12:00 UTC | 
| us-gov-west-1 | Amazon GovCloud (US) region | 06:00–14:00 UTC | 
| us-west-1 | 美国西部（北加利福尼亚）区域 | 06:00–14:00 UTC | 
| us-west-2 | 美国西部（俄勒冈）区域 | 06:00–14:00 UTC | 

**更改集群或复制组的维护时段**  
维护时段应当选在使用量最小的时段上，因而可能必须不时予以修改。您可以修改您的集群或复制组以指定一个持续时间长达 24 小时的时间范围，您已请求的任何维护活动均应在此期间发生。您请求的任何延期或待处理集群修改都将在此期间进行。

**注意**  
如果要使用 Amazon Web Services 管理控制台立即应用节点类型修改和/或引擎升级，请选择**立即应用**框。否则，将在下一计划的维护时段中应用这些修改。要使用 API，请参阅 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html) 或 [modify-cache-cluster](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-cache-cluster.html)。

**更多信息**  
有关维护时段和节点替换的信息，请参阅：
+ [ElastiCache 维护](https://www.amazonaws.cn/elasticache/elasticache-maintenance/) – 有关维护和节点替换的常见问题
+ [替换节点（Memcached）](CacheNodes.NodeReplacement-mc.md) – 管理 Memcached 的节点替换
+ [修改 ElastiCache 集群](Clusters.Modify.md) – 更改集群的维护时段
+ [替换节点（Valkey 和 Redis OSS）](CacheNodes.NodeReplacement.md) – 管理节点替换
+ [修改复制组](Replication.Modify.md) – 更改复制组的维护时段

# 使用 ElastiCache 参数组配置引擎参数
<a name="ParameterGroups"></a>

Amazon ElastiCache 使用参数控制节点和集群的运行时属性。通常，更新的引擎版本包含用于支持更新功能的其他参数。有关 Memcached 参数的表，请参阅[Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)。有关 Valkey 和 Redis OSS 参数的表，请参阅[Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。

正如您所预期的，某些参数值（例如 `maxmemory`）由引擎和节点类型决定。有关由节点类型决定的这些 Memcached 参数值的表，请参阅[特定于 Memcached 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached.NodeSpecific)。有关由节点类型决定的这些 Valkey 和 Redis OSS 参数值的表，请参阅[特定于 Redis OSS 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.NodeSpecific)。

**注意**  
有关 Memcached 特定的参数的列表，请参阅 [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)。

**Topics**
+ [

# ElastiCache 中的参数管理
](ParameterGroups.Management.md)
+ [

# ElastiCache 中的缓存参数组层
](ParameterGroups.Tiers.md)
+ [

# 创建 ElastiCache 参数组
](ParameterGroups.Creating.md)
+ [

# 按名称列出 ElastiCache 参数组
](ParameterGroups.ListingGroups.md)
+ [

# 列出 ElastiCache 参数组的值
](ParameterGroups.ListingValues.md)
+ [

# 修改 ElastiCache 参数组
](ParameterGroups.Modifying.md)
+ [

# 删除 ElastiCache 参数组
](ParameterGroups.Deleting.md)
+ [

# 引擎特定参数
](ParameterGroups.Engine.md)

# ElastiCache 中的参数管理
<a name="ParameterGroups.Management"></a>

ElastiCache 参数已分组到指定的参数组中，以便更轻松地管理参数。参数组表示在启动期间传递给引擎软件的参数的特定值组合。这些值确定每个节点上的引擎进程在运行时的行为方式。特定参数组中的参数值应用于与该组关联的所有节点（不论这些节点属于哪个集群）。

要优化集群的性能，您可以修改某些参数值或更改集群的参数组。
+ 您无法修改或删除默认参数组。如果您需要自定义参数值，则必须创建自定义参数组。
+ 对于 Memcached，参数组系列与您分配给参数组的集群必须兼容。例如，如果您的集群运行 Memcached 版本 1.4.8，您只能使用 Memcached 1.4 系列中的参数组 (默认或自定义)。

  对于 Redis OSS，参数组系列与您分配给参数组的集群必须兼容。例如，如果您的集群运行 Redis OSS 版本 3.2.10，您只能使用 Redis OSS 3.2 系列中的参数组（默认或自定义）。
+ 如果更改某个集群的参数组，则任何可以按照条件修改的参数的值在当前参数组和新参数组中必须相同。
+ 对于 Memcached，当您更改集群的参数时，更改将立即应用于集群。无论是更改集群的参数组本身还是更改集群参数组中的参数值，都是如此。要确定何时应用特定参数更改，请参阅表格中的**更改生效**列以了解 [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)。有关重启集群节点的信息，请参阅[重启集群](Clusters.html#Rebooting)。
+ 对于 Redis OSS，当您更改集群的参数时，所做的更改将立即或在集群节点重启后应用于集群，但以下说明的例外情况除外。无论是更改集群的参数组本身还是更改集群参数组中的参数值，都是如此。要确定何时应用特定参数更改，请参阅表格中的**更改生效**列以了解 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。

  有关重启 Valkey 或 Redis OSS 节点的更多信息，请参阅[重启节点](nodes.rebooting.md)。
**Valkey 或 Redis OSS（已启用集群模式）参数更改**  
如果要更改 Valkey 或 Redis OSS（已启用集群模式）集群上的以下参数，请按照随后的步骤操作。  
activerehashing
数据库
创建集群的手动备份。请参阅[进行手动备份](backups-manual.md)。
请删除集群。请参阅[删除集群](Clusters.html#Delete)。
使用修改的参数组和备份还原集群，以便为新集群创建种子。请参阅[从备份还原到新缓存](backups-restoring.md)。
对其他参数的更改不需要执行此操作。
+ 您可以将参数组与 Valkey 和 Redis OSS 全局数据存储关联。*全局数据存储*是跨 Amazon 区域的一个或多个集群的集合。在这种情况下，参数组由组成全局数据存储的所有集群共享。对主集群的参数组作出的任何修改都会复制到全局数据存储中的所有剩余集群。有关更多信息，请参阅 [使用全球数据存储跨Amazon区域复制](Redis-Global-Datastore.md)。

  您可以通过查看以下位置来检查参数组是否属于全局数据存储：
  + ElastiCache 控制台的 **Parameter Groups（参数组）**页面上的是/否 **Global（全局）**属性 
  + [CacheParameterGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CacheParameterGroup.html) API 操作的是/否 `IsGlobal` 属性

# ElastiCache 中的缓存参数组层
<a name="ParameterGroups.Tiers"></a>

Amazon ElastiCache 具有三层缓存参数组，如下所示。

![\[图像：Amazon ElastiCache 参数组层\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-ParameterGroups-Tiers.png)


*Amazon ElastiCache 参数组层*

**全局默认值**

区域中所有 Amazon ElastiCache 客户的顶级根参数组。

全局默认缓存参数组：
+ 预留供 ElastiCache 使用，对客户不可用。

**客户默认值**

创建供用户使用的全局默认缓存参数组的副本。

客户默认缓存参数组：
+ 由 ElastiCache 创建和所有。
+ 可供客户用作缓存参数组，用于运行此缓存参数组所支持引擎版本的任意集群。
+ 无法由客户编辑。

**客户拥有**

客户默认缓存参数组的副本。客户拥有的缓存参数组在客户创建缓存参数组时创建。

客户拥有的缓存参数组：
+ 由客户创建并拥有。
+ 可以分配给任意客户兼容的集群。
+ 可由客户修改用于创建自定义缓存参数组。

  并非所有参数值均可修改。有关 Memcached 值的更多信息，请参阅[Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)？ 有关 Valkey 和 Redis OSS 值的更多信息，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)

# 创建 ElastiCache 参数组
<a name="ParameterGroups.Creating"></a>

如果存在一个或多个要从默认值更改的参数值，则需要创建新参数组。您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 创建参数组。

## 创建 ElastiCache 参数组（控制台）
<a name="ParameterGroups.Creating.CON"></a>

以下过程介绍了如何使用 ElastiCache 控制台创建参数组。

**使用 ElastiCache 控制台创建参数组**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/))。

1. 要查看所有可用的参数组列表，请在导航窗格左侧选择**Parameter Groups**。

1. 要创建参数组，请选择 **Create Parameter Group**。

   **Create Parameter Group（创建参数组）**屏幕随即出现。

1. 从 **Family** 列表中，选择将作为参数组的模板的参数组系列。

   参数组系列（例如 *memcached1.4* 或 *redis3.2*）定义了参数组中的实际参数及其初始值。参数组系列必须与集群的引擎和版本一致。

1. 在 **Name** 框中，键入此参数组的唯一名称。

   在创建集群或修改集群的参数组时，您将按参数组的名称选择参数组。因此，建议名称具有信息性，并且以某种方法标识该参数组的系列。

   参数组命名约束如下：
   + 必须以 ASCII 字母开头。
   + 只能包含 ASCII 字母、数字和连字符。
   + 长度必须介于 1 到 255 个字符之间。
   + 不能包含两个连续连字符。
   + 不能以连字符结束。

1. 在 **Description** 框中，键入参数组的说明。

1. 要创建参数组，请选择 **Create**。

   要在不创建参数组的情况下终止此过程，请选择 **Cancel**。

1. 创建参数组后，它将具有系列的默认值。要更改默认值，您必须修改参数组。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

## 创建 ElastiCache 参数组（Amazon CLI）
<a name="ParameterGroups.Creating.CLI"></a>

要使用 Amazon CLI 创建参数组，请使用带以下参数的命令 `create-cache-parameter-group`。
+ `--cache-parameter-group-name` – 参数组的名称。

  参数组命名约束如下：
  + 必须以 ASCII 字母开头。
  + 只能包含 ASCII 字母、数字和连字符。
  + 长度必须介于 1 到 255 个字符之间。
  + 不能包含两个连续连字符。
  + 不能以连字符结束。
+ `--cache-parameter-group-family` – 参数组的引擎和版本系列。
+ `--description` – 用户提供的参数组描述。

**Example**  
以下示例使用 memcached1.4 系列作为模板来创建名为 *myMem14* 的参数组。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache create-cache-parameter-group \
    --cache-parameter-group-name myMem14  \
    --cache-parameter-group-family memcached1.4 \
    --description "My first parameter group"
```
对于 Windows：  

```
aws elasticache create-cache-parameter-group ^
    --cache-parameter-group-name myMem14  ^
    --cache-parameter-group-family memcached1.4 ^
    --description "My first parameter group"
```
该命令的输出内容应类似如下所示。  

```
{
    "CacheParameterGroup": {
        "CacheParameterGroupName": "myMem14", 
        "CacheParameterGroupFamily": "memcached1.4", 
        "Description": "My first  parameter group"
    }
}
```

**Example**  
以下示例使用 redis2.8 系列作为模板来创建名为 *myRed28* 的参数组。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache create-cache-parameter-group \
    --cache-parameter-group-name myRed28  \
    --cache-parameter-group-family redis2.8 \
    --description "My first parameter group"
```
对于 Windows：  

```
aws elasticache create-cache-parameter-group ^
    --cache-parameter-group-name myRed28  ^
    --cache-parameter-group-family redis2.8 ^
    --description "My first parameter group"
```
该命令的输出内容应类似如下所示。  

```
{
    "CacheParameterGroup": {
        "CacheParameterGroupName": "myRed28", 
        "CacheParameterGroupFamily": "redis2.8", 
        "Description": "My first parameter group"
    }
}
```

创建参数组后，它将具有系列的默认值。要更改默认值，您必须修改参数组。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

有关更多信息，请参阅 [https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-cache-parameter-group.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-cache-parameter-group.html)。

## 创建 ElastiCache 参数组（ElastiCache API）
<a name="ParameterGroups.Creating.API"></a>

要使用 ElastiCache API 创建参数组，请使用带以下参数的 `CreateCacheParameterGroup` 操作。
+ `ParameterGroupName` – 参数组的名称。

  参数组命名约束如下：
  + 必须以 ASCII 字母开头。
  + 只能包含 ASCII 字母、数字和连字符。
  + 长度必须介于 1 到 255 个字符之间。
  + 不能包含两个连续连字符。
  + 不能以连字符结束。
+ `CacheParameterGroupFamily` – 参数组的引擎和版本系列。例如 `memcached1.4`。
+ `CacheParameterGroupFamily` – 参数组的引擎和版本系列。例如 `redis2.8`。
+ `Description` – 用户提供的参数组描述。

**Example**  
以下示例使用 memcached1.4 系列作为模板来创建名为 *myMem14* 的参数组。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=CreateCacheParameterGroup
   &CacheParameterGroupFamily=memcached1.4
   &CacheParameterGroupName=myMem14
   &Description=My%20first%20parameter%20group
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
来自此操作的响应应类似如下所示。  

```
<CreateCacheParameterGroupResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <CreateCacheParameterGroupResult>
    <CacheParameterGroup>
      <CacheParameterGroupName>myMem14</CacheParameterGroupName>
      <CacheParameterGroupFamily>memcached1.4</CacheParameterGroupFamily>
      <Description>My first  parameter group</Description>
    </CacheParameterGroup>
  </CreateCacheParameterGroupResult>
  <ResponseMetadata>
    <RequestId>d8465952-af48-11e0-8d36-859edca6f4b8</RequestId>
  </ResponseMetadata>
</CreateCacheParameterGroupResponse>
```

**Example**  
以下示例使用 redis2.8 系列作为模板来创建名为 *myRed28* 的参数组。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=CreateCacheParameterGroup
   &CacheParameterGroupFamily=redis2.8
   &CacheParameterGroupName=myRed28
   &Description=My%20first%20parameter%20group
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
来自此操作的响应应类似如下所示。  

```
<CreateCacheParameterGroupResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <CreateCacheParameterGroupResult>
    <CacheParameterGroup>
      <CacheParameterGroupName>myRed28</CacheParameterGroupName>
      <CacheParameterGroupFamily>redis2.8</CacheParameterGroupFamily>
      <Description>My first parameter group</Description>
    </CacheParameterGroup>
  </CreateCacheParameterGroupResult>
  <ResponseMetadata>
    <RequestId>d8465952-af48-11e0-8d36-859edca6f4b8</RequestId>
  </ResponseMetadata>
</CreateCacheParameterGroupResponse>
```

创建参数组后，它将具有系列的默认值。要更改默认值，您必须修改参数组。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

有关更多信息，请参阅 [https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateCacheParameterGroup.html](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_CreateCacheParameterGroup.html)。

# 按名称列出 ElastiCache 参数组
<a name="ParameterGroups.ListingGroups"></a>

您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 列出参数组。

## 按名称列出参数组（控制台）
<a name="ParameterGroups.ListingGroups.CON"></a>

以下过程介绍了如何使用 ElastiCache 控制台查看参数组列表。

**使用 ElastiCache 控制台列出参数组**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/))。

1. 要查看所有可用的参数组列表，请在导航窗格左侧选择**Parameter Groups**。

## 按名称列出 ElastiCache 参数组（Amazon CLI）
<a name="ParameterGroups.ListingGroups.CLI"></a>

要使用 Amazon CLI 生成参数组的列表，请使用命令 `describe-cache-parameter-groups`。如果提供了参数组的名称，将只会列出该参数组。如果未提供参数组的名称，将列出最多 `--max-records` 个参数组。在任一情况下，都会列出参数组的名称、系列和描述。

**Example**  
以下示例代码列出了参数组 *myMem14*。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache describe-cache-parameter-groups \
    --cache-parameter-group-name myMem14
```
对于 Windows：  

```
aws elasticache describe-cache-parameter-groups ^
    --cache-parameter-group-name myMem14
```
该命令的输出内容将类似如下所示，列出参数组的名称、系列和描述。  

```
{
    "CacheParameterGroups": [
	    {
	        "CacheParameterGroupName": "myMem14", 
	        "CacheParameterGroupFamily": "memcached1.4", 
	        "Description": "My first parameter group"
	    }
    ]
}
```

**Example**  
以下示例代码列出了参数组 *myRed28*。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache describe-cache-parameter-groups \
    --cache-parameter-group-name myRed28
```
对于 Windows：  

```
aws elasticache describe-cache-parameter-groups ^
    --cache-parameter-group-name myRed28
```
该命令的输出内容将类似如下所示，列出参数组的名称、系列和描述。  

```
{
    "CacheParameterGroups": [
	    {
	        "CacheParameterGroupName": "myRed28", 
	        "CacheParameterGroupFamily": "redis2.8", 
	        "Description": "My first parameter group"
	    }
    ]
}
```

**Example**  
以下示例代码列出了在 Redis OSS 引擎 5.0.6 和更高版本上运行的参数组 *myRed56*。如果参数组是 [使用全球数据存储跨Amazon区域复制](Redis-Global-Datastore.md) 的一部分，则在输出中返回的 `IsGlobal` 属性值将为 `Yes`。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache describe-cache-parameter-groups \
    --cache-parameter-group-name myRed56
```
对于 Windows：  

```
aws elasticache describe-cache-parameter-groups ^
    --cache-parameter-group-name myRed56
```
该命令的输出内容将类似如下所示，列出参数组的名称、系列和描述，以及是否属于全局数据存储。  

```
{
    "CacheParameterGroups": [
	    {
	        "CacheParameterGroupName": "myRed56", 
	        "CacheParameterGroupFamily": "redis5.0", 	        
	        "Description": "My first parameter group",
	        "IsGlobal": "yes"	        
	    }
    ]
}
```

**Example**  
以下示例代码列出最多 10 个参数组。  

```
aws elasticache describe-cache-parameter-groups --max-records 10
```
该命令的 JSON 输出将类似如下所示，列出每个参数组的名称、系列和描述，如果是 redis5.6，还会列出该参数组是否属于全局数据存储 (isGlobal)。  

```
{
    "CacheParameterGroups": [
        {
            "CacheParameterGroupName": "custom-redis32", 
            "CacheParameterGroupFamily": "redis3.2", 
            "Description": "custom parameter group with reserved-memory > 0"
        }, 
        {
            "CacheParameterGroupName": "default.memcached1.4", 
            "CacheParameterGroupFamily": "memcached1.4", 
            "Description": "Default parameter group for memcached1.4"
        }, 
        {
            "CacheParameterGroupName": "default.redis2.6", 
            "CacheParameterGroupFamily": "redis2.6", 
            "Description": "Default parameter group for redis2.6"
        }, 
        {
            "CacheParameterGroupName": "default.redis2.8", 
            "CacheParameterGroupFamily": "redis2.8", 
            "Description": "Default parameter group for redis2.8"
        }, 
        {
            "CacheParameterGroupName": "default.redis3.2", 
            "CacheParameterGroupFamily": "redis3.2", 
            "Description": "Default parameter group for redis3.2"
        }, 
        {
            "CacheParameterGroupName": "default.redis3.2.cluster.on", 
            "CacheParameterGroupFamily": "redis3.2", 
            "Description": "Customized default parameter group for redis3.2 with cluster mode on"
        },
        {
            "CacheParameterGroupName": "default.redis5.6.cluster.on", 
            "CacheParameterGroupFamily": "redis5.0", 
            "Description": "Customized default parameter group for redis5.6 with cluster mode on",
            "isGlobal": "yes"
        },
    ]
}
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-cache-parameter-groups.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-cache-parameter-groups.html)。

## 按名称列出 ElastiCache 参数组（ElastiCache API）
<a name="ParameterGroups.ListingGroups.API"></a>

要使用 ElastiCache API 生成参数组的列表，请使用 `DescribeCacheParameterGroups` 操作。如果提供了参数组的名称，将只会列出该参数组。如果未提供参数组的名称，将列出最多 `MaxRecords` 个参数组。在任一情况下，都会列出参数组的名称、系列和描述。

**Example**  
以下示例代码列出了参数组 *myMem14*。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeCacheParameterGroups
   &CacheParameterGroupName=myMem14
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
来自此操作的响应应类似如下所示，列出每个参数组的名称、系列和描述。  

```
<DescribeCacheParameterGroupsResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <DescribeCacheParameterGroupsResult>
    <CacheParameterGroups>
      <CacheParameterGroup>
        <CacheParameterGroupName>myMem14</CacheParameterGroupName>
        <CacheParameterGroupFamily>memcached1.4</CacheParameterGroupFamily>
        <Description>My custom Memcached 1.4 parameter group</Description>
      </CacheParameterGroup>
    </CacheParameterGroups>
  </DescribeCacheParameterGroupsResult>
  <ResponseMetadata>
    <RequestId>3540cc3d-af48-11e0-97f9-279771c4477e</RequestId>
  </ResponseMetadata>
</DescribeCacheParameterGroupsResponse>
```

**Example**  
以下示例代码列出最多 10 个参数组。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeCacheParameterGroups
   &MaxRecords=10
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
此操作所得到的响应将类似如下所示，列出每个参数组的名称、系列和描述，如果是 redis5.6，还会列出该参数组是否属于全局数据存储 (isGlobal)。  

```
<DescribeCacheParameterGroupsResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <DescribeCacheParameterGroupsResult>
    <CacheParameterGroups>
      <CacheParameterGroup>
        <CacheParameterGroupName>myRedis28</CacheParameterGroupName>
        <CacheParameterGroupFamily>redis2.8</CacheParameterGroupFamily>
        <Description>My custom Redis 2.8 parameter group</Description>
      </CacheParameterGroup>
      <CacheParameterGroup>
        <CacheParameterGroupName>myMem14</CacheParameterGroupName>
        <CacheParameterGroupFamily>memcached1.4</CacheParameterGroupFamily>
        <Description>My custom Memcached 1.4 parameter group</Description>
      </CacheParameterGroup>
       <CacheParameterGroup>
        <CacheParameterGroupName>myRedis56</CacheParameterGroupName>
        <CacheParameterGroupFamily>redis5.0</CacheParameterGroupFamily>
        <Description>My custom redis 5.6 parameter group</Description>
        <isGlobal>yes</isGlobal>
      </CacheParameterGroup>
    </CacheParameterGroups>
  </DescribeCacheParameterGroupsResult>
  <ResponseMetadata>
    <RequestId>3540cc3d-af48-11e0-97f9-279771c4477e</RequestId>
  </ResponseMetadata>
</DescribeCacheParameterGroupsResponse>
```

**Example**  
以下示例代码列出了参数组 *myRed28*。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeCacheParameterGroups
   &CacheParameterGroupName=myRed28
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
来自此操作的响应将类似如下所示，列出名称、系列和描述。  

```
<DescribeCacheParameterGroupsResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <DescribeCacheParameterGroupsResult>
    <CacheParameterGroups>
      <CacheParameterGroup>
        <CacheParameterGroupName>myRed28</CacheParameterGroupName>
        <CacheParameterGroupFamily>redis2.8</CacheParameterGroupFamily>
        <Description>My custom Redis 2.8 parameter group</Description>
      </CacheParameterGroup>
    </CacheParameterGroups>
  </DescribeCacheParameterGroupsResult>
  <ResponseMetadata>
    <RequestId>3540cc3d-af48-11e0-97f9-279771c4477e</RequestId>
  </ResponseMetadata>
</DescribeCacheParameterGroupsResponse>
```

**Example**  
以下示例代码列出了参数组 *myRed56*。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeCacheParameterGroups
   &CacheParameterGroupName=myRed56
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
此操作所得到的响应将类似如下所示，列出名称、系列、描述，以及该参数组是否属于全局数据存储 (isGlobal)。  

```
<DescribeCacheParameterGroupsResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <DescribeCacheParameterGroupsResult>
    <CacheParameterGroups>
      <CacheParameterGroup>
        <CacheParameterGroupName>myRed56</CacheParameterGroupName>
        <CacheParameterGroupFamily>redis5.0</CacheParameterGroupFamily>
        <Description>My custom Redis 5.6 parameter group</Description>
        <isGlobal>yes</isGlobal>
      </CacheParameterGroup>
    </CacheParameterGroups>
  </DescribeCacheParameterGroupsResult>
  <ResponseMetadata>
    <RequestId>3540cc3d-af48-11e0-97f9-279771c4477e</RequestId>
  </ResponseMetadata>
</DescribeCacheParameterGroupsResponse>
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameterGroups.html](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameterGroups.html)。

# 列出 ElastiCache 参数组的值
<a name="ParameterGroups.ListingValues"></a>

您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 列出参数组的参数及其值。

## 列出 ElastiCache 参数组的值（控制台）
<a name="ParameterGroups.ListingValues.CON"></a>

以下过程介绍了如何使用 ElastiCache 控制台列出参数组的参数及其值。

**使用 ElastiCache 控制台列出参数组的参数及其值**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/))。

1. 要查看所有可用的参数组列表，请在导航窗格左侧选择**Parameter Groups**。

1. 通过选择参数组名称左侧的框来选择要列出其中包含的参数及其值的参数组。

   屏幕底部将列出这些参数及其值。由于参数的数量，您可能需要上下滚动来查找所需的参数。

## 列出参数组的值 (Amazon CLI)
<a name="ParameterGroups.ListingValues.CLI"></a>

要使用 Amazon CLI 列出参数组的参数及其值，请使用命令 `describe-cache-parameters`。

**Example**  
以下示例代码列出了参数组 *myMem14* 的所有 Memcached 参数及其值。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache describe-cache-parameters \
    --cache-parameter-group-name myMem14
```
对于 Windows：  

```
aws elasticache describe-cache-parameters ^
    --cache-parameter-group-name myMem14
```

**Example**  
以下示例代码列出了参数组 *myRedis28* 的所有参数及其值。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache describe-cache-parameters \
    --cache-parameter-group-name myRedis28
```
对于 Windows：  

```
aws elasticache describe-cache-parameters ^
    --cache-parameter-group-name myRed28
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-cache-parameters.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-cache-parameters.html)。

## 列出参数组的值 (ElastiCache API)
<a name="ParameterGroups.ListingValues.API"></a>

要使用 ElastiCache API 列出参数组的参数及其值，请使用 `DescribeCacheParameters` 操作。

**Example**  
以下示例代码列出了参数组 *myMem14* 的所有 Memcached 参数。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeCacheParameters
   &CacheParameterGroupName=myMem14
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
来自此操作的响应将类似如下所示。此响应已被截断。  

```
<DescribeCacheParametersResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <DescribeCacheParametersResult>
    <CacheClusterClassSpecificParameters>
      <CacheNodeTypeSpecificParameter>
        <DataType>integer</DataType>
        <Source>system</Source>
        <IsModifiable>false</IsModifiable>
        <Description>The maximum configurable amount of memory to use to store items, in megabytes.</Description>
        <CacheNodeTypeSpecificValues>
          <CacheNodeTypeSpecificValue>
            <Value>1000</Value>
            <CacheClusterClass>cache.c1.medium</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          <CacheNodeTypeSpecificValue>
            <Value>6000</Value>
            <CacheClusterClass>cache.c1.xlarge</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          <CacheNodeTypeSpecificValue>
            <Value>7100</Value>
            <CacheClusterClass>cache.m1.large</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          <CacheNodeTypeSpecificValue>
            <Value>1300</Value>
            <CacheClusterClass>cache.m1.small</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          
...output omitted...

    </CacheClusterClassSpecificParameters>
  </DescribeCacheParametersResult>
  <ResponseMetadata>
    <RequestId>6d355589-af49-11e0-97f9-279771c4477e</RequestId>
  </ResponseMetadata>
</DescribeCacheParametersResponse>
```

**Example**  
以下示例代码列出了参数组 *myRed28* 的所有参数。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DescribeCacheParameters
   &CacheParameterGroupName=myRed28
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```
来自此操作的响应将类似如下所示。此响应已被截断。  

```
<DescribeCacheParametersResponse xmlns="http://elasticache.amazonaws.com/doc/2013-06-15/">
  <DescribeCacheParametersResult>
    <CacheClusterClassSpecificParameters>
      <CacheNodeTypeSpecificParameter>
        <DataType>integer</DataType>
        <Source>system</Source>
        <IsModifiable>false</IsModifiable>
        <Description>The maximum configurable amount of memory to use to store items, in megabytes.</Description>
        <CacheNodeTypeSpecificValues>
          <CacheNodeTypeSpecificValue>
            <Value>1000</Value>
            <CacheClusterClass>cache.c1.medium</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          <CacheNodeTypeSpecificValue>
            <Value>6000</Value>
            <CacheClusterClass>cache.c1.xlarge</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          <CacheNodeTypeSpecificValue>
            <Value>7100</Value>
            <CacheClusterClass>cache.m1.large</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          <CacheNodeTypeSpecificValue>
            <Value>1300</Value>
            <CacheClusterClass>cache.m1.small</CacheClusterClass>
          </CacheNodeTypeSpecificValue>
          
...output omitted...

    </CacheClusterClassSpecificParameters>
  </DescribeCacheParametersResult>
  <ResponseMetadata>
    <RequestId>6d355589-af49-11e0-97f9-279771c4477e</RequestId>
  </ResponseMetadata>
</DescribeCacheParametersResponse>
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameters.html](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeCacheParameters.html)。

# 修改 ElastiCache 参数组
<a name="ParameterGroups.Modifying"></a>

**重要**  
您无法修改任何默认参数组。

您可以修改参数组中的某些参数值。这些参数值应用于与参数组关联的集群。有关参数值更改何时应用于参数组的更多信息，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis) 和 [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)。

## 修改参数组（控制台）
<a name="ParameterGroups.Modifying.CON"></a>

以下过程介绍了如何使用 ElastiCache 控制台更改 `cluster-enabled` 参数的值。您可以使用相同的过程来更改任意参数的值。

**使用 ElastiCache 控制台更改参数的值**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/))。

1. 要查看所有可用的参数组列表，请在导航窗格左侧选择**Parameter Groups**。

1. 通过选择参数组名称左侧的框来选择要修改的参数组。

   屏幕底部将列出参数组的参数。您可能需要浏览列表才能查看所有参数。

1. 要修改一个或多个参数，请选择 **Edit Parameters**。

1. 在 **Edit Parameter Group:（编辑参数组：）**屏幕上，使用左箭头和右箭头滚动找到 `binding_protocol` 参数，然后在 **Value（值）**列中键入 `ascii`。

1. 选择**保存更改**。

1. 对于 Memcached，要查找您更改的参数名称，请参阅 [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)。如果参数更改在*重新启动* 生效，则重启使用此参数组的所有集群。有关更多信息，请参阅[重启集群](Clusters.html#Rebooting)。

1. 对于 Valkey 和 Redis OSS，要查找您更改的参数名称，请参阅[Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。如果您的集群为 Valkey 和 Redis OSS（已禁用集群模式）集群并对以下参数进行了更改，则您必须重启集群中的节点：
   + activerehashing
   + 数据库

    有关更多信息，请参阅[重启节点](nodes.rebooting.md)。
**Valkey 或 Redis OSS（已启用集群模式）参数更改**  
如果要更改 Valkey 或 Redis OSS（已启用集群模式）集群上的以下参数，请按照随后的步骤操作。  
activerehashing
数据库
对于 Redis OSS，您可以创建集群的手动备份。请参阅[进行手动备份](backups-manual.md)。
请删除集群。请参阅[删除集群](Clusters.html#Delete)。
使用修改的参数组和备份还原集群，以便为新集群创建种子。请参阅[从备份还原到新缓存](backups-restoring.md)。
对其他参数的更改不需要执行此操作。



## 修改参数组 (Amazon CLI)
<a name="ParameterGroups.Modifying.CLI"></a>

要使用 Amazon CLI 更改参数值，请使用命令 `modify-cache-parameter-group`。

**Example**  
对于 Memcached，要查找您要更改的参数名称和允许的值，请参阅 [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)  
以下示例代码演示设置两个参数的值：参数组 `myMem14` 的 *chunk\$1size* 和 *chunk\$1size\$1growth\$1fact*。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache modify-cache-parameter-group \
    --cache-parameter-group-name myMem14 \
    --parameter-name-values \
        ParameterName=chunk_size,ParameterValue=96 \
        ParameterName=chunk_size_growth_fact,ParameterValue=1.5
```
对于 Windows：  

```
aws elasticache modify-cache-parameter-group ^
    --cache-parameter-group-name myMem14 ^
    --parameter-name-values ^
        ParameterName=chunk_size,ParameterValue=96 ^
        ParameterName=chunk_size_growth_fact,ParameterValue=1.5
```
此命令的输出如下所示。  

```
{
    "CacheParameterGroupName": "myMem14"
}
```

**Example**  
对于 Valkey 和 Redis OSS，要查找您要更改的参数名称和允许的值，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)  
以下示例代码演示设置两个参数的值：参数组 `myredis32-on-30` 的 *reserved-memory-percent* 和 *cluster-enabled*。我们将 *reserved-memory-percent* 设置为 `30`（30%）并将 *cluster-enabled* 设置为 `yes`，以便参数组可与 Valkey 或 Redis OSS（已启用集群模式）集群（复制组）搭配使用。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache modify-cache-parameter-group \
    --cache-parameter-group-name myredis32-on-30 \
    --parameter-name-values \
        ParameterName=reserved-memory-percent,ParameterValue=30 \
        ParameterName=cluster-enabled,ParameterValue=yes
```
对于 Windows：  

```
aws elasticache modify-cache-parameter-group ^
    --cache-parameter-group-name myredis32-on-30 ^
    --parameter-name-values ^
        ParameterName=reserved-memory-percent,ParameterValue=30 ^
        ParameterName=cluster-enabled,ParameterValue=yes
```
此命令的输出如下所示。  

```
{
    "CacheParameterGroupName": "my-redis32-on-30"
}
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-cache-parameter-group.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-cache-parameter-group.html)。

要查找您更改的参数名称，请参阅[Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。

 如果您的集群为 Valkey 和 Redis OSS（已禁用集群模式）集群并对以下参数进行了更改，则您必须重启集群中的节点：
+ activerehashing
+ 数据库

 有关更多信息，请参阅[重启节点](nodes.rebooting.md)。

**Valkey 或 Redis OSS（已启用集群模式）参数更改**  
如果要更改 Valkey 或 Redis OSS（已启用集群模式）集群上的以下参数，请按照随后的步骤操作。  
activerehashing
数据库
创建集群的手动备份。请参阅[进行手动备份](backups-manual.md)。
请删除集群。请参阅[删除集群](Clusters.html#Delete)。
使用修改的参数组和备份还原集群，以便为新集群创建种子。请参阅[从备份还原到新缓存](backups-restoring.md)。
对其他参数的更改不需要执行此操作。

## 修改参数组 (ElastiCache API)
<a name="ParameterGroups.Modifying.API"></a>

要使用 ElastiCache API 更改参数组的参数值，请使用 `ModifyCacheParameterGroup` 操作。

**Example**  
对于 Memcached，要查找您要更改的参数名称和允许的值，请参阅 [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)  
以下示例代码演示设置两个参数的值：参数组 `myMem14` 的 *chunk\$1size* 和 *chunk\$1size\$1growth\$1fact*。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=ModifyCacheParameterGroup
   &CacheParameterGroupName=myMem14
   &ParameterNameValues.member.1.ParameterName=chunk_size
   &ParameterNameValues.member.1.ParameterValue=96
   &ParameterNameValues.member.2.ParameterName=chunk_size_growth_fact
   &ParameterNameValues.member.2.ParameterValue=1.5
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```

**Example**  
对于 Valkey 和 Redis OSS，要查找您要更改的参数名称和允许的值，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)  
以下示例代码演示设置两个参数的值：参数组 `myredis32-on-30` 的 *reserved-memory-percent* 和 *cluster-enabled*。我们将 *reserved-memory-percent* 设置为 `30`（30%）并将 *cluster-enabled* 设置为 `yes`，以便参数组可与 Valkey 或 Redis OSS（已启用集群模式）集群（复制组）搭配使用。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=ModifyCacheParameterGroup
   &CacheParameterGroupName=myredis32-on-30
   &ParameterNameValues.member.1.ParameterName=reserved-memory-percent
   &ParameterNameValues.member.1.ParameterValue=30
   &ParameterNameValues.member.2.ParameterName=cluster-enabled
   &ParameterNameValues.member.2.ParameterValue=yes
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyCacheParameterGroup.html](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyCacheParameterGroup.html)。

如果您的集群为 Valkey 和 Redis OSS（已禁用集群模式）集群并对以下参数进行了更改，则您必须重启集群中的节点：
+ activerehashing
+ 数据库

 有关更多信息，请参阅 [重启节点](nodes.rebooting.md)。

**Valkey 或 Redis OSS（已启用集群模式）参数更改**  
如果要更改 Valkey 或 Redis OSS（已启用集群模式）集群上的以下参数，请按照随后的步骤操作。  
activerehashing
数据库
创建集群的手动备份。请参阅[进行手动备份](backups-manual.md)。
请删除集群。请参阅[删除中的集群 ElastiCache](Clusters.Delete.md)。
使用修改的参数组和备份还原集群，以便为新集群创建种子。请参阅[从备份还原到新缓存](backups-restoring.md)。
对其他参数的更改不需要执行此操作。

# 删除 ElastiCache 参数组
<a name="ParameterGroups.Deleting"></a>

您可以使用 ElastiCache 控制台、Amazon CLI 或 ElastiCache API 删除自定义参数组。

如果参数组与任何集群关联，则无法将其删除。也无法删除任一默认参数组。

## 删除参数组（控制台）
<a name="ParameterGroups.Deleting.CON"></a>

以下过程介绍了如何使用 ElastiCache 控制台删除参数组。

**使用 ElastiCache 控制台删除参数组**

1. 登录 Amazon Web Services 管理控制台 并打开 ElastiCache 控制台 ([https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/))。

1. 要查看所有可用的参数组列表，请在导航窗格左侧选择**Parameter Groups**。

1. 通过选择参数组名称左侧的框来选择要删除的参数组。

   **Delete** 按钮将变为活动状态。

1. 选择**删除**。

   **Delete Parameter Groups** 确认屏幕随即出现。

1. 要删除参数组，请在 **Delete Parameter Groups** 确认屏幕上选择 **Delete**。

   要保留参数组，请选择 **Cancel**。

## 删除参数组 (Amazon CLI)
<a name="ParameterGroups.Deleting.CLI"></a>

要使用 Amazon CLI 删除参数组，请使用命令 `delete-cache-parameter-group`。对于要删除的参数组，由 `--cache-parameter-group-name` 指定的参数组不能具有与之关联的任何集群，也不能是默认参数组。

以下示例代码删除 *myMem14* 参数组。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws elasticache delete-cache-parameter-group \
    --cache-parameter-group-name myRed28
```
对于 Windows：  

```
aws elasticache delete-cache-parameter-group ^
    --cache-parameter-group-name myRed28
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-cache-parameter-group.html](https://docs.amazonaws.cn/cli/latest/reference/elasticache/delete-cache-parameter-group.html)。

## 删除参数组 (ElastiCache API)
<a name="ParameterGroups.Deleting.API"></a>

要使用 ElastiCache API 删除参数组，请使用 `DeleteCacheParameterGroup` 操作。对于要删除的参数组，由 `CacheParameterGroupName` 指定的参数组不能具有与之关联的任何集群，也不能是默认参数组。

**Example**  
对于 Memcached，以下示例代码将删除 *myMem14* 参数组。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DeleteCacheParameterGroup
   &CacheParameterGroupName=myMem14
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```

**Example**  
以下示例代码删除 *myRed28* 参数组。  

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=DeleteCacheParameterGroup
   &CacheParameterGroupName=myRed28
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Timestamp=20150202T192317Z
   &Version=2015-02-02
   &X-Amz-Credential=<credential>
```

有关更多信息，请参阅 [https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DeleteCacheParameterGroup.html](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DeleteCacheParameterGroup.html)。

# 引擎特定参数
<a name="ParameterGroups.Engine"></a>

**Valkey 和 Redis OSS**

大多数 Valkey 8 参数都与 Redis OSS 7.1 参数兼容。Valkey 7.2 的参数与 Redis OSS 7 的参数相同。

如果您没有为 Valkey 或 Redis OSS 集群指定参数组，则将使用适合您引擎版本的默认参数组。您无法更改默认参数组中的任何参数的值。但是，您可以随时创建自定义参数组并将其分配给集群，只要可按条件修改的参数的值在两个参数组中相同。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

**Topics**
+ [

## Valkey 和 Redis OSS 参数
](#ParameterGroups.Redis)
+ [

## Memcached 特定的参数
](#ParameterGroups.Memcached)

## Valkey 和 Redis OSS 参数
<a name="ParameterGroups.Redis"></a>

**Topics**
+ [

### Valkey 8.2 参数更改
](#ParameterGroups.Valkey.8.2)
+ [

### Valkey 8.1 参数更改
](#ParameterGroups.Valkey.8.1)
+ [

### Valkey 8.0 参数更改
](#ParameterGroups.Valkey.8)
+ [

### Valkey 7.2 和 Redis OSS 7 参数更改
](#ParameterGroups.Redis.7)
+ [

### Redis OSS 6.x 参数更改
](#ParameterGroups.Redis.6-x)
+ [

### Redis OSS 5.0.3 参数更改
](#ParameterGroups.Redis.5-0-3)
+ [

### Redis OSS 5.0.0 参数更改
](#ParameterGroups.Redis.5.0)
+ [

### Redis OSS 4.0.10 参数更改
](#ParameterGroups.Redis.4-0-10)
+ [

### Redis OSS 3.2.10 参数更改
](#ParameterGroups.Redis.3-2-10)
+ [

### Redis OSS 3.2.6 参数更改
](#ParameterGroups.Redis.3-2-6)
+ [

### Redis OSS 3.2.4 参数更改
](#ParameterGroups.Redis.3-2-4)
+ [

### Redis OSS 2.8.24（加强版）增加的参数
](#ParameterGroups.Redis.2-8-24)
+ [

### Redis OSS 2.8.23（加强版）增加的参数
](#ParameterGroups.Redis.2-8-23)
+ [

### Redis OSS 2.8.22（加强版）增加的参数
](#ParameterGroups.Redis.2-8-22)
+ [

### Redis OSS 2.8.21 增加的参数
](#ParameterGroups.Redis.2-8-21)
+ [

### Redis OSS 2.8.19 增加的参数
](#ParameterGroups.Redis.2-8-19)
+ [

### Redis OSS 2.8.6 增加的参数
](#ParameterGroups.Redis.2-8-6)
+ [

### Redis OSS 2.6.13 参数
](#ParameterGroups.Redis.2-6-13)
+ [

### 特定于 Redis OSS 节点类型的参数
](#ParameterGroups.Redis.NodeSpecific)

### Valkey 8.2 参数更改
<a name="ParameterGroups.Valkey.8.2"></a>

**参数组家族：valk** ey8

**注意**  
Valkey 8.2 参数更改不适用于 Valkey 8.1
Valkey 8.0 及更高版本的参数组与 Redis OSS 7.2.4 不兼容。
在 Valkey 8.2 中，以下命令不可用于无服务器缓存：`commandlog`、`commandlog get`、`commandlog help`、`commandlog len` 和 `commandlog reset.` 


**Valkey 8.2 中的新参数组**  

| Name | Details | 说明 | 
| --- | --- | --- | 
| search-fanout-target-mode （已在 8.2 中添加） | 默认：客户端 类型：字符串 可修改：是 更改生效：立即 |   search-fanout-target-mode配置参数控制如何在 Valkey 集群环境中跨节点分配搜索查询。此设置支持两个值：“throughput”模式通过将搜索查询随机分配至所有集群节点来优化最大吞吐量，不考虑客户端类型或 READONLY 状态；“client”模式则遵循客户端连接特性：将非 READONLY 客户端仅路由至主节点，将 READONLY 客户端仅路由至副本节点上的副本连接，而将主连接上的 READONLY 客户端随机分配至所有节点。 默认行为是“client”模式，即系统将根据客户端连接类型和 READONLY 状态做出查询路由决策。对于需要最大群集资源利用率的大容量搜索工作负载，使用吞吐量模式；如果要保持 read/write 分离并尊重应用程序级 READONLY 连接模式，请使用客户端模式。 | 
| search-default-timeout-ms |  默认值：50000 允许的值：1 到 60000 类型：整数 可修改：是 更改生效：立即 | Valkey 搜索查询的默认超时（毫秒）。 | 
| search-enable-partial-results | 默认值：yes 允许的值：yes、no 类型：布尔值 可修改：是 更改生效：立即 | 配置 Valkey 搜索的查询失败行为。启用后，如果一个或多个分片出现超时，搜索查询将返回部分结果。禁用后，任何分片超时都将导致整个搜索查询失败并返回错误。 | 

### Valkey 8.1 参数更改
<a name="ParameterGroups.Valkey.8.1"></a>

**参数组家族：valk** ey8

**注意**  
Valkey 8.1 参数更改不适用于 Valkey 8.0
Valkey 8.0 及更高版本的参数组与 Redis OSS 7.2.4 不兼容。
在 Valkey 8.1 中，以下命令不可用于无服务器缓存：`commandlog`、`commandlog get`、`commandlog help`、`commandlog len` 和 `commandlog reset.` 


**Valkey 8.1 中的新参数组**  

| Name | Details | 说明 | 
| --- | --- | --- | 
|  commandlog-large-request-max-len（在 8.1 中添加）  |  默认值：1048576 类型：整数 可修改：是 更改生效：立即  |  Valkey 命令日志功能要记录的请求的最大大小（字节）。  | 
|  commandlog-large-request-max-len（在 8.1 中添加）  |  默认值：128 允许的值：0-1024 类型：整数 可修改：是 更改生效：立即  |  Valkey 命令日志中请求的最大长度。  | 
|  commandlog-reply-larger-than （已在 8.1 版本中添加）  |  默认值：1048576 类型：整数 可修改：是 更改生效：立即  |  Valkey 命令日志功能要记录的响应的最大大小（字节）。  | 
|  commandlog-large-reply-max-len（在 8.1 中添加）  |  默认值：128 允许的值：0-1024 类型：整数 可修改：是 更改生效：立即  |  Valkey 命令日志中响应的最大长度。  | 

### Valkey 8.0 参数更改
<a name="ParameterGroups.Valkey.8"></a>

**参数组家族：valk** ey8

**注意**  
Redis OSS 7.2.4 与 Valkey 8 及更高版本的参数组不兼容。


**Valkey 8.0 中的特定参数更改**  

| Name | Details | 说明 | 
| --- | --- | --- | 
|  repl-backlog-size  |  默认值：10485760 类型：整数 可修改：是 更改生效：立即  |  主节点积压缓冲区的大小（以字节为单位）。积压用于记录主节点上数据的更新。只读副本连接到主节点时会尝试执行部分同步（psync），应用积压中的数据以与主节点同步。如果 psync 失败，则需要完整同步。 此参数的最小值为 16384。 注意：从 Redis OSS 2.8.22 开始，此参数应用于主集群以及只读副本。  | 
|  maxmemory-samples  |  原定设置值：3 允许的值：1 到 64 类型：整数 可修改：是 更改生效：立即  |  对于 least-recently-used (LRU) 和 time-to-live (TTL) 计算，此参数表示要检查的密钥的样本量。默认情况下，Redis OSS 选择 3 个键并使用最近最少使用的一个键。  | 


**Valkey 8.0 中的新参数组**  

| Name | Details | 说明 | 
| --- | --- | --- | 
|  extended-redis-compatibility  |  允许的值：yes、no 默认值：yes 类型：布尔值 可修改：是 发生更改：立即  |  扩展的 Redis OSS 兼容模式让 Valkey 可以模拟 Redis OSS 7.2。仅在工具或客户端出现问题时才启用此选项。 面向客户的影响： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/ParameterGroups.Engine.html)  | 


**在 Valkey 8.0 中移除了参数组**  

| Name | Details | 说明 | 
| --- | --- | --- | 
|  lazyfree-lazy-eviction  |  允许的值：yes、no 默认值：no 类型：布尔值 可修改：是 发生更改：立即  |  对移出执行异步删除。  | 
|  lazyfree-lazy-expire  |  允许的值：yes、no 默认值：no 类型：布尔值 可修改：是 发生更改：立即  |  对已过期密钥执行异步删除。  | 
|  lazyfree-lazy-server-del  |  允许的值：yes、no 默认值：no 类型：布尔值 可修改：是 发生更改：立即  |  对更新值的命令执行异步删除。  | 
|  lazyfree-lazy-user-del  |  默认值：no 类型：字符串 可修改：是 更改生效：立即跨集群中的所有节点生效  |   当该值设置为“yes”时，DEL 命令的行为与 UNLINK 相同。  | 
|  replica-lazy-flush  |  默认值：yes 类型：布尔值 可修改：否 以前的名字： slave-lazy-flush  |  在副本同步期间执行异步 flushDB。  | 

### Valkey 7.2 和 Redis OSS 7 参数更改
<a name="ParameterGroups.Redis.7"></a>

**参数组系列：**valkey7

Valkey 7.2 默认参数组如下所示：
+ `default.valkey7` – 对 Valkey（已禁用集群模式）集群和复制组使用此参数组或从中派生的参数组。
+ `default.valkey7.cluster.on` – 对 Valkey（已启用集群模式）集群和复制组使用此参数组或从中派生的参数组。

**参数组系列：**redis7

Redis OSS 7 默认参数组如下所示：
+ `default.redis7` – 对 Redis OSS（已禁用集群模式）集群和复制组使用此参数组或从中派生的参数组。
+ `default.redis7.cluster.on` – 对 Redis OSS（已启用集群模式）集群和复制组使用此参数组或从中派生的参数组。

**特定参数更改**

Redis OSS 7 中增加的参数如下所示。Valkey 7.2 也支持这些参数。


|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| cluster-allow-pubsubshard-when-down |  允许的值：`yes`、`no` 默认值：`yes` 类型：字符串 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 如果设置为默认值“yes”（是），则允许节点在集群处于停机状态时提供发布订阅分片流量，只要它认为自己拥有插槽即可。  | 
| cluster-preferred-endpoint-type |  允许的值：`ip`、`tls-dynamic` 默认值：`tls-dynamic` 类型：字符串 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 此值控制 MOVED/ASKING 请求返回的端点以及 `CLUSTER SLOTS` 和 `CLUSTER SHARDS` 的端点字段。当该值设置为 ip 时，节点将传播其 IP 地址。当该值设置为 tls-dynamic 时，节点将在启用时通告主机名 encryption-in-transit，否则通告一个 IP 地址。  | 
| latency-tracking |  允许的值：`yes`、`no` 默认值：`no` 类型：字符串 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 设置为“yes”（是）时，将跟踪每个命令的延迟，并允许通过 `INFO` 延迟统计命令导出百分位数分布，并通过 `LATENCY` 命令导出累积延迟分布（直方图）。  | 
| hash-max-listpack-entries |  允许的值：`0+` 默认值：`512` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 压缩数据集所需的最大哈希条目数。  | 
| hash-max-listpack-value |  允许的值：`0+` 默认值：`64` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 压缩数据集所需的最大哈希条目数的阈值。  | 
| zset-max-listpack-entries |  允许的值：`0+` 默认值：`128` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 压缩数据集所需的最大已排序集合条目数。  | 
| zset-max-listpack-value |  允许的值：`0+` 默认值：`64` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 压缩数据集所需的最大已排序集合条目数的阈值。  | 

Redis OSS 7 中更改的参数如下所示。


|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| activerehashing |  可修改：`no`。在 Redis OSS 7 中，默认情况下，此参数处于隐藏和已启用状态。为了禁用此参数，您需要创建一个[支持案例](https://console.amazonaws.cn/support/home)。  | 可修改：是。  | 

Redis OSS 7 中删除的参数如下所示。


|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| hash-max-ziplist-entries |  允许的值：`0+` 默认值：`512` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 使用 `listpack` 而非 `ziplist` 来表示小哈希编码  | 
| hash-max-ziplist-value |  允许的值：`0+` 默认值：`64` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 使用 `listpack` 而非 `ziplist` 来表示小哈希编码  | 
| zset-max-ziplist-entries |  允许的值：`0+` 默认值：`128` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 使用 `listpack` 而非 `ziplist` 来表示小哈希编码。  | 
| zset-max-ziplist-value |  允许的值：`0+` 默认值：`64` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 使用 `listpack` 而非 `ziplist` 来表示小哈希编码。  | 
| list-max-ziplist-size |  允许的值： 默认值：`-2` 类型：整数 可修改：是 更改生效：立即跨集群中的所有节点生效。 | 每个内部列表节点允许的条目数。  | 

### Redis OSS 6.x 参数更改
<a name="ParameterGroups.Redis.6-x"></a>

**参数组系列：**redis6.x

Redis OSS 6.x 默认参数组如下所示：
+ `default.redis6.x` – 对 Valkey 或 Redis OSS（已禁用集群模式）集群和复制组使用此参数组或从中派生的参数组。
+ `default.redis6.x.cluster.on` – 对 Valkey 或 Redis OSS（已启用集群模式）集群和复制组使用此参数组或从中派生的参数组。

**注意**  
 在 Redis OSS 引擎版本 6.2 中，在推出 r6gd 节点系列以使用 [ElastiCache 中的数据分层](data-tiering.md)时，r6gd 节点类型仅支持 *noeviction*、*volatile-lru* 和 *allkeys-lru* max-memory 策略。

有关更多信息，请参阅[ElastiCache 适用于 Redis OSS 的 6.2 版（增强版）](engine-versions.md#redis-version-6.2)和[ElastiCache 适用于 Redis OSS 的 6.0 版（增强版）](engine-versions.md#redis-version-6.0)。

Redis OSS 6.x 中增加的参数如下所示。


|  Details |  说明  | 
| --- | --- | 
| acl-pubsub-default (added in 6.2) |  允许的值：`resetchannels`、`allchannels` 默认值：`allchannels` 类型：字符串 可修改：是 更改的生效范围：与集群关联的现有 Redis OSS 用户将继续拥有现有的权限。需要更新用户或者重新启动集群以更新现有的 Redis OSS 用户。 | 部署到此集群的 ACL 用户将默认拥有发布订阅频道权限。  | 
| cluster-allow-reads-when-down (added in 6.0) |  默认值：no 类型：字符串 可修改：是 更改生效：立即跨集群中的所有节点生效 | 当设置为“是”时，Redis OSS（已启用集群模式）复制组将继续处理读取命令，即使节点无法达到主节点的法定数量。 当设置为默认值“no（不）”时，复制组将拒绝所有命令。如果您使用的集群的节点组少于三个，或者您的应用程序可以安全地处理陈旧读取，我们建议将此值设置为“yes（是）”。  | 
| tracking-table-max-keys (added in 6.0) |  默认值：1000000 类型：数字 可修改：是 更改生效：立即跨集群中的所有节点生效 | 为了帮助客户端缓存，Redis OSS 支持跟踪哪些客户端访问了哪些键。 当所跟踪的密钥被修改后，会向所有客户端发送失效消息，通知它们缓存的值不再有效。此值允许您指定此表的上限。超出此参数值后，将随机向客户端发送失效。应该调整此值以限制内存使用，同时仍对足够的密钥进行跟踪。在内存不足的情况下，密钥也会失效。  | 
| acllog-max-len (added in 6.0) |  默认值：128 类型：数字 可修改：是 更改生效：立即跨集群中的所有节点生效 | 此值对应于 ACL 日志中的最大条目数。  | 
| active-expire-effort (added in 6.0) |  默认：1 类型：数字 可修改：是 更改生效：立即跨集群中的所有节点生效 | Redis OSS 会通过两种机制删除超过键自身存活时间的键。一种机制是，访问密钥并发现其已过期。另一种机制是，周期性任务对密钥进行采样，并使那些超过其存活时间的密钥过期。此参数定义 Redis OSS 用于在周期性任务中使项目过期的工作量。 默认值 1 用于避免 10% 以上的过期密钥仍存在于内存中。其还用于避免 25% 以上的总内存被消耗及增加系统的延迟。您可以将此值增加到 10，以提高用在过期密钥上的工作量。需要权衡的是，当 CPU 更高时，延迟也可能会更高。我们建议将值设为 1，除非您发现内存使用率较高，并且可以容忍 CPU 使用率升高。  | 
| lazyfree-lazy-user-del (added in 6.0) |  默认值：no 类型：字符串 可修改：是 更改生效：立即跨集群中的所有节点生效 | 当该值设置为“yes”时，`DEL` 命令的行为与 `UNLINK` 相同。  | 

Redis OSS 6.x 中删除的参数如下所示。


|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| lua-replicate-commands |  允许的值：yes/no 默认值：yes 类型：布尔值 可修改：是 更改生效：立即 | 是否始终在 Lua 脚本中启用 Lua 效果复制  | 

### Redis OSS 5.0.3 参数更改
<a name="ParameterGroups.Redis.5-0-3"></a>

**参数组系列：**redis5.0

Redis OSS 5.0 默认参数组
+ `default.redis5.0` – 对 Valkey 或 Redis OSS（已禁用集群模式）集群和复制组使用此参数组或从中派生的参数组。
+ `default.redis5.0.cluster.on` – 对 Valkey 或 Redis OSS（已启用集群模式）集群和复制组使用此参数组或从中派生的参数组。


**Redis OSS 5.0.3 中增加的参数**  

|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| rename-commands |  默认：无 类型：字符串 可修改：是 更改生效：立即跨集群中的所有节点生效 | 重命名的 Redis OSS 命令列表，以空格分隔。以下是可用于重命名的命令的限制列表： `APPEND AUTH BITCOUNT BITFIELD BITOP BITPOS BLPOP BRPOP BRPOPLPUSH BZPOPMIN BZPOPMAX CLIENT CLUSTER COMMAND DBSIZE DECR DECRBY DEL DISCARD DUMP ECHO EVAL EVALSHA EXEC EXISTS EXPIRE EXPIREAT FLUSHALL FLUSHDB GEOADD GEOHASH GEOPOS GEODIST GEORADIUS GEORADIUSBYMEMBER GET GETBIT GETRANGE GETSET HDEL HEXISTS HGET HGETALL HINCRBY HINCRBYFLOAT HKEYS HLEN HMGET HMSET HSET HSETNX HSTRLEN HVALS INCR INCRBY INCRBYFLOAT INFO KEYS LASTSAVE LINDEX LINSERT LLEN LPOP LPUSH LPUSHX LRANGE LREM LSET LTRIM MEMORY MGET MONITOR MOVE MSET MSETNX MULTI OBJECT PERSIST PEXPIRE PEXPIREAT PFADD PFCOUNT PFMERGE PING PSETEX PSUBSCRIBE PUBSUB PTTL PUBLISH PUNSUBSCRIBE RANDOMKEY READONLY READWRITE RENAME RENAMENX RESTORE ROLE RPOP RPOPLPUSH RPUSH RPUSHX SADD SCARD SCRIPT SDIFF SDIFFSTORE SELECT SET SETBIT SETEX SETNX SETRANGE SINTER SINTERSTORE SISMEMBER SLOWLOG SMEMBERS SMOVE SORT SPOP SRANDMEMBER SREM STRLEN SUBSCRIBE SUNION SUNIONSTORE SWAPDB TIME TOUCH TTL TYPE UNSUBSCRIBE UNLINK UNWATCH WAIT WATCH ZADD ZCARD ZCOUNT ZINCRBY ZINTERSTORE ZLEXCOUNT ZPOPMAX ZPOPMIN ZRANGE ZRANGEBYLEX ZREVRANGEBYLEX ZRANGEBYSCORE ZRANK ZREM ZREMRANGEBYLEX ZREMRANGEBYRANK ZREMRANGEBYSCORE ZREVRANGE ZREVRANGEBYSCORE ZREVRANK ZSCORE ZUNIONSTORE SCAN SSCAN HSCAN ZSCAN XINFO XADD XTRIM XDEL XRANGE XREVRANGE XLEN XREAD XGROUP XREADGROUP XACK XCLAIM XPENDING GEORADIUS_RO GEORADIUSBYMEMBER_RO LOLWUT XSETID SUBSTR`  | 

有关更多信息，请参阅 [ElastiCache 适用于 Redis OSS 的 5.0.6 版（增强版）](engine-versions.md#redis-version-5-0.6)。

### Redis OSS 5.0.0 参数更改
<a name="ParameterGroups.Redis.5.0"></a>

**参数组系列：**redis5.0

Redis OSS 5.0 默认参数组
+ `default.redis5.0` – 对 Valkey 或 Redis OSS（已禁用集群模式）集群和复制组使用此参数组或从中派生的参数组。
+ `default.redis5.0.cluster.on` – 对 Valkey 或 Redis OSS（已启用集群模式）集群和复制组使用此参数组或从中派生的参数组。


**Redis OSS 5.0 中增加的参数**  

|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| stream-node-max-bytes |  允许的值：0\$1 默认值：4096 类型：整数 可修改：是 更改生效：立即 | 流数据结构是节点的基数树，这些节点对内部的多个项进行编码。使用此配置指定基数树中单个节点的最大大小（以字节为单位）。如果设置为 0，则树节点的大小是不受限制的。 | 
| stream-node-max-entries |  允许的值：0\$1 默认值：100 类型：整数 可修改：是 更改生效：立即 | 流数据结构是节点的基数树，这些节点对内部的多个项进行编码。使用此配置指定在追加新的流条目时切换到新节点之前单个节点可包含的项的最大数目。如果设置为 0，则树节点中的项数是不受限制的  | 
| active-defrag-max-scan-fields |  允许的值：1 到 1000000 默认值：1000 类型：整数 可修改：是 更改生效：立即 | 将从主词典扫描中处理的最大set/hash/zset/list字段数  | 
| lua-replicate-commands |  允许的值：yes/no 默认值：yes 类型：布尔值 可修改：是 更改生效：立即 | 是否始终在 Lua 脚本中启用 Lua 效果复制  | 
| replica-ignore-maxmemory |  默认值：yes 类型：布尔值 可修改：否  | 确定副本是否通过不移出独立于主节点的项来忽略 maxmemory 设置  | 

Redis OSS 已在引擎版本 5.0 中重命名几个参数以响应社区反馈。有关更多信息，请参阅 [Redis OSS 5 中的新增功能](https://www.amazonaws.cn/redis/Whats_New_Redis5/)。下表列出了新名称以及它们映射到早期版本的方式。


**Redis OSS 5.0 中已重命名的参数**  

|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| replica-lazy-flush |  默认值：yes 类型：布尔值 可修改：否 以前的名字： slave-lazy-flush  | 在副本同步期间执行异步 flushDB。 | 
| client-output-buffer-limit-replica-hard-limit | 默认值：有关值的信息，请参阅 [特定于 Redis OSS 节点类型的参数](#ParameterGroups.Redis.NodeSpecific) 类型：整数 可修改：否 以前的名字：client-output-buffer-limit-slave-hard-limit | 对于 Redis OSS 只读副本：如果客户端的输出缓冲区达到指定字节数，则客户端将断开连接。 | 
| client-output-buffer-limit-replica-soft-limit | 默认值：有关值的信息，请参阅 [特定于 Redis OSS 节点类型的参数](#ParameterGroups.Redis.NodeSpecific) 类型：整数 可修改：否 以前的名字：client-output-buffer-limit-slave-soft-limit | 对于 Redis OSS 只读副本：如果客户端的输出缓冲区达到指定字节数，仅当此条件保持 client-output-buffer-limit-replica-soft-seconds 时间时，客户端将断开连接。 | 
| client-output-buffer-limit-replica-soft-seconds | 默认值：60 类型：整数 可修改：否 以前的名字：client-output-buffer-limit-slave-soft-seconds  | 对于 Redis OSS 只读副本：如果客户端的输出缓冲区保持 client-output-buffer-limit-replica-soft-limit 字节的时间长于此秒数，则客户端将断开连接。 | 
| replica-allow-chaining | 默认值：no 类型：字符串 可修改：否 以前的名字： slave-allow-chaining | 确定 Redis OSS 中的只读副本是否可以具有自己的只读副本。 | 
| min-replicas-to-write | 默认：0 类型：整数 可修改：是 以前的名字： min-slaves-to-write 更改生效：立即 | 使主节点可以从客户端接受写入所必需的可用只读副本的最小数目。如果可用副本数下降到低于此数字，则主节点不再接受写入请求。 如果此参数或 min-replicas-max-lag为 0，则即使没有副本可用，主节点也将始终接受写入请求。 | 
| min-replicas-max-lag  | 默认值：10 类型：整数 可修改：是 以前的名字： min-slaves-max-lag 更改生效：立即 | 主节点必须从只读副本收到 Ping 请求的秒数。如果此时间量已过，但主节点未收到 Ping，则不再将副本视为可用。如果可用副本的数量降至以下 min-replicas-to-write，则主副本将在此时停止接受写入。 如果此参数或 min-replicas-to-write为 0，则即使没有副本可用，主节点也将始终接受写入请求。 | 
| close-on-replica-write  | 默认值：yes 类型：布尔值 可修改：是 以前的名字： close-on-slave-write 更改生效：立即 | 如果启用，尝试写入只读副本的客户端将会断开连接。 | 


**Redis OSS 5.0 中已删除的参数**  

|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| repl-timeout |  默认值：60 可修改：否  | 此版本中不提供参数。 | 

### Redis OSS 4.0.10 参数更改
<a name="ParameterGroups.Redis.4-0-10"></a>

**参数组系列：** redis4.0

Redis OSS 4.0.x 默认参数组
+ `default.redis4.0` – 对 Valkey 或 Redis OSS（已禁用集群模式）集群和复制组使用此参数组或从中派生的参数组。
+ `default.redis4.0.cluster.on` – 对 Valkey 或 Redis OSS（已启用集群模式）集群和复制组使用此参数组或从中派生的参数组。


**Redis OSS 4.0.10 中已更改的参数**  

|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| maxmemory-policy |  允许的值：`allkeys-lru`、`volatile-lru`、**allkeys-lfu**、**volatile-lfu**、`allkeys-random`、`volatile-random`、`volatile-ttl`、`noeviction` 默认值：volatile-lru 类型：字符串 可修改：是 发生更改：立即 | 在 2.6.13 版中增加了 maxmemory-policy。在版本 4.0.10 中增加了两个新允许的值：allkeys-lfu（将使用近似的 LFU 移出任何键）；和 volatile-lfu（将使用近似的 LFU 移出具有过期设置的键）。在 6.2 版中，在推出 r6gd 节点系列以支持数据分层功能时，r6gd 节点类型仅支持 noeviction、volatile-lru 和 allkeys-lru max-memory 策略  | 


**Redis OSS 4.0.10 中增加的参数**  

|  Name  |  Details |  说明  | 
| --- |--- |--- |
| **异步删除参数** | 
| --- |
| lazyfree-lazy-eviction |  允许的值：yes/no 默认值：no 类型：布尔值 可修改：是 发生更改：立即 | 对移出执行异步删除。 | 
| lazyfree-lazy-expire |  允许的值：yes/no 默认值：no 类型：布尔值 可修改：是 发生更改：立即 | 对已过期密钥执行异步删除。 | 
| lazyfree-lazy-server-del |  允许的值：yes/no 默认值：no 类型：布尔值 可修改：是 发生更改：立即 | 对更新值的命令执行异步删除。 | 
| slave-lazy-flush |  允许的值：N/A 默认值：no 类型：布尔值 可修改：否 发生更改：N/A | 在从属同步期间执行异步 flushDB。 | 
| **LFU 参数** | 
| --- |
| lfu-log-factor |  允许的值：任意整数 > 0 默认值：10 类型：整数 可修改：是 发生更改：立即 | 设置日志因素，这确定键命中数以使键计数器饱和。 | 
| lfu-decay-time |  允许的值：任意整数 默认：1 类型：整数 可修改：是 发生更改：立即 | 减少键计数器的时间，以分钟为单位。 | 
| **有效的碎片整理参数** | 
| --- |
| activedefrag |  允许的值：yes/no 默认值：no 类型：布尔值 可修改：是 发生更改：立即 | 启用有效的碎片整理。 在 Valkey 和 Redis 7.0 及更高版本中，无论此Amazon设置如何，都可以在操作必要时自动执行碎片整理。  | 
| active-defrag-ignore-bytes |  允许的值：10485760 – 104857600 默认值：104857600 类型：整数 可修改：是 发生更改：立即 | 启动有效碎片整理的碎片垃圾最低量。 | 
| active-defrag-threshold-lower |  允许的值：1-100 默认值：10 类型：整数 可修改：是 发生更改：立即 | 启动有效碎片整理的碎片最低百分比。 | 
| active-defrag-threshold-upper |  允许的值：1-100 默认值：100 类型：整数 可修改：是 发生更改：立即 | 我们使用最大精力的碎片最高百分比。 | 
| active-defrag-cycle-min |  允许的值：1-75 默认值：25 类型：整数 可修改：是 发生更改：立即 | 用于碎片整理的最少精力，以 CPU 百分比为单位。 | 
| active-defrag-cycle-max |  允许的值：1-75 默认值：75 类型：整数 可修改：是 发生更改：立即 | 用于碎片整理的最多精力，以 CPU 百分比为单位。 | 
| **客户端输出缓冲区参数** | 
| --- |
| client-query-buffer-limit |  允许的值：1048576 – 1073741824 默认值：1073741824 类型：整数 可修改：是 发生更改：立即 | 单个客户端查询缓冲区的最大大小。 | 
| proto-max-bulk-len |  允许的值：1048576 – 536870912 默认值：536870912 类型：整数 可修改：是 发生更改：立即 | 单个元素请求的最大大小。 | 

### Redis OSS 3.2.10 参数更改
<a name="ParameterGroups.Redis.3-2-10"></a>

**参数组系列：** redis3.2

ElastiCache 对于 Redis OSS 3.2.10，不支持其他参数。

### Redis OSS 3.2.6 参数更改
<a name="ParameterGroups.Redis.3-2-6"></a>

**参数组系列：** redis3.2

对于 Redis OSS 3.2.6，不支持附加参数。

### Redis OSS 3.2.4 参数更改
<a name="ParameterGroups.Redis.3-2-4"></a>

**参数组系列：** redis3.2

从 Redis OSS 3.2.4 开始，提供两个默认参数组。
+ `default.redis3.2` – 在运行 Redis OSS 3.2.4 时，如果您需要创建 Valkey 或 Redis OSS（已禁用集群模式）复制组并仍使用 Redis OSS 3.2.4 的附加功能，请指定此参数组或从中派生的参数组。
+ `default.redis3.2.cluster.on` – 当您需要创建 Valkey 或 Redis OSS（已启用集群模式）复制组时，请指定此参数组或从中派生的参数组。

**Topics**
+ [

#### Redis OSS 3.2.4 的新参数
](#ParameterGroups.Redis.3-2-4.New)
+ [

#### Redis OSS 3.2.4 中已更改的参数（加强版）
](#ParameterGroups.Redis.3-2-4.Changed)

#### Redis OSS 3.2.4 的新参数
<a name="ParameterGroups.Redis.3-2-4.New"></a>

**参数组系列：** redis3.2

对于 Redis OSS 3.2.4，支持以下附加参数。


****  

|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| list-max-ziplist-size | 默认值：-2 类型：整数 可修改：否  | 将采用特殊方式对列表进行编码以节省空间。可将每个内部列表节点允许的条目数指定为固定的最大大小或最大元素数。对于固定最大大小，请使用数字 -5 到 -1，含义如下：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/ParameterGroups.Engine.html) | 
| list-compress-depth | 默认：0 类型：整数 可修改：是 更改生效：立即 | 也可以压缩列表。压缩深度是要从压缩中排除的列表各端的 quicklist ziplist 节点的数目。始终不会压缩列表的首尾以便执行快速推送和弹出操作。设置为：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/ParameterGroups.Engine.html) | 
| cluster-enabled |  默认： no/yes \$1 类型：字符串 可修改：否 | 指示这是处于集群模式（“是”）的 Valkey 或 Redis OSS（已启用集群模式）复制组，还是处于非集群模式（“否”）的 Valkey 或 Redis OSS（已启用集群模式）复制组。集群模式下的 Valkey 或 Redis OSS（已启用集群模式）复制组可跨最多 500 个节点组对数据进行分区。 \$1 Redis OSS 3.2.*x* 具有两个默认参数组。[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/ParameterGroups.Engine.html). | 
| cluster-require-full-coverage | 默认值：no 类型：布尔值 可修改：是 更改生效：立即 |  如果设为 `yes`，集群模式下的 Valkey 或 Redis OSS（已启用集群模式）节点会在检测到至少一个未覆盖的哈希槽（没有节点为其提供服务）时停止接受查询。因此，如果集群部分出现故障，则整个集群将不可用。只要所有槽全都覆盖到，它就会自动恢复可用。 但有时，您需要让集群的子集能够继续接受仍覆盖到的键空间部分的查询。为此，请将 `cluster-require-full-coverage` 选项设为 `no`。 | 
| hll-sparse-max-bytes | 默认值：3000 类型：整数 可修改：是 更改生效：立即 | HyperLogLog 稀疏表示字节限制。限制包括 16 个字节的标头。当 HyperLogLog 使用稀疏表示超过此限制时，它将转换为密集表示。 不建议使用超过 16000 的值，因为此时密集表现形式具有更高的内存效率。 我们建议使用 3000 左右的值来获得空间效率较高的编码，同时不会过多地降低 PFADD 效率，即稀疏编码的复杂度为 O(N)。如果不考虑CPU，而是空间，并且数据集由许多 HyperLogLogs 基数介于 0-15000 范围内的数据集组成，则可以将该值提高到大约 10000。 | 
| reserved-memory-percent | 默认值：25 类型：整数 可修改：是 更改生效：立即 |  为非数据使用预留的节点内存的百分比。默认情况下，Redis OSS 数据占用会一直增长，直至消耗掉节点的所有内存。如果发生这种情况，可能会因内存分页过多而影响节点性能。通过预留内存，您可以为非 Redis OSS 用途留出一些可用内存，以帮助减少分页量。 此参数特定于标准 Redis OSS 发行版 ElastiCache，不属于标准 Redis OSS 发行版的一部分。 有关更多信息，请参阅`reserved-memory`和[管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。 | 

#### Redis OSS 3.2.4 中已更改的参数（加强版）
<a name="ParameterGroups.Redis.3-2-4.Changed"></a>

**参数组系列：** redis3.2

对于 Redis OSS 3.2.4，以下参数已更改。


****  

|  Name  |  Details |  更改  | 
| --- | --- | --- | 
| activerehashing | 可修改：如果参数组未与任何集群关联，则为“是”。否则不是必需。 | 可修改：否。 | 
| databases | 可修改：如果参数组未与任何集群关联，则为“是”。否则不是必需。 | 可修改：否。 | 
| appendonly | 默认：关闭 可修改：否 | 如果您需要从早期版本的 Redis OSS 升级，则必须先禁用 `appendonly`。 | 
| appendfsync | 默认：关闭 可修改：否 | 如果您需要从早期版本的 Redis OSS 升级，则必须先禁用 `appendfsync`。 | 
| repl-timeout | 默认值：60 可修改：否 | 目前无法修改，默认值为 60。 | 
| tcp-keepalive | 默认：300 | 默认值为 0。 | 
| list-max-ziplist-entries |  | 参数不再可用。 | 
| list-max-ziplist-value |  | 参数不再可用。 | 

### Redis OSS 2.8.24（加强版）增加的参数
<a name="ParameterGroups.Redis.2-8-24"></a>

**参数组系列：** redis2.8

对于 Redis OSS 2.8.24，不支持附加参数。

### Redis OSS 2.8.23（加强版）增加的参数
<a name="ParameterGroups.Redis.2-8-23"></a>

**参数组系列：** redis2.8

对于 Redis OSS 2.8.23，支持以下附加参数。


****  

|  Name  |  Details |  说明  | 
| --- | --- | --- | 
| close-on-slave-write  | 默认值：yes 类型：字符串（yes/no） 可修改：是 更改生效：立即 | 如果启用，尝试写入只读副本的客户端将会断开连接。 | 

#### close-on-slave-write 的工作原理
<a name="w2aac24c16c30c49c15c39b9"></a>

该`close-on-slave-write`参数由 Amazon ElastiCache 引入，可让您更好地控制集群在主节点和只读副本节点因将只读副本提升为主节点而交换角色时群集的响应方式。

![\[图片： close-on-replica-write，一切正常\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-close-on-slave-write-01.png)


如果出于支持多可用区的复制组发生故障转移之外的任何其他原因，只读副本集群提升为主集群，则客户端将继续尝试写入端点 A。由于端点现在是只读副本的端点，这些写入将会失败。这是 Redis OSS 在ElastiCache 引入之前的行为，`close-on-replica-write`以及禁`close-on-replica-write`用后的行为。

![\[图片: close-on-slave-write，写入失败\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-close-on-slave-write-02.png)


在启用 `close-on-replica-write` 的情况下，只要客户端尝试写入只读副本，客户端与集群的连接就会被关闭。您的应用程序逻辑应检测断开连接情况，检查 DNS 表，然后重新连接到主端点（现在是端点 B）。

![\[Image: close-on-slave-write，正在写入新的主群集\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ElastiCache-close-on-slave-write-03.png)


#### 何时可以禁用 close-on-replica-write
<a name="w2aac24c16c30c49c15c39c11"></a>

如果禁用 `close-on-replica-write` 会导致写入集群的操作失败，那么为什么禁用 `close-on-replica-write`？

如前所述，在启用 `close-on-replica-write` 的情况下，只要客户端尝试写入只读副本，客户端与集群的连接就会被关闭。建立与节点的新连接需要时间。因此，由于对副本的写入请求而断开连接并重新连接也会影响通过相同连接处理的读取请求的延迟。在建立新连接之前，此影响会持续存在。如果您的应用程序主要执行大量读取操作或者对延迟非常敏感，您可能使客户端保持连接，以避免降低读取性能。

### Redis OSS 2.8.22（加强版）增加的参数
<a name="ParameterGroups.Redis.2-8-22"></a>

**参数组系列：** redis2.8

对于 Redis OSS 2.8.22，不支持附加参数。

**重要**  
从 Redis OSS 版本 2.8.22 开始，`repl-backlog-size` 应用于主集群以及副本集群。
从 Redis OSS 版本 2.8.22 开始，不支持 `repl-timeout` 参数。如果它被更改， ElastiCache 将像我们一样用默认值（60 秒）覆盖。`appendonly`

不再支持以下参数。
+ *appendonly*
+ *appendfsync*
+ *repl-timeout*

### Redis OSS 2.8.21 增加的参数
<a name="ParameterGroups.Redis.2-8-21"></a>

**参数组系列：** redis2.8

对于 Redis OSS 2.8.21，不支持附加参数。

### Redis OSS 2.8.19 增加的参数
<a name="ParameterGroups.Redis.2-8-19"></a>

**参数组系列：** redis2.8

对于 Redis OSS 2.8.19，不支持附加参数。

### Redis OSS 2.8.6 增加的参数
<a name="ParameterGroups.Redis.2-8-6"></a>

**参数组系列：** redis2.8

对于 Redis OSS 2.8.6，支持以下附加参数。


****  

|  Name  |  Details  |  说明  | 
| --- | --- | --- | 
| min-slaves-max-lag  | 默认值：10 类型：整数 可修改：是 更改生效：立即 | 主节点必须从只读副本收到 Ping 请求的秒数。如果此时间量已过，但主节点未收到 Ping，则不再将副本视为可用。如果可用副本的数量降至以下 min-slaves-to-write，则主副本将在此时停止接受写入。 如果此参数或 min-slaves-to-write为 0，则即使没有副本可用，主节点也将始终接受写入请求。 | 
| min-slaves-to-write | 默认：0 类型：整数 可修改：是 更改生效：立即 | 使主节点可以从客户端接受写入所必需的可用只读副本的最小数目。如果可用副本数下降到低于此数字，则主节点不再接受写入请求。 如果此参数或 min-slaves-max-lag为 0，则即使没有副本可用，主节点也将始终接受写入请求。 | 
| notify-keyspace-events | 默认值：（空字符串） 类型：字符串 可修改：是 更改生效：立即 | Redis OSS 可以向客户端通知的键空间事件类型。每种事件类型由单个字母表示： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/ParameterGroups.Engine.html) 您可以使用这些事件类型的任何组合。例如，*AKE* 表示 Redis OSS 可以发布所有事件类型的通知。 请勿使用上面未列出的任何字符；尝试这样操作会导致错误消息。 默认情况下，此参数设置为空字符串，这表示禁用了键空间事件通知。 | 
| repl-backlog-size | 默认值：1048576 类型：整数 可修改：是 更改生效：立即 | 主节点积压缓冲区的大小（以字节为单位）。积压用于记录主节点上数据的更新。只读副本连接到主节点时会尝试执行部分同步（`psync`），应用积压中的数据以与主节点同步。如果 `psync` 失败，则需要完整同步。 此参数的最小值为 16384。  从 Redis OSS 2.8.22 开始，此参数应用于主集群以及只读副本。  | 
| repl-backlog-ttl | 默认值：3600 类型：整数 可修改：是 更改生效：立即 | 主节点保留积压缓冲区的秒数。从上一个副本节点断开连接时开始，积压中的数据将保持不变，直到 `repl-backlog-ttl` 过期。如果副本未在此时间内连接到主节点，则主节点会释放积压缓冲区。当副本最终重新连接时，它必须执行与主节点的完整同步。 如果此参数设置为 0，则永不释放积压缓冲区。 | 
| repl-timeout | 默认值：60 类型：整数 可修改：是 更改生效：立即 | 表示超时期限（以秒为单位），适用于：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/ParameterGroups.Engine.html) | 

### Redis OSS 2.6.13 参数
<a name="ParameterGroups.Redis.2-6-13"></a>

**参数组系列：** redis2.6

Redis OSS 2.6.13 是支持的 Redis OSS 的第一个版本。 ElastiCache下表显示了支持的 Redis OSS 2.6.13 参数。 ElastiCache 


****  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/ParameterGroups.Engine.html)

**注意**  
如果您没有为 Redis OSS 2.6.13 集群指定参数组，则将使用默认的参数组（`default.redis2.6`）。您不能在默认的参数组中更改任何参数的值；但是，您始终可以创建自定义参数组，然后随时将其分配给您的集群。

### 特定于 Redis OSS 节点类型的参数
<a name="ParameterGroups.Redis.NodeSpecific"></a>

虽然大多数参数具有单个值，但是某些参数根据使用的节点类型具有不同的值。下表显示了每种节点类型的 `maxmemory`、`client-output-buffer-limit-slave-hard-limit` 和 `client-output-buffer-limit-slave-soft-limit` 参数的默认值。`maxmemory` 的值是节点上可供您使用（数据和其他用途）的最大字节数。有关更多信息，请参阅[可用内存](https://www.amazonaws.cn/premiumsupport/knowledge-center/available-memory-elasticache-redis-node/)。

**注意**  
无法修改 `maxmemory` 参数。


|  节点类型  | Maxmemory  | C lient-output-buffer-limit-slave-hard-limit | C lient-output-buffer-limit-slave-soft-limit | 
| --- | --- | --- | --- | 
| cache.t1.micro | 142606336 | 14260633 | 14260633 | 
| cache.t2.micro | 581959680 | 58195968 | 58195968 | 
| cache.t2.small | 1665138688 | 166513868 | 166513868 | 
| cache.t2.medium | 3461349376 | 346134937 | 346134937 | 
| cache.t3.micro | 536870912 | 53687091 | 53687091 | 
| cache.t3.small | 1471026299 | 147102629 | 147102629 | 
| cache.t3.medium | 3317862236 | 331786223 | 331786223 | 
| cache.t4g.micro | 536870912 | 53687091 | 53687091 | 
| cache.t4g.small | 1471026299 | 147102629 | 147102629 | 
| cache.t4g.medium | 3317862236 | 331786223 | 331786223 | 
| cache.m1.small | 943718400 | 94371840 | 94371840 | 
| cache.m1.medium | 3093299200 | 309329920 | 309329920 | 
| cache.m1.large | 7025459200 | 702545920 | 702545920 | 
| cache.m1.xlarge | 14889779200 | 1488977920 | 1488977920 | 
| cache.m2.xlarge | 17091788800 | 1709178880 | 1709178880 | 
| cache.m2.2xlarge | 35022438400 | 3502243840 | 3502243840 | 
| cache.m2.4xlarge | 70883737600 | 7088373760 | 7088373760 | 
| cache.m3.medium | 2988441600 | 309329920 | 309329920 | 
| cache.m3.large | 6501171200 | 650117120 | 650117120 | 
| cache.m3.xlarge | 14260633600 | 1426063360 | 1426063360 | 
| cache.m3.2xlarge | 29989273600 | 2998927360 | 2998927360 | 
| cache.m4.large | 6892593152 | 689259315 | 689259315 | 
| cache.m4.xlarge | 15328501760 | 1532850176 | 1532850176 | 
| cache.m4.2xlarge | 31889126359 | 3188912636 | 3188912636 | 
| cache.m4.4xlarge | 65257290629 | 6525729063 | 6525729063 | 
| cache.m4.10xlarge | 166047614239 | 16604761424 | 16604761424 | 
| cache.m5.large | 6854542746 | 685454275  | 685454275 | 
| cache.m5.xlarge | 13891921715 | 1389192172 | 1389192172 | 
| cache.m5.2xlarge | 27966669210 | 2796666921 | 2796666921 | 
| cache.m5.4xlarge | 56116178125 | 5611617812 | 5611617812 | 
| cache.m5.12xlarge | 168715971994 | 16871597199 | 16871597199 | 
| cache.m5.24xlarge | 337500562842 | 33750056284 | 33750056284 | 
| cache.m6g.large | 6854542746 | 685454275 | 685454275 | 
| cache.m6g.xlarge | 13891921715 | 1389192172 | 1389192172 | 
| cache.m6g.2xlarge | 27966669210 | 2796666921 | 2796666921 | 
| cache.m6g.4xlarge | 56116178125 | 5611617812 | 5611617812 | 
| cache.m6g.8xlarge | 111325552312 | 11132555231 | 11132555231 | 
| cache.m6g.12xlarge | 168715971994 | 16871597199 | 16871597199 | 
| cache.m6g.16xlarge | 225000375228 | 22500037523 | 22500037523 | 
| cache.c1.xlarge | 6501171200 | 650117120 | 650117120 | 
| cache.r3.large | 14470348800 | 1468006400 | 1468006400 | 
| cache.r3.xlarge | 30513561600 | 3040870400 | 3040870400 | 
| cache.r3.2xlarge | 62495129600 | 6081740800 | 6081740800 | 
| cache.r3.4xlarge | 126458265600 | 12268339200 | 12268339200 | 
| cache.r3.8xlarge | 254384537600 | 24536678400 | 24536678400 | 
| cache.r4.large | 13201781556 | 1320178155 | 1320178155 | 
| cache.r4.xlarge | 26898228839 | 2689822883 | 2689822883 | 
| cache.r4.2xlarge | 54197537997 | 5419753799 | 5419753799 | 
| cache.r4.4xlarge | 108858546586 | 10885854658 | 10885854658 | 
| cache.r4.8xlarge | 218255432090 | 21825543209 | 21825543209 | 
| cache.r4.16xlarge | 437021573120 | 43702157312 | 43702157312 | 
| cache.r5.large | 14037181030 | 1403718103 | 1403718103 | 
| cache.r5.xlarge | 28261849702 | 2826184970 | 2826184970 | 
| cache.r5.2xlarge | 56711183565 | 5671118356 | 5671118356 | 
| cache.r5.4xlarge | 113609865216 | 11360986522 | 11360986522 | 
| cache.r5.12xlarge | 341206346547 | 34120634655 | 34120634655 | 
| cache.r5.24xlarge | 682485973811 | 68248597381 | 68248597381 | 
| cache.r6g.large | 14037181030 | 1403718103 | 1403718103 | 
| cache.r6g.xlarge | 28261849702 | 2826184970 | 2826184970 | 
| cache.r6g.2xlarge | 56711183565 | 5671118356 | 5671118356 | 
| cache.r6g.4xlarge | 113609865216 | 11360986522 | 11360986522 | 
| cache.r6g.8xlarge | 225000375228 | 22500037523 | 22500037523 | 
| cache.r6g.12xlarge | 341206346547 | 34120634655 | 34120634655 | 
| cache.r6g.16xlarge | 450000750456 | 45000075046 | 45000075046 | 
| cache.r6gd.xlarge | 28261849702 | 2826184970 | 2826184970 | 
| cache.r6gd.2xlarge | 56711183565 | 5671118356 | 5671118356 | 
| cache.r6gd.4xlarge | 113609865216 | 11360986522 | 11360986522 | 
| cache.r6gd.8xlarge | 225000375228 | 22500037523 | 22500037523 | 
| cache.r6gd.12xlarge | 341206346547 | 34120634655 | 34120634655 | 
| cache.r6gd.16xlarge | 450000750456 | 45000075046 | 45000075046 | 
| cache.r7g.large | 14037181030 | 1403718103 | 1403718103 | 
| cache.r7g.xlarge | 28261849702 | 2826184970 | 2826184970 | 
| cache.r7g.2xlarge | 56711183565 | 5671118356 | 5671118356 | 
| cache.r7g.4xlarge | 113609865216 | 11360986522 | 11360986522 | 
| cache.r7g.8xlarge | 225000375228 | 22500037523 | 22500037523 | 
| cache.r7g.12xlarge | 341206346547 | 34120634655 | 34120634655 | 
| cache.r7g.16xlarge | 450000750456 | 45000075046 | 45000075046 | 
| cache.m7g.large | 6854542746 | 685454275 | 685454275 | 
| cache.m7g.xlarge | 13891921715 | 1389192172 | 1389192172 | 
| cache.m7g.2xlarge | 27966669210 | 2796666921 | 2796666921 | 
| cache.m7g.4xlarge | 56116178125 | 5611617812 | 5611617812 | 
| cache.m7g.8xlarge | 111325552312 | 11132555231 | 11132555231 | 
| cache.m7g.12xlarge | 168715971994 | 16871597199 | 16871597199 | 
| cache.m7g.16xlarge | 225000375228 | 22500037523 | 22500037523 | 
| cache.c7gn.large | 3317862236 | 1403718103 | 1403718103 | 
| cache.c7gn.xlarge | 6854542746 | 2826184970 | 2826184970 | 
| cache.c7gn.2xlarge | 13891921715 | 5671118356 | 5671118356 | 
| cache.c7gn.4xlarge | 27966669210 | 11360986522 | 11360986522 | 
| cache.c7gn.8xlarge | 56116178125 | 22500037523 | 22500037523 | 
| cache.c7gn.12xlarge | 84357985997 | 34120634655 | 34120634655 | 
| cache.c7gn.16xlarge | 113609865216 | 45000075046 | 45000075046 | 

**注意**  
默认情况下，所有最新一代实例类型将在 Amazon Virtual Private Cloud VPC 中创建。  
T1 实例不支持多可用区。  
T1 和 T2 实例不支持 Redis OSS AOF。  
Redis OSS 版本 2.8.22 及更高版本不支持 Redis OSS 配置变量 `appendonly` 和 `appendfsync`。

## Memcached 特定的参数
<a name="ParameterGroups.Memcached"></a>

**Memcached**

如果您没有为 Memcached 集群指定参数组，则将使用适合您引擎版本的默认参数组。您无法更改默认参数组中的任何参数的值。但是，您可以随时创建自定义参数组并将其分配给集群。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

**Topics**
+ [

### Memcached 1.6.17 更改
](#ParameterGroups.Memcached.1.6.17)
+ [

### Memcached 1.6.6 增加的参数
](#ParameterGroups.Memcached.1-6-6)
+ [

### Memcached 1.5.10 参数更改
](#ParameterGroups.Memcached.1-5-10)
+ [

### Memcached 1.4.34 增加的参数
](#ParameterGroups.Memcached.1-4-34)
+ [

### Memcached 1.4.33 增加的参数
](#ParameterGroups.Memcached.1-4-33)
+ [

### Memcached 1.4.24 增加的参数
](#ParameterGroups.Memcached.1-4-24)
+ [

### Memcached 1.4.14 增加的参数
](#ParameterGroups.Memcached.1-4-14)
+ [

### Memcached 1.4.5 支持的参数
](#ParameterGroups.Memcached.1-4-5)
+ [

### Memcached 连接开销
](#ParameterGroups.Memcached.Overhead)
+ [

### 特定于 Memcached 节点类型的参数
](#ParameterGroups.Memcached.NodeSpecific)

### Memcached 1.6.17 更改
<a name="ParameterGroups.Memcached.1.6.17"></a>

从 Memcached 1.6.17 开始，我们不再支持以下管理命令：`lru_crawler`、`lru` 和 `slabs`。通过这些更改，您将无法 enable/disable `lru_crawler`在运行时通过命令进行操作。请 enable/disable `lru_crawler`修改您的自定义参数组。

### Memcached 1.6.6 增加的参数
<a name="ParameterGroups.Memcached.1-6-6"></a>

对于 Memcached 1.6.6，不支持任何附加参数。

**参数组系列：**memcached1.6

### Memcached 1.5.10 参数更改
<a name="ParameterGroups.Memcached.1-5-10"></a>

对于 Memcached 1.5.10，支持以下附加参数。

**参数组系列：**memcached1.5


| Name | Details | 说明 | 
| --- | --- | --- | 
| no\$1modern  | 默认：1 类型：布尔值 可修改：是 允许的值：0,1 更改生效：启动时  |  用于禁用 `slab_reassign`、`lru_maintainer_thread`、`lru_segmented` 和 `maxconns_fast` 命令的别名。 使用 Memcached 1.5 及更高版本时，`no_modern` 还会将哈希算法设置为 `jenkins`。 此外，在使用 Memcached 1.5.10 时，`inline_ascii_reponse` 由参数 `parallelly` 控制。这意味着 `no_modern` 被禁用，那么 `inline_ascii_reponse` 也会被禁用。从 Memcached 引擎 1.5.16 起，`inline_ascii_response` 参数不再适用，因此启用或禁用 `no_modern` 对 `inline_ascii_reponse` 没有影响。 如果 `no_modern` 内禁用，则 `slab_reassign`、`lru_maintainer_thread`、`lru_segmented` 和 `maxconns_fast` 将启用。由于 `slab_automove` 和 `hash_algorithm` 参数不是 SWITCH 参数，它们的设置将基于参数组中的配置。 如果要禁用 `no_modern` 并恢复到 `modern`，您必须配置一个自定义参数组来禁用该参数，然后重新启动以使这些更改生效。  自 2021 年 8 月 20 日起，此参数的原定设置配置值已从 0 改为 1。2021 年 8 月 20 日之后，每个地区的新ElastiCache 用户将自动选择更新的默认值。2021 年 8 月 20 日之前所在地区的现有 ElastiCache 用户需要手动修改其自定义参数组才能接受这一新更改。   | 
| inline\$1ascii\$1resp  | 默认：0 类型：布尔值 可修改：是 允许的值：0,1 更改生效：启动时  |  存储项中的 `VALUE` 响应的数字，最多使用 24 个字节。ASCII `get` 和 `faster` 集的速度较慢。 | 

对于 Memcached 1.5.10，删除了以下参数。


| Name | Details | 说明 | 
| --- | --- | --- | 
| expirezero\$1does\$1not\$1evict  | 默认：0 类型：布尔值 可修改：是 允许的值：0,1 更改生效：启动时  |  在此版本中不再受支持。 | 
| modern  | 默认：1 类型：布尔值 可修改：是（如果设置为 `no_modern`，则需要重新启动） 允许的值：0,1 更改生效：启动时  |  在此版本中不再受支持。从此版本开始，默认情况下，每次启动或重新启动时都会启用 `no-modern`。 | 

### Memcached 1.4.34 增加的参数
<a name="ParameterGroups.Memcached.1-4-34"></a>

对于 Memcached 1.4.34，不支持任何附加参数。

**参数组系列：** memcached1.4

### Memcached 1.4.33 增加的参数
<a name="ParameterGroups.Memcached.1-4-33"></a>

对于 Memcached 1.4.33，支持以下附加参数。

**参数组系列：** memcached1.4


| Name | Details | 说明 | 
| --- | --- | --- | 
|  modern  | 默认值：启用 类型：布尔值 可修改：是 更改生效：启动时  |  访问多项功能的别名。启用 `modern` 等同于启用以下命令并使用 murmur3 哈希算法：`slab_reassign`、`slab_automove`、`lru_crawler`、`lru_maintainer`、`maxconns_fast` 和 `hash_algorithm=murmur3`。 | 
|  watch  | 默认值：启用 类型：布尔值 可修改：是 更改生效：立即 在用户达到其 `watcher_logbuf_size` 和 `worker_logbuf_size` 限制时可以删除日志。  |  日志提取、移出或更改。例如，在用户启用 `watch` 时，出现 `get`、`set`、`delete` 或 `update` 的情况下可以查看日志。 | 
|  idle\$1timeout  | 默认值：0（禁用） 类型：整数 可修改：是 更改生效：启动时  |  在要求关闭客户端之前，允许客户端保持空闲的最短秒数。取值范围：0 到 86400。 | 
|  track\$1sizes  | 默认值：禁用 类型：布尔值 可修改：是 更改生效：启动时  |  显示每个 slab 组已用的大小。 启用 `track_sizes` 可让您运行 `stats sizes` 而无需运行 `stats sizes_enable`， | 
|  watcher\$1logbuf\$1size  | 默认值：256 (KB) 类型：整数 可修改：是 更改生效：启动时  |  `watch` 命令启用 Memcached 的流日志记录。但是，在移出、更改或提取速率足够高而导致了日志记录缓冲区满填满时，`watch` 可以删除日志。在这些情况下，用户可以增加缓冲区大小以减少日志丢失的可能性。 | 
|  worker\$1logbuf\$1size  | 默认值：64 (KB) 类型：整数 可修改：是 更改生效：启动时  |  `watch` 命令启用 Memcached 的流日志记录。但是，在移出、更改或提取速率足够高而导致了日志记录缓冲区满填满时，`watch` 可以删除日志。在这些情况下，用户可以增加缓冲区大小以减少日志丢失的可能性。 | 
|  slab\$1chunk\$1max  | 默认值：524288 (字节)  类型：整数 可修改：是 更改生效：启动时  |  指定 slab 的最大大小。设置较小的 slab 大小可以更有效地使用内存。大于 `slab_chunk_max` 的项目将拆分为多个 slab。 | 
|  lru\$1crawler metadump [all\$11\$12\$13] | 默认值：禁用  类型：布尔值 可修改：是 更改生效：立即  |  如果启用了 lru\$1crawler，则此命令会转储所有键。 `all\|1\|2\|3` - 所有 slab，或者指定特定 slab 编号 | 

### Memcached 1.4.24 增加的参数
<a name="ParameterGroups.Memcached.1-4-24"></a>

对于 Memcached 1.4.24，支持以下附加参数。

**参数组系列：** memcached1.4


| Name | Details | 说明 | 
| --- | --- | --- | 
|  disable\$1flush\$1all  | 默认值：0（禁用） 类型：布尔值 可修改：是 更改生效：启动时  |  添加参数 (`-F`) 以禁用 flush\$1all。如果您再也不想在生产实例上运行完全刷新，则这样做会很有用。 值：0，1（当值为 0 时，用户可以执行 `flush_all`）。 | 
|  hash\$1algorithm  | 默认值：jenkins 类型：字符串 可修改：是 更改生效：启动时  | 要使用的哈希算法。允许的值：murmur3 和 jenkins。 | 
|  lru\$1crawler  | 默认值：0（禁用） 类型：布尔值 可修改：是 更改生效：重新启动后  您可在运行时通过命令行临时启用 `lru_crawler`。有关更多信息，请参阅“描述”列。   |  清除已过期的项目的 Slab 类。此过程在后台运行，并且产生的影响很小。目前要求使用手动命令来启用网络爬取。 要临时启用网络爬取，请在命令行处运行 `lru_crawler enable`。 `lru_crawler 1,3,5` 对 Slab 类 1、3 和 5 进行网络爬取，以查找要添加到空闲列表的过期项目。 值：0，1  在命令行处启用 `lru_crawler` 将启用爬网程序，直到在命令行处或下次重启时将其禁用。要永久性启用爬网程序，您必须修改参数值。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。   | 
|  lru\$1maintainer  | 默认值：0（禁用） 类型：布尔值 可修改：是 更改生效：启动时  |  一个后台线程，用于在达到容量时在 LRUs 之间随机播放项目。值：0，1。 | 
|  expirezero\$1does\$1not\$1evict  | 默认值：0（禁用） 类型：布尔值 可修改：是 更改生效：启动时  |  在与 `lru_maintainer` 一起使用时，使过期时间为 0 的项目不可收回。  这可以挤出内存以供其他可收回项目使用。  可以设置为忽略 `lru_maintainer`。 | 

### Memcached 1.4.14 增加的参数
<a name="ParameterGroups.Memcached.1-4-14"></a>

对于 Memcached 1.4.14，支持以下附加参数。

**参数组系列：** memcached1.4


**Memcached 1.4.14 中添加的参数**  

|  Name  |  Details  |  说明  | 
| --- | --- | --- | 
| config\$1max | 默认值：16 类型：整数 可修改：否 |  ElastiCache 配置条目的最大数量。 | 
| config\$1size\$1max | 默认值：65536 类型：整数 可修改：否 | 配置条目的最大大小（单位：字节）。 | 
| hashpower\$1init | 默认值：16 类型：整数 可修改：否 |  ElastiCache 哈希表的初始大小，以二的乘数表示。默认值为 16 (2^16) 或 65536 长度的密钥。 | 
| maxconns\$1fast | 默认值：0 (false) 类型：布尔值 可修改：是 更改生效：重新启动后 | 在达到最大连接限制时，请更改处理新连接请求的方式。如果将此参数设为 0（即零），新连接将被添加至缓冲区队列，并将等待直到其他连接已关闭。如果参数设置为 1，则向客户端 ElastiCache 发送错误并立即关闭连接。 | 
| slab\$1automove | 默认：0 类型：整数 可修改：是 更改生效：重新启动后 | 调整 Slab 自动移动算法：如果将此参数设为 0（即零），自动移动算法将禁用。如果将参数设为 1，ElastiCache 便会采用一种缓慢而保守的方法来自动移动 Slab。如果将其设置为 2，则每当有人驱逐时，都会 ElastiCache 积极移动石板。（建议不要使用此模式，测试用途除外）。 | 
| slab\$1reassign | 默认值：0 (false) 类型：布尔值 可修改：是 更改生效：重新启动后 | 启用或禁用 Slab 重新分配。如果将此参数设为 1，您可以使用“Slab 重新分配”命令来手动重新分配内存。 | 

### Memcached 1.4.5 支持的参数
<a name="ParameterGroups.Memcached.1-4-5"></a>

**参数组系列：** memcached1.4

对于 Memcached 1.4.5，支持以下参数。


**Memcached 1.4.5 中添加的参数**  

|  Name  |  Details  |  说明  | 
| --- | --- | --- | 
| backlog\$1queue\$1limit | 默认值：1024 类型：整数 可修改：否 | 积压队列限制。 | 
| binding\$1protocol | 默认值：auto 类型：字符串 可修改：是 更改生效：重新启动后 | 绑定协议。允许的值为：`ascii` 和 `auto`。 有关修改 `binding_protocol` 的值的指南，请参阅[修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。 | 
| cas\$1disabled | 默认值：0 (false) 类型：布尔值 可修改：是 更改生效：重新启动后 | 如果为 1 (true)，则检查和设置 (CAS) 操作将禁用，存储的项目消耗的字节将比启用 CAS 时消耗的字节少 8 字节。 | 
| chunk\$1size | 默认值：48 类型：整数 可修改：是 更改生效：重新启动后 | 为最小项目的密钥、值和标志分配的最小空间量（以字节为单位）。 | 
| chunk\$1size\$1growth\$1factor | 默认值：1.25 类型：浮点数 可修改：是 更改生效：重新启动后 | 控制各个连续 Memcached 区块的大小的增长系数；每个区块将比前一个区块大 chunk\$1size\$1growth\$1factor 倍。 | 
| error\$1on\$1memory\$1exhausted | 默认值：0 (false) 类型：布尔值 可修改：是 更改生效：重新启动后 | 如果 1（为真），当没有更多的内存用于存储项目时，Memcached 将返回一个错误，而非移出项目。 | 
| large\$1memory\$1pages | 默认值：0 (false) 类型：布尔值 可修改：否 | 如果 1 (true)， ElastiCache 将尝试使用较大的内存页。 | 
| lock\$1down\$1paged\$1memory | 默认值：0 (false) 类型：布尔值 可修改：否 | 如果 1 (true)， ElastiCache 将锁定所有分页内存。 | 
| max\$1item\$1size | 默认值：1048576 类型：整数 可修改：是 更改生效：重新启动后 | 可以存储在集群中的最大项目的大小（单位：字节）。 | 
| max\$1simultaneous\$1connections | 默认值：65000 类型：整数 可修改：否 | 最大同时连接数。 | 
| maximize\$1core\$1file\$1limit | 默认值：0 (false) 类型：布尔值 可修改:  更改生效：重新启动后 | 如果 1 (true)， ElastiCache 将最大化核心文件限制。 | 
| memcached\$1connections\$1overhead | 默认值：100 类型：整数 可修改：是 更改生效：重新启动后 | 为 Memcached 连接和其他杂项开支预留的内存量。有关此参数的信息，请参阅[Memcached 连接开销](#ParameterGroups.Memcached.Overhead)。 | 
| requests\$1per\$1event | 默认值：20 类型：整数 可修改：否 | 每个事件请求获取给定连接的最大数量。此限制需要防止资源匮乏。 | 

### Memcached 连接开销
<a name="ParameterGroups.Memcached.Overhead"></a>

每个节点上可用于存储项目的内存计算方式为：此节点上的总可用内存（存储于 `max_cache_memory` 参数中）减去连接和其他开支所占用的内存（存储于 `memcached_connections_overhead` 参数中）。例如，`cache.m1.small` 类型的节点的 `max_cache_memory` 为 1300MB。`memcached_connections_overhead` 的默认值为 100MB，Memcached 进程可用于存储项目的内存则为 1200MB。

`memcached_connections_overhead` 参数的默认值满足大多数用例；然而，分配给连接开支的必需量会因多种因素（包括请求率、有效负载大小和连接数）而异。

您可以更改 `memcached_connections_overhead` 的值，以更好地满足您的应用程序的需求。例如，增大 `memcached_connections_overhead` 参数的值将减少用于存储项目的内存量，并为连接开销提供更大的缓冲区。减小 `memcached_connections_overhead` 参数的值将为您提供更多的内存来存储项目，但可能会增加使用交换分区和性能下降的风险。如果您发现交换分区使用情况和性能降低，请尝试增加 `memcached_connections_overhead` 参数的值。

**重要**  
对于 `cache.t1.micro` 节点类型，`memcached_connections_overhead` 的值是通过以下方式决定：  
如果您的集群使用默认参数组，则 ElastiCache 会将的值设置`memcached_connections_overhead`为 13MB。
如果您的集群使用的是您自己创建的参数组，那么您可以将 `memcached_connections_overhead` 的值设置为您选定的值。

### 特定于 Memcached 节点类型的参数
<a name="ParameterGroups.Memcached.NodeSpecific"></a>

虽然大多数参数具有单个值，但是某些参数根据使用的节点类型具有不同的值。下表显示了每种节点类型的 `max_cache_memory` 和 `num_threads` 参数的默认值。无法修改这些参数的值。


|  节点类型  | max\$1cache\$1memory（单位：MB）  | num\$1threads  | 
| --- | --- | --- | 
| cache.t1.micro | 213  | 1 | 
| cache.t2.micro | 555 | 1 | 
| cache.t2.small | 1588 | 1 | 
| cache.t2.medium | 3301 | 2 | 
| cache.t3.micro | 512 | 2 | 
| cache.t3.small | 1402 | 2 | 
| cache.t3.medium | 3364 | 2 | 
| cache.t4g.micro | 512 | 2 | 
| cache.t4g.small | 1402 | 2 | 
| cache.t4g.medium | 3164 | 2 | 
| cache.m1.small | 1301 | 1 | 
| cache.m1.medium | 3350 | 1 | 
| cache.m1.large | 7100 | 2 | 
| cache.m1.xlarge | 14600  | 4 | 
| cache.m2.xlarge | 33800 | 2 | 
| cache.m2.2xlarge | 30412 | 4 | 
| cache.m2.4xlarge | 68000  | 16 | 
| cache.m3.medium | 2850 | 1 | 
| cache.m3.large | 6200 | 2 | 
| cache.m3.xlarge | 13600 | 4 | 
| cache.m3.2xlarge | 28600 | 8 | 
| cache.m4.large | 6573 | 2 | 
| cache.m4.xlarge | 11496  | 4 | 
| cache.m4.2xlarge | 30412 | 8 | 
| cache.m4.4xlarge | 62234 | 16 | 
| cache.m4.10xlarge | 158355 | 40 | 
| cache.m5.large | 6537 | 2 | 
| cache.m5.xlarge | 13248 | 4 | 
| cache.m5.2xlarge | 26671 | 8 | 
| cache.m5.4xlarge | 53516 | 16 | 
| cache.m5.12xlarge | 160900 | 48 | 
| cache.m5.24xlarge | 321865  | 96 | 
| cache.m6g.large | 6537 | 2 | 
| cache.m6g.xlarge | 13248 | 4 | 
| cache.m6g.2xlarge | 26671 | 8 | 
| cache.m6g.4xlarge | 53516 | 16 | 
| cache.m6g.8xlarge | 107000 | 32 | 
| cache.m6g.12xlarge | 160900 | 48 | 
| cache.m6g.16xlarge | 214577 | 64 | 
| cache.c1.xlarge | 6600 | 8 | 
| cache.r3.large | 13800 | 2 | 
| cache.r3.xlarge | 29100 | 4 | 
| cache.r3.2xlarge | 59600 | 8 | 
| cache.r3.4xlarge | 120600 | 16 | 
| cache.r3.8xlarge | 120600 | 32 | 
| cache.r4.large | 12590 | 2 | 
| cache.r4.xlarge | 25652 | 4 | 
| cache.r4.2xlarge | 51686 | 8 | 
| cache.r4.4xlarge | 103815 | 16 | 
| cache.r4.8xlarge | 208144 | 32 | 
| cache.r4.16xlarge | 416776 | 64 | 
| cache.r5.large | 13387 | 2 | 
| cache.r5.xlarge | 26953 | 4 | 
| cache.r5.2xlarge | 54084 | 8 | 
| cache.r5.4xlarge | 108347 | 16 | 
| cache.r5.12xlarge | 325400 | 48 | 
| cache.r5.24xlarge | 650869 | 96 | 
| cache.r6g.large | 13387 | 2 | 
| cache.r6g.xlarge | 26953 | 4 | 
| cache.r6g.2xlarge | 54084 | 8 | 
| cache.r6g.4xlarge | 108347 | 16 | 
| cache.r6g.8xlarge | 214577 | 32 | 
| cache.r6g.12xlarge | 325400 | 48 | 
| cache.r6g.16xlarge | 429154 | 64 | 
| cache.c7gn.large | 3164 | 2 | 
| cache.c7gn.xlarge | 6537 | 4 | 
| cache.c7gn.2xlarge | 13248 | 8 | 
| cache.c7gn.4xlarge | 26671 | 16 | 
| cache.c7gn.8xlarge | 53516 | 32 | 
| cache.c7gn.12xlarge | 325400 | 48 | 
| cache.c7gn.16xlarge | 108347 | 64 | 

**注意**  
所有 T2 实例都是在 Amazon Virtual Private Cloud (Amazon VPC) 中创建的。

# 自动连接 EC2 实例和 ElastiCache 缓存
<a name="compute-connection"></a>

您可以使用 ElastiCache 控制台来简化在 Amazon Elastic Compute Cloud（Amazon EC2）实例和 ElastiCache 缓存之间设置连接的过程。通常，缓存位于私有子网中，EC2 实例位于 VPC 内的公有子网中。您可以在 EC2 实例上使用 SQL 客户端连接到 ElastiCache 缓存。EC2 实例还可以运行访问私有 ElastiCache 缓存的 Web 服务器或应用程序。

![\[自动连接 ElastiCache 缓存和 EC2 实例\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ec2-elasticache-connect-network_diagram.png)


**Topics**
+ [

## 自动连接 EC2 实例
](#ec2-elc-connect-overview)
+ [

## 查看连接的计算资源
](#ec2-elc-connect-viewing)

## 自动连接 EC2 实例
<a name="ec2-elc-connect-overview"></a>

当您在 EC2 实例和 ElastiCache 缓存之间设置连接时，ElastiCache 会自动为您的 EC2 实例和 ElastiCache 缓存配置 VPC 安全组。

以下是连接 EC2 实例和 ElastiCache 缓存的要求：
+ EC2 实例必须与 ElastiCache 缓存位于同一 VPC 中。

  如果同一 VPC 中不存在任何 EC2 实例，则控制台将提供创建一个此类实例的链接。
+ 设置连接的用户必须具有执行以下 Amazon EC2 操作的权限。这些权限通常在创建 EC2 账户时添加。有关 EC2 权限的更多信息，请参阅[授予针对 Amazon EC2 资源的必需权限](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/ec2-api-permissions.html)。
  + `ec2:AuthorizeSecurityGroupEgress` 
  + `ec2:AuthorizeSecurityGroupIngress` 
  + `ec2:CreateSecurityGroup` 
  + `ec2:DescribeInstances` 
  + `ec2:DescribeNetworkInterfaces` 
  + `ec2:DescribeSecurityGroups` 
  + `ec2:ModifyNetworkInterfaceAttribute` 
  + `ec2:RevokeSecurityGroupEgress` 

当您设置与 EC2 实例的连接时，ElastiCache 会根据与 ElastiCache 缓存和 EC2 实例关联的安全组的当前配置采取操作，如下表所述。


****  

| 当前 ElastiCache 安全组配置 | 当前 EC2 安全组配置 | ElastiCache 操作 | 
| --- | --- | --- | 
|  有一个或多个安全组与 ElastiCache 缓存（名称与模式 `elasticache-ec2-${cacheId}:${ec2InstanceId}` 匹配）关联。尚未修改与此模式匹配的安全组。该安全组只具有一条以 EC2 实例的 VPC 安全组作为源的入站规则。  |  有一个或多个安全组与 EC2 实例（名称与模式 `elasticache-ec2-${cacheId}:${ec2InstanceId}` 匹配）关联。尚未修改与此模式匹配的安全组。该安全组只有一条以 ElastiCache 缓存的 VPC 安全组作为源的出站规则。  |  ElastiCache 不会执行任何操作。 已在 EC2 实例和 ElastiCache 缓存之间自动配置了连接。由于 EC2 实例和 ElastiCache 缓存之间已经存在连接，因此不会修改安全组。  | 
|  以下任一条件适用： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/compute-connection.html)  |  以下任一条件适用： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/compute-connection.html)  |  [ELC action: create new security groups](#elc-action-create-new-security-groups)  | 
|  有一个或多个安全组与 ElastiCache 缓存（名称与模式 `elasticache-ec2-${cacheId}:${ec2InstanceId}` 匹配）关联。尚未修改与此模式匹配的安全组。该安全组只具有一条以 EC2 实例的 VPC 安全组作为源的入站规则。  |  有一个或多个安全组与 EC2 实例（名称与模式 `elasticache-ec2-${cacheId}:${ec2InstanceId}` 匹配）关联。但是，ElastiCache 不能使用这些安全组中的任何一个来连接 ElastiCache 缓存。如果安全组没有一条以 ElastiCache 缓存的 VPC 安全组作为源的出站规则，则 ElastiCache 无法使用该安全组。ElastiCache 也无法使用经过修改的安全组。  |  [ELC action: create new security groups](#elc-action-create-new-security-groups)  | 
|  有一个或多个安全组与 ElastiCache 缓存（名称与模式 `elasticache-ec2-${cacheId}:${ec2InstanceId}` 匹配）关联。尚未修改与此模式匹配的安全组。该安全组只具有一条以 EC2 实例的 VPC 安全组作为源的入站规则。  |  存在用于连接的有效 EC2 安全组，但它与 EC2 实例不关联。此安全组的名称与模式 `ec2-elasticache-${ec2InstanceId}:${cacheId}` 相匹配。尚未修改它。它只有一条以 ElastiCache 缓存的 VPC 安全组作为源的出站规则。  |  [ELC action: associate EC2 security group](#elc-action-associate-ec2-security-group)  | 
|  以下任一条件适用： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/compute-connection.html)  |  有一个或多个安全组与 EC2 实例（名称与模式 `ec2-elasticache-${ec2InstanceId}:${cacheId}` 匹配）关联。尚未修改与此模式匹配的安全组。该安全组只有一条以 ElastiCache 缓存的 VPC 安全组作为源的出站规则。  |  [ELC action: create new security groups](#elc-action-create-new-security-groups)  | 

**ElastiCache 操作：创建新的安全组**  
ElastiCache 会执行以下操作：
+ 创建与模式 `elasticache-ec2-${cacheId}:${ec2InstanceId}` 匹配的新安全组。该安全组具有一条以 EC2 实例的 VPC 安全组作为源的入站规则。该安全组与 ElastiCache 缓存相关联，并允许 EC2 实例访问此缓存。
+ 创建与模式 `elasticache-ec2-${cacheId}:${ec2InstanceId}` 匹配的新安全组。该安全组具有一条以 ElastiCache 缓存的 VPC 安全组作为目标的出站规则。该安全组与 EC2 实例相关联，并允许 EC2 实例向 ElastiCache 缓存发送流量。

**ElastiCache 操作：关联 EC2 安全组**  
ElastiCache 会将有效的现有 EC2 安全组与 EC2 实例关联起来。该安全组允许 EC2 实例向 ElastiCache 缓存发送流量。

## 查看连接的计算资源
<a name="ec2-elc-connect-viewing"></a>

您可以使用 Amazon Web Services 管理控制台查看连接到 ElastiCache 缓存的计算资源。显示的资源包括自动设置的计算资源连接。例如，您可以通过手动向与缓存关联的 VPC 安全组添加规则来允许计算资源访问该缓存。这些资源不会出现在连接的计算资源列表中。

要列出计算资源，必须满足自动连接 EC2 实例和 ElastiCache 缓存时相同的条件。

**查看连接到 ElastiCache 缓存的计算资源**

1. 登录 Amazon Web Services 管理控制台并打开 ElastiCache 控制台

1. 在导航窗格中，选择**缓存**，然后选择 Valkey 或 Redis OSS 缓存。

1. 在**连接和安全性**选项卡上，查看**设置计算连接**中的计算资源。  
![\[连接的计算资源。\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/images/ec2-elasticache-connected_resources.png)

# 缩放 ElastiCache
<a name="Scaling"></a>

您可以根据需要扩展 ElastiCache 缓存。无服务器缓存和基于节点的集群可提供多种不同的扩缩选项。

## 扩展 ElastiCache 无服务器
<a name="Scaling-serverless"></a>

ElastiCache 当您的工作负载流量上升或下降时，Serverless 会自动适应您的工作负载流量。对于每个 ElastiCache 无服务器缓存， ElastiCache 持续跟踪 CPU、内存和网络等资源的利用率。当这些资源中的任何一个受到限制时， ElastiCache Serverless会通过添加新分片并将数据重新分配到新分片来进行扩展，而不会使您的应用程序停机。您可以通过监控缓存数据存储和计算使用率 `ElastiCacheProcessingUnits` (ECPU) `BytesUsedForCache` 指标 CloudWatch 来监控缓存消耗的资源。

## 设置扩展限制以管理成本
<a name="Pre-Scaling"></a>

您可以选择配置缓存数据存储和 ECPU/second 缓存的最大使用量，以控制缓存成本。这样做可以确保缓存使用量永远不会超过配置的最大值。

如果您设置了扩展最大值，则当缓存达到最大值时，应用程序的缓存性能可能会降低。当您设置了最大缓存数据存储空间且缓存数据存储空间达到最大值时， ElastiCache 将开始使用 LRU 逻辑逐出缓存中设置了 Time-To-Live (TTL) 的数据。如果没有可以驱逐的数据，则写入更多数据的请求将收到内存不足（OOM）错误消息。当您设置 ECPU/second 最大值并且工作负载的计算利用率超过该值时， ElastiCache 将开始限制请求。

如果您将最大限制设置为`BytesUsedForCache`或`ElastiCacheProcessingUnits`，我们强烈建议将 CloudWatch 警报设置为低于最大限制的值，以便在缓存接近这些限制时收到通知。我们建议将警报设置为所设最大值限制的 75%。请参阅有关如何设置 CloudWatch 闹钟的文档。

## 使用 ElastiCache 无服务器进行预扩展
<a name="Pre-Scaling"></a>

**ElastiCache 无服务器预扩展**

使用预缩放（也称为预热），您可以为缓存设置支持的最低限制。 ElastiCache 您可以为每秒 ElastiCache 处理单位 (ECPUs) 或数据存储设置这些最小值。这在为预期的扩展事件做准备时非常有用。例如，如果一家游戏公司预计在其新游戏发布的第一分钟内登录人数将增加 5 倍，那么他们就可以让缓存为这一使用量的大幅激增做好准备。

您可以使用 ElastiCache 控制台、CLI 或 API 进行预扩展。 ElastiCache Serverless 会在 60 分钟内更新缓存中的可用 ECPUs/second 内容，并在最低限制更新完成后发送事件通知。

**预扩展的工作原理**

通过控制台、CLI ECPUs/second 或 API 更新数据存储的最低限制后，新的限制将在 1 小时内生效。 ElastiCache Serverless ECPUs/second 在空缓存上支持 30K，使用从副本读取 ECPUs/sec 功能时最多支持 90K。 ElastiCache 适用于 Valkey 8.0 的无服务器可以每 2-3 分钟将支持的每秒请求数 (RPS) 翻一番，在不到 13 分钟的时间内从零达到每个缓存 500 万 RPS，读取延迟始终保持亚毫秒 p50。如果您预计即将到来的扩展事件可能会超过此速率，那么我们建议 ECPUs/second 将最小值设置为在峰值事件发生前至少 60 分钟 ECPUs/sec 您预计的峰值。否则，应用程序可能会遇到延迟增加和请求被节流的情况。

最低限制更新完成后， ElastiCache Serverless 将开始计量新的 ECPUs 每秒最低存储空间或新的最低存储空间。即使您的应用程序没有在缓存上执行请求，或者您的数据存储使用量低于最低限度，也会发生这种情况。当您从当前设置中降低最低限制时，更新会立即生效，因此 ElastiCache Serverless 将立即以新的最低限制开始计量。

**注意**  
当您设置最低使用限制时，即使您的实际使用量低于最低使用限制，也会按该限制计费。超出最低使用限制的 ECPU 或数据存储使用量按常规费率计费。例如，如果您将最低使用限制设置为 100,000， ECPUs/second 则即使您的使用量低于设定的最低使用量，也将按每小时至少 1.224 美元的费用（使用 us-east-1 中的 ECPU 价格）。
ElastiCache Serverless 在缓存的聚合级别上支持请求的最小缩放比例。 ElastiCache Serverless 还支持 ECPUs/second 每个插槽最多 30K（使用 READONLY 连接使用从副本读取 ECPUs/second 时为 90K）。作为最佳实践，您的应用程序应确保在 Valkey 或 Redis OSS 槽间的密钥分配以及密钥之间的流量尽可能均匀。

## 使用控制台设置缩放限制Amazon CLI
<a name="Pre-Scaling.console"></a>

*使用Amazon控制台设置缩放限制*

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择在要修改的缓存上运行的引擎。

1. 此时会显示运行所选引擎的缓存的列表。

1. 选择缓存名称左侧的单选按钮来选择要修改的缓存。

1. 选择 **Actions**（操作），然后选择 **Modify**（修改）。

1. 在**使用限制**下，设置相应的**内存**或**计算**限制。

1. 单击**预览更改**，然后**保存**更改。

**使用设置缩放限制Amazon CLI**

要使用 CLI 更改扩展限制，请使用 modify-serverless-cache API。

**Linux：**

```
aws elasticache modify-serverless-cache --serverless-cache-name <cache name> \
--cache-usage-limits 'DataStorage={Minimum=10,Maximum=100,Unit=GB}, ECPUPerSecond={Minimum=1000,Maximum=100000}'
```

**Windows：**

```
aws elasticache modify-serverless-cache --serverless-cache-name <cache name> ^
--cache-usage-limits 'DataStorage={Minimum=10,Maximum=100,Unit=GB}, ECPUPerSecond={Minimum=1000,Maximum=100000}'
```

**使用 CLI 取消扩展限制**

要使用 CLI 取消扩展限制，请将最小和最大限制参数设置为 0。

**Linux：**

```
aws elasticache modify-serverless-cache --serverless-cache-name <cache name> \
--cache-usage-limits 'DataStorage={Minimum=0,Maximum=0,Unit=GB}, ECPUPerSecond={Minimum=0,Maximum=0}'
```

**Windows：**

```
aws elasticache modify-serverless-cache --serverless-cache-name <cache name> ^
--cache-usage-limits 'DataStorage={Minimum=0,Maximum=0,Unit=GB}, ECPUPerSecond={Minimum=0,Maximum=0}'
```

# 扩缩基于节点的集群
<a name="Scaling-self-designed"></a>

您的应用程序需要处理的数据量几乎不会保持不变。它会随着您的业务增长或遇到正常的业务波动时增减。如果您自行管理缓存，则需要预配置足量硬件来满足您的需求高峰，这会产生很高的费用。通过使用 Amazon， ElastiCache 您可以根据当前需求进行扩展，只需按实际用量付费。 ElastiCache 使您能够扩展缓存以满足需求。

**注意**  
如果 Valkey 或 Redis OSS 集群在一个或多个区域之间复制，那么这些区域将按顺序进行扩缩。纵向扩展时，先扩展次要区域，然后再扩展主区域。纵向缩减时，先缩减主区域，然后在缩减所有次要区域。  
更新引擎版本时，顺序是先更新次要区域，再更新主区域。

**Topics**
+ [

# 按需扩缩 Memcached 集群
](Scaling-self-designed.mem-heading.md)
+ [

# 手动扩缩 Memcached 集群
](Scaling.Memcached.manually.md)
+ [

# 扩缩 Valkey 或 Redis OSS（已禁用集群模式）集群
](scaling-redis-classic.md)
+ [

# 扩缩单节点 Valkey 或 Redis OSS（已禁用集群模式）副本节点
](Scaling.RedisReplGrps.md)
+ [

# 扩缩 Valkey 或 Redis OSS（已启用集群模式）集群
](scaling-redis-cluster-mode-enabled.md)

# 按需扩缩 Memcached 集群
<a name="Scaling-self-designed.mem-heading"></a>

ElastiCache for Memcached 提供完全托管的内存缓存服务，可在云端部署、操作和垂直扩展 Memcached。Amazon

**按需垂直扩缩**

通过垂直扩展，f ElastiCache or Memcached 提供了一个高性能的分布式内存缓存系统，广泛用于通过减轻数据库负载来加快动态应用程序的速度。它将数据和对象存储在 RAM 中，从而减少从外部数据来源读取数据的需求。

您可以对现有的基于节点的集群以及新集群应用垂直扩缩。这能为资源分配提供灵活性，使用户能够高效适应不断变化的工作负载，而无需改变集群架构。这种扩缩能力通过在需求高峰期增加缓存容量来提升性能，在需求低谷期缩减规模来优化成本。这简化了操作，消除了为应对资源需求变化而创建新集群的必要性，并且能快速响应流量波动。总体而言，对 Memcached 基于节点的集群进行垂直扩缩有助于提升成本效益、提高资源利用率，甚至允许用户更改 Memcached 实例类型。所有这些都使用户可以更轻松地根据实际应用程序需求调整其缓存基础设置。

**注意**  
节点类型修改仅适用于使用引擎版本 1.5 或更高版本的基于节点的 Memcached 集群。
必须启用自动发现才能使用垂直扩缩。

## 为基于节点的 Memcached 集群设置按需垂直扩缩
<a name="Scaling.Memcached.automatically.setup.cli"></a>

您可以使用 `scale-config` 为 Memcached 配置按需垂直扩缩，其中包含两个参数：

1. **ScaleIntervalMinutes：**在 Memcached 升级过程中，两次扩展批次之间的时间（以分钟为单位）

1. **ScalePercentage:** 在 Memcached 升级过程中要同时扩展的节点百分比

**将现有 Memcached 节点类型转换为可通过 CLI 垂直扩缩的缓存**

要将现有的基于节点的 Memcached 集群转换为可垂直扩缩的缓存，您可以通过 CLI 使用 `elasticache modify-cache-cluster` 命令实现。

```
aws elasticache modify-cache-cluster \
    --cache-cluster-id <your-cluster-id> \
    --cache-node-type <new-node-type> \
    --scale-config <scale-config> \ 
    --apply-immediately
```

**使用 CLI 设置垂直扩缩**

要通过 CLI 为基于节点的 Memcached 集群设置垂直扩缩，请使用 `elasticache modify-cache-cluster` 和 `scale-config` 及其参数 `ScalePercentage` 和 `ScaleIntervalMinutes`。
+ **scale-interval-minutes：**这定义了缩放批次之间的时间（以分钟为单位）。设置范围为 2-30 分钟。如果未指定值，则使用默认值 5 分钟。
+ **缩放百分比：**此参数指定了每批次中需并行扩缩的节点的百分比。设置范围为 10-100 之间。该设置在除法运算时会向上舍入，例如当结果为 49.5 时，实际应用的设置值为 50。如果未指定值，则使用默认值 20。

这些配置选项使您能够根据自己的特定需求微调扩缩过程，在最大限度地减少集群中断和优化扩缩速度之间取得平衡。scale-config 参数仅适用于 Memcached 引擎类型，在其他缓存引擎中将被忽略，从而确保向后兼容其他集群的现有 API 使用方式。

**API 调用**

```
aws elasticache modify-cache-cluster \
    --cache-cluster-id <your-cluster-id> \
    --cache-node-type <new-node-type> \
    --scale-config '{
            "ScalePercentage": 30,
            "ScaleIntervalMinutes": 2
          }'
    --apply-immediately
```

**结果：**

返回集群 ID 和待处理的更改。

```
{
    "CacheCluster": {
        "CacheNodeType": "old_insance_type",
         ...
         ...
         "PendingModifiedValues": {
            "CacheNodeType": "new_instance_type"
         },
    }
}
```

**列出 Memcached 缓存垂直扩缩设置**

您可以检索 Memcached 缓存的扩缩选项，并查看它们当前的垂直扩缩选项。

**API 调用**

```
aws elasticache list-allowed-node-type-modifications --cache-cluster-id <your-cluster-id>
```

**结果：**

```
{ 
  "ScaleUpModifications": [
      "cache.x.xxxx", 
      "cache.x.xxxx"
   	  ],
   "ScaleDownModifications": [ 
      "cache.x.xxxx", 
      "cache.x.xxxx", 
      "cache.x.xxxx" 
      ] 
}
```

**使用 Memcached 进行垂直缩放Amazon Web Services 管理控制台**

按照以下步骤使用将基于节点的 Memcached 集群Amazon Web Services 管理控制台转换为垂直可扩展的集群。

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 选择要转换的 Memcached 集群。

1. 选择**修改**选项卡。

1. 前往**缓存设置**部分，然后选择所需的**节点类型**。

1. 选择**预览更改**，然后查看更改。

1. 选择 **Modify**。

## 自动水平扩缩 Memcached
<a name="Scaling-self-designed.mem-heading.horizontal"></a>

ElastiCache 现在与 App Amazon lication Auto Scaling (AAS) 服务集成，包括了 Memcached 集群的自动水平扩展。您可以通过 App Amazon lication Auto Scaling 服务定义扩展策略，并根据预定义的指标或计划根据需要自动调整 Memcached 集群中的节点数量。

**注意**  
自动水平扩缩目前在北京和宁夏区域不可用。

以下是可用于自动水平扩缩基于节点的集群的方法：
+ **计划扩缩：**按计划扩缩使您可以按照可预测的负载变化来设置您自己的扩缩计划。例如，您的 Web 应用程序的流量会在每周的星期三开始增加，并在星期四保持高流量状态，然后在星期五开始下降。您可以将 Auto Scaling 配置为在星期三增加容量并在星期五减少容量。
+ **目标跟踪：**在使用目标跟踪扩缩策略时，您可以选择一个扩缩指标并设置一个目标值。Application Auto Scaling 创建和管理触发扩展策略的 CloudWatch 警报，并根据指标和目标值计算扩展调整。扩展策略根据需要增加或减少容量，将指标保持在指定的目标值或接近指定的目标值。

**如何通过 CLI 为基于节点的 Memcached 集群设置水平扩缩**

水平扩缩基于节点的 Memcached 集群时，您可以使用目标跟踪策略、计划策略，或同时使用两者。

1. **将资源注册为可扩展目标**

   在 Application Auto Scaling 中调Amazon用 `RegisterScalableTarget` API 来注册可扩展维度的目标`elasticache:cache-cluster:Nodes`。

   **API: ApplicationAutoScaling。 RegisterScalableTarget**

   输入:

   ```
   {
   	"ScalableDimension": "elasticache:cache-cluster:Nodes",
   	"ResourceId": "cache-cluster/test-cluster-1",
   	"ServiceNamespace": "elasticache",
   	"MinCapacity": 20,  
   	"MaxCapacity": 50 
   }
   ```

1. **创建目标跟踪扩缩策略**

   接下来，您可以通过调用 put scaling policy API 为资源创建目标跟踪扩缩策略。

1. **预定义的指标**

   以下策略将使用预定义指标 ` ElastiCacheCPUUtilization`（在集群 test-cluster-1 中设置为 50），根据缓存节点维度进行扩缩。在横向缩减过程中删除节点时，将移除最后 n 个节点。

   API: ApplicationAutoScaling。 PutScalingPolicy

   输入:

   ```
   {
   	"PolicyName": "cpu50-target-tracking-scaling-policy",
   	"PolicyType": "TargetTrackingScaling",
   	"TargetTrackingScalingPolicyConfiguration": {
   		"TargetValue": 50,
   		"PredefinedMetricSpecification": {
   			"PredefinedMetricType": "ElastiCacheCPUUtilization"
   			},
   		"ScaleOutCooldown": 600,
   		"ScaleInCooldown": 600
   			},
   	"ServiceNamespace": "elasticache",
   	"ScalableDimension": "elasticache:cache-cluster:Nodes",
   	"ResourceId": "cache-cluster/test-cluster-1"
   }
   ```

   输出：

   ```
   {
   	"PolicyARN": "arn:aws:autoscaling:us-west-2:012345678910:scalingPolicy:6d8972f3-efc8-437c-92d1-6270f29a66e7:resource/elasticache/cache-cluster/test-cluster-1:policyName/cpu50-target-tracking-scaling-policy",
   	"Alarms": [
   		{
   		"AlarmARN": "arn:aws:cloudwatch:us-west-2:012345678910:alarm:TargetTracking-elasticache/cache-cluster/test-cluster-1-AlarmHigh-d4f0770c-b46e-434a-a60f-3b36d653feca",
   		"AlarmName": "TargetTracking-elasticache/cache-cluster/test-cluster-1-AlarmHigh-d4f0770c-b46e-434a-a60f-3b36d653feca"
   		},
   		{
   		"AlarmARN": "arn:aws:cloudwatch:us-west-2:012345678910:alarm:TargetTracking-elasticache/cache-cluster/test-cluster-1-AlarmLow-1b437334-d19b-4a63-a812-6c67aaf2910d",
   		"AlarmName": "TargetTracking-elasticache/cache-cluster/test-cluster-1-AlarmLow-1b437334-d19b-4a63-a812-6c67aaf2910d"
   		}
   	]
   }
   ```

1. **自定义指标**

   您还可以使用基于 Cloudwatch 指标的自定义百分比来设置维度的扩缩策略。

   输入:

   ```
   {
   	"PolicyName": "cpu50-target-tracking-scaling-policy",
   	"PolicyType": "TargetTrackingScaling",
   	"TargetTrackingScalingPolicyConfiguration": {
   		"CustomizedMetricSpecification": { 
   			"Dimensions": [ 
   				{ 
   				"Name": "MyMetricDimension",
   				"Value": "DimensionValue"
   				}
   				],
   			"MetricName": "MyCustomMetric",
   			"Namespace": "MyNamespace",
   			"Statistic": "Average",
   			"Unit": "Percent"
   			},
   		"TargetValue": 40,
   		"ScaleOutCooldown": 600,
   		"ScaleInCooldown": 600
   		},
   	"ServiceNamespace": "elasticache",
   	"ScalableDimension": "elasticache:cache-cluster:Nodes",
   	"ResourceId": "cache-cluster/test-cluster-1"
   }
   ```

1. **计划的操作**

   如果您需要对特定事件进行横向扩展，并在事件结束后进行横向缩减，可通过调用 `PutScheduledAction` API 创建两个计划操作。

   **策略 1：横向扩展**

   `--schedule` 中的 `at` 命令会计划在将来的指定日期和时间要运行一次的操作。计划字段还支持速率（分钟、小时、天等）和 cron（用于 cron 表达式）。

   在指定的日期和时间，Application Auto Scaling 将更新 `MinCapacity` 和 `MaxCapacity` 的值。Application Auto Scaling 扩展 MinCapacity 到，将缓存节点增加到 70。

   **API: ApplicationAutoScaling。 PutScheduledAction**

   输入:

   ```
   {
   	"ResourceId": "elasticache:ache-cluster:test-cluster-1",
   	"ScalableDimension": "elasticache:cache-cluster:Nodes",
   		"ScalableTargetAction": { 
   			"MaxCapacity": 100,
   			"MinCapacity": 70
   			},
   	"Schedule": "at(2020-05-20T17:05:00)",
   	"ScheduledActionName": "ScalingOutScheduledAction",
   	"ServiceNamespace": "elasticache",
   }
   ```

   **策略 2：横向缩减**

   在指定的日期和时间，Application Auto Scaling 将更新表的 `MinCapacity` 和 `MaxCapacity`，并横向缩减到 `MaxCapacity`，将缓存节点恢复到 60 个。

   **API: ApplicationAutoScaling。 PutScheduledAction**

   输入:

   ```
   {
   	"ResourceId": "elasticache:cache-cluster:test-cluster-1",
   	"ScalableDimension": "elasticache:cache-cluster:Nodes",
   	"ScalableTargetAction": { 
   		"MaxCapacity": 60,
   		"MinCapacity": 40
   		},
   	"Schedule": "at(2020-05-21T17:05:00)",
   	"ScheduledActionName": "ScalingInScheduledAction",
   	"ServiceNamespace": "elasticache",
   }
   ```

1. **查看扩缩活动**

   您可以使用 `DescribeScalingActivities` API 查看扩缩活动。

   **API: ApplicationAutoScaling。 DescribeScalingActivities**

   输出：

   ```
   {
   	"ScalingActivities": [
   		{
   		"ScalableDimension": "elasticache:elasticache:DesiredCount",
   		"Description": "Setting desired count to 30.",
   		"ResourceId": "elasticache/cache-cluster/test-cluster-1",
   		"ActivityId": "4d759079-a31f-4d0c-8468-504c56e2eecf",
   		"StartTime": 1462574194.658,
   		"elasticacheNamespace": "elasticache",
   		"EndTime": 1462574276.686,
   		"Cause": "monitor alarm TargetTracking-elasticache/cache-cluster/test-cluster-1-AlarmHigh-d4f0770c-b46e-434a-a60f-3b36d653feca in state ALARM triggered policy cpu50-target-tracking-scaling-policy",
   		"StatusMessage": "Failed to set desired count to 30",
   		"StatusCode": "Failed"
   		},
   		{
   		"ScalableDimension": "elasticache:elasticache:DesiredCount",
   		"Description": "Setting desired count to 25.",
   		"ResourceId": "elasticache/cache-cluster/test-cluster-1",
   		"ActivityId": "90aff0eb-dd6a-443c-889b-b809e78061c1",
   		"StartTime": 1462574254.223,
   		"elasticacheNamespace": "elasticache",
   		"EndTime": 1462574333.492,
   		"Cause": "monitor alarm TargetTracking-elasticache/cache-cluster/test-cluster-1-AlarmHigh-d4f0770c-b46e-434a-a60f-3b36d653feca in state ALARM triggered policy cpu50-target-tracking-scaling-policy",
   		"StatusMessage": "Successfully set desired count to 25. Change successfully fulfilled by elasticache.",
   		"StatusCode": "Successful"
   		}
   	]
   }
   ```

1. **编辑/删除扩缩策略**

   您可以通过再次调用 `PutScalingPolicy` API，或调用 `DeleteScalingPolicy` 或 `DeleteScheduled` 操作来编辑或删除策略。

1. **取消注册可扩缩目标**

   您可以通过 `DeregisterScalableTarget` API 取消注册可扩缩目标。取消注册可扩缩目标会删除扩缩策略和与其关联的计划操作。

   **API: ApplicationAutoScaling。 DeregisterScalableTarget**

   输入:

   ```
   {
   	"ResourceId": "elasticache/cache-cluster/test-cluster-1",
   	"ServiceNamespace": "elasticache",
   	"ScalableDimension": "elasticache:cache-cluster:Nodes"
   }
   ```

1. **扩缩策略清除**

1. **多种扩展策略**

   您可以创建多个扩缩策略。以下是 [Auto Scaling 目标跟踪](https://docs.amazonaws.cn/autoscaling/application/userguide/application-auto-scaling-target-tracking.html)行为的关键标注。
   + 一个可扩展目标可以具有多个目标跟踪扩展策略，前提是它们分别使用不同的指标。
   + Application Auto Scaling 的目的是始终优先考虑可用性，因此其行为会有所不同，具体取决于目标跟踪策略是否已准备好横向扩展或横向缩减。如果任何目标跟踪策略已准备好进行向外扩展，它将向外扩展可扩展目标，但仅在所有目标跟踪策略（启用了缩减部分）准备好缩减时才执行缩减。
   + 如果多个策略指示可扩展目标同时横向扩展或横向缩减，则 Application Auto Scaling 会根据为横向缩减和横向扩展提供最大容量的策略进行扩展。这样可以更灵活地覆盖多种场景，并确保始终有足够的容量来处理应用程序工作负载。
**注意**  
Amazon Application Auto Scaling 不对扩展策略进行排队。Application Auto Scaling 将等待首次缩放完成，随后进入冷却期，然后重复上述算法。

**通过以下方式自动水平扩展基于节点的 Memcached 集群Amazon Web Services 管理控制台**

按照以下步骤使用将现有的基于节点的Amazon Web Services 管理控制台 Memcached 集群转换为可水平扩展的集群。

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 选择要转换的 Memcached 缓存。

1. 转到 **Autoscaling** 选项卡。

1. 通过选择**添加动态扩缩**或**添加计划扩缩**，选择要应用的扩缩策略。

1. 根据需要填写所选策略的详细信息。

1. 单击**创建**。

# 手动扩缩 Memcached 集群
<a name="Scaling.Memcached.manually"></a>

手动水平扩缩 Memcached 集群很简单，只需在集群中添加或删除节点即可。Memcached 集群包含 1 到 60 个节点。

由于您可以将数据分区到 Memcached 集群中的所有节点，因此几乎不需要扩展到具有更大内存的节点类型。但是，由于 Memcached 引擎不保存数据，如果您扩展到不同类型的节点，除非您的应用程序填充该集群，否则它在启动时将为空。

要手动垂直扩展 Memcached，您必须创建一个新集群。除非您的应用程序填充 Memcached 集群，否则它在启动时始终为空。


**手动扩缩 Memcached 集群**  

| Action | Topic | 
| --- | --- | 
|  横向扩展  |  [向集群添加节点](Clusters.html#AddNode)  | 
|  缩减  |  [从集群中删除节点](Clusters.html#DeleteNode)  | 
|  更改节点类型  |  [手动垂直扩缩基于节点的 Memcached 集群](#Scaling.Memcached.Vertically)  | 

**Topics**
+ [

## 手动水平扩缩基于节点的 Memcached 集群
](#Scaling.Memcached.Horizontally)
+ [

## 手动垂直扩缩基于节点的 Memcached 集群
](#Scaling.Memcached.Vertically)

## 手动水平扩缩基于节点的 Memcached 集群
<a name="Scaling.Memcached.Horizontally"></a>

Memcached 引擎支持将您的数据分区到多个节点。因此，可以轻松地横向扩展 Memcached 集群。要横向扩展您的 Memcached 集群，只需添加或移除节点。

以下主题详细介绍了如何通过添加或移除节点来横向扩展或收缩 Memcached 集群。
+ [向集群添加节点](Clusters.html#AddNode)
+ [从集群中删除节点](Clusters.html#AddNode)

每次更改您的 Memcached 集群中的节点数时，您必须至少重新映射部分密钥空间，以便它映射到正确的节点。有关对 Memcached 集群进行负载均衡的更多详细信息，请参阅[配置您的 ElastiCache 客户端以实现高效的负载平衡 (Memcached)](BestPractices.LoadBalancing.md)。

如果您在 Memcached 集群上使用 Auto Discovery，则您在添加或移除节点时无需更改应用程序中的终端节点。有关自动发现的更多信息，请参阅[自动识别集群（Memcached）中的节点](AutoDiscovery.md)。如果您不使用自动发现，则每次更改 Memcached 集群中的节点数后，您都必须更新应用程序中的端点。

## 手动垂直扩缩基于节点的 Memcached 集群
<a name="Scaling.Memcached.Vertically"></a>

在手动扩缩 Memcached 集群时，您必须创建一个新集群。除非您的应用程序填充 Memcached 集群，否则它在启动时始终为空。

**重要**  
如果您要缩减到较小的节点类型，请确保较小的节点类型足以满足您的数据和开销。有关更多信息，请参阅 [选择节点大小](CacheNodes.SelectSize.md)。

**Topics**
+ [

### 垂直扩缩基于节点的 Memcached 集群（控制台）
](#Scaling.Memcached.Vertically.CON)
+ [

### 垂直扩缩基于节点的 Memcached 集群（Amazon CLI）
](#Scaling.Memcached.Vertically.CLI)
+ [

### 垂直扩展基于节点的 Memcached 集群 (API) ElastiCache
](#Scaling.Memcached.Vertically.API)

### 垂直扩缩基于节点的 Memcached 集群（控制台）
<a name="Scaling.Memcached.Vertically.CON"></a>

以下过程演示了如何使用Amazon Web Services 管理控制台垂直扩缩基于节点的 Memcached 集群。

1. 利用新的节点类型创建新集群。有关更多信息，请参阅 [创建 Memcached 集群（控制台）](Clusters.Create-mc.md#Clusters.Create.CON.Memcached)。

1. 在您的应用程序中，将终端节点更新为新集群的终端节点。有关更多信息，请参阅 [查找集群的端点（控制台）（Memcached）](Endpoints.md#Endpoints.Find.Memcached)。

1. 删除旧的集群。有关更多信息，请参阅[删除 Memcached 中的新节点](Clusters.html#Delete.CON.Memcached)。

### 垂直扩缩基于节点的 Memcached 集群（Amazon CLI）
<a name="Scaling.Memcached.Vertically.CLI"></a>

以下过程演示了如何使用Amazon CLI垂直扩缩基于节点的 Memcached 集群。

1. 利用新的节点类型创建新集群。有关更多信息，请参阅 [创建集群（Amazon CLI）](Clusters.Create.md#Clusters.Create.CLI)。

1. 在您的应用程序中，将终端节点更新为新集群的终端节点。有关更多信息，请参阅 [查找端点（Amazon CLI）](Endpoints.md#Endpoints.Find.CLI)。

1. 删除旧的集群。有关更多信息，请参阅 [使用Amazon CLI删除集 ElastiCache 群](Clusters.Delete.md#Clusters.Delete.CLI)。

### 垂直扩展基于节点的 Memcached 集群 (API) ElastiCache
<a name="Scaling.Memcached.Vertically.API"></a>

以下过程将引导您使用 API 垂直扩展基于节点的 Memcached 集群。 ElastiCache 

1. 利用新的节点类型创建新集群。有关更多信息，请参阅 [为 Memcached 创建集群 (ElastiCache API)](Clusters.Create-mc.md#Clusters.Create.API.mem-heading)。

1. 在您的应用程序中，将终端节点更新为新集群的终端节点。有关更多信息，请参阅 [查找端点（ElastiCache API）](Endpoints.md#Endpoints.Find.API)。

1. 删除旧的集群。有关更多信息，请参阅 [使用 ElastiCache API](Clusters.Delete.md#Clusters.Delete.API)。

# 扩缩 Valkey 或 Redis OSS（已禁用集群模式）集群
<a name="scaling-redis-classic"></a>

Valkey 或 Redis OSS（已禁用集群模式）集群可以是具有 0 个分片的单节点集群，也可以是具有 1 个分片的多节点集群。单节点集群使用一个节点执行读取和写入。多节点集群始终将 1 个节点作为 read/write 主节点，其中 0 到 5 个只读副本节点。

**Topics**
+ [

## 扩缩 Valkey 或 Redis OSS（已禁用集群模式）集群
](#Scaling.RedisStandalone)


**扩缩 Valkey 或 Redis OSS 集群**  

| Action | Valkey 或 Redis OSS（已禁用集群模式） | Valkey 或 Redis OSS（已启用集群模式） | 
| --- | --- | --- | 
|  缩减  |  [从 ElastiCache 集群中移除节点](Clusters.DeleteNode.md)  |  [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)  | 
|  横向扩展  |  [向集群添加节点](Clusters.html#AddNode)  |  [Valkey 或 Redis OSS（已启用集群模式）的离线重新分片](scaling-redis-cluster-mode-enabled.md#redis-cluster-resharding-online)  | 
|  更改节点类型  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/scaling-redis-classic.html) [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/scaling-redis-classic.html)  |  [通过修改节点类型来在线纵向扩展](redis-cluster-vertical-scaling.md)  | 
|  更改节点组数量  |  在 Valkey 或 Redis OSS（已禁用集群模式）集群上不受支持  |  [扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)  | 

**Contents**
+ [

## 扩缩 Valkey 或 Redis OSS（已禁用集群模式）集群
](#Scaling.RedisStandalone)
  + [

### 纵向扩展单节点 Valkey 或 Redis OSS 集群
](#Scaling.RedisStandalone.ScaleUp)
    + [

#### 纵向扩展单节点 Valkey 或 Redis OSS（已禁用集群模式）集群（控制台）
](#Scaling.RedisStandalone.ScaleUp.CON)
    + [

#### 纵向扩展单节点 Valkey 或 Redis OSS 集群（Amazon CLI）
](#Scaling.RedisStandalone.ScaleUp.CLI)
    + [

#### 扩展单节点 Valkey 或 Redis OSS 集群 (API) ElastiCache
](#Scaling.RedisStandalone.ScaleUp.API)
  + [

### 纵向缩减单节点 Valkey 或 Redis OSS 集群
](#Scaling.RedisStandalone.ScaleDown)
    + [

#### 纵向缩减单节点 Valkey 或 Redis OSS 集群（控制台）
](#Scaling.RedisStandalone.ScaleDown.CON)
    + [

#### 纵向缩减单节点 Valkey 或 Redis OSS 集群（Amazon CLI）
](#Scaling.RedisStandalone.ScaleUpDown-Modify.CLI)
    + [

#### 缩小单节点 Valkey 或 Redis OSS 集群 (API) ElastiCache
](#Scaling.RedisStandalone.ScaleDown.API)

## 扩缩 Valkey 或 Redis OSS（已禁用集群模式）集群
<a name="Scaling.RedisStandalone"></a>

Valkey 或 Redis OSS（已禁用集群模式）节点必须足够大，以包含所有缓存数据及 Valkey 或 Redis OSS 开销。若要更改 Valkey 或 Redis OSS（已禁用集群模式）集群的数据容量，必须纵向扩缩；纵向扩展到更大的节点类型可提高数据容量，纵向缩减到较小的节点类型可降低数据容量。

 ElastiCache 扩展过程旨在尽最大努力保留您的现有数据，并且需要成功复制 Valkey 或 Redis OSS。对于 Valkey 或 Redis OSS（已禁用集群模式）集群，建议留出足够的内存供 Valkey 或 Redis OSS 使用。

您不能跨多个 Valkey 或 Redis OSS（已禁用集群模式）集群对数据进行分区。不过，如果您只需要提高或降低集群的读取容量，则可以创建具有副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群并添加或删除只读副本。要使用单节点 Valkey 或 Redis OSS 集群作为主集群来创建具有副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群，请参阅[创建 Valkey（已禁用集群模式）集群（控制台）](SubnetGroups.designing-cluster-pre.valkey.md#Clusters.Create.CON.valkey-gs)。

创建具有副本的集群后，您可以通过添加只读副本来增加读取容量。之后，您可以根据需要通过删除只读副本来降低读取容量。有关更多信息，请参阅 [增加读取容量](Scaling.RedisReplGrps.md#Scaling.RedisReplGrps.ScaleOut)或 [降低读取容量](Scaling.RedisReplGrps.md#Scaling.RedisReplGrps.ScaleIn)。

除了可以扩展读取容量之外，具有副本的 Valkey 或 Redis OSS（已禁用集群模式）集群还具有其他业务优势。有关更多信息，请参阅 [使用复制组时的高可用性](Replication.md)。

**重要**  
如果您的参数组使用 `reserved-memory` 为 Valkey 或 Redis OSS 开销预留内存，则在开始扩展之前，请确保您有一个为新节点类型预留正确内存量的自定义参数组。或者，您可以修改自定义参数组以便使用 `reserved-memory-percent`，并为您的新集群使用该参数组。  
如果您在使用 `reserved-memory-percent`，则这不是必需的。  
有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

**Topics**
+ [

### 纵向扩展单节点 Valkey 或 Redis OSS 集群
](#Scaling.RedisStandalone.ScaleUp)
+ [

### 纵向缩减单节点 Valkey 或 Redis OSS 集群
](#Scaling.RedisStandalone.ScaleDown)

### 纵向扩展单节点 Valkey 或 Redis OSS 集群
<a name="Scaling.RedisStandalone.ScaleUp"></a>

向上扩展单节点 Valkey 或 Redis OSS 集群时，无论您使用的是 ElastiCache 控制台、还是 API，都要 ElastiCache 执行以下过程。Amazon CLI ElastiCache 

1. 在现有集群所在的可用区中启动具有新节点类型的新集群。

1. 将现有集群中的缓存数据复制到新集群。此过程所需的时间取决于您的节点类型以及集群中的数据量。

1. 使用新集群进行读写操作。由于新集群的端点与旧集群的端点相同，因此您不需要更新应用程序中的端点。在更新 DNS 条目时，您会发现主节点的读取和写入出现短暂中断（几秒钟）。

1. ElastiCache 删除旧集群。由于与旧节点之间的连接会断开，您会发现旧节点的读取和写入出现短暂中断（几秒钟）。

**注意**  
对于运行 r6gd 节点类型的集群，您只能在 r6gd 节点系列的节点大小范围内扩缩。

如下表所示，如果您在下一维护时段内安排有引擎升级，则 Valkey 或 Redis OSS 纵向扩展操作将会被阻止。有关维护时段的更多信息，请参阅[管理 ElastiCache 集群维护](maintenance-window.md)。


**阻止的 Valkey 或 Redis OSS 操作**  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/scaling-redis-classic.html)

如果有待处理的操作正在阻止您，您可以执行以下操作之一。
+ 通过清除**立即应用**复选框（CLI 使用：`--no-apply-immediately`，API 使用：`ApplyImmediately=false`），将 Valkey 或 Redis OSS 纵向扩展操作安排在下一维护时段内。
+ 等到下一维护时段（或之后）再执行 Valkey 或 Redis OSS 纵向扩展操作。
+ 将 Valkey 或 Redis OSS 引擎升级操作添加到选中了**立即应用**复选框（CLI 使用：`--apply-immediately`，API 使用：`ApplyImmediately=true`）的集群修改中。这将导致立即执行引擎升级，从而取消阻止纵向扩展操作。

您可以使用 ElastiCache 控制台、或 API 扩展单节点 Valkey 或 Redis OSS（已禁用集群模式）集群。Amazon CLI ElastiCache 

**重要**  
如果您的参数组使用 `reserved-memory` 为 Valkey 或 Redis OSS 开销预留内存，则在开始扩展之前，请确保您有一个为新节点类型预留正确内存量的自定义参数组。或者，您可以修改自定义参数组以便使用 `reserved-memory-percent`，并为您的新集群使用该参数组。  
如果您在使用 `reserved-memory-percent`，则这不是必需的。  
有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

#### 纵向扩展单节点 Valkey 或 Redis OSS（已禁用集群模式）集群（控制台）
<a name="Scaling.RedisStandalone.ScaleUp.CON"></a>

以下过程介绍如何使用管理控制台扩展单节点 Valkey 或 Redis OSS 集群。 ElastiCache 在此过程中，您的 Valkey 或 Redis OSS 集群将继续处理请求，且停机时间降至最短。

**纵向扩展单节点 Valkey 或 Redis OSS 集群（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 从导航窗格中，选择 **Valkey 或 Redis OSS 集群**。

1. 从集群列表中选择要纵向扩展的集群（必须运行 Valkey 或 Redis OSS 引擎，而不是 Clustered Valkey 或 Redis OSS 引擎）。

1. 选择 **Modify**(修改)。

1. 在 **Modify Cluster** 向导中：

   1. 从 **Node type** 列表中选择您希望扩展到的节点类型。

   1. 如果您在使用 `reserved-memory` 管理内存，请从 **Parameter Group** 列表中，选择为新节点类型预留正确内存量的自定义参数组。

1. 如果您要立即执行纵向扩展过程，请选中 **Apply immediately** 框。如果 **Apply immediately** 框处于未选中状态，则在此集群的下一维护时段内执行纵向扩展过程。

1. 选择 **Modify**(修改)。

   如果您在上一步选择了 **Apply immediately**，则集群的状态将变为 *modifying*。当状态变为 *available* 时，即表示修改完成，您可以开始使用新集群。

#### 纵向扩展单节点 Valkey 或 Redis OSS 集群（Amazon CLI）
<a name="Scaling.RedisStandalone.ScaleUp.CLI"></a>

以下过程介绍了如何使用Amazon CLI纵向扩展单节点 Valkey 或 Redis OSS 集群。在此过程中，您的 Valkey 或 Redis OSS 集群将继续处理请求，且停机时间降至最短。

**纵向扩展单节点 Valkey 或 Redis OSS 集群（Amazon CLI）**

1. 通过运行带有以下参数的Amazon CLI`list-allowed-node-type-modifications`命令来确定可以扩展到的节点类型。
   + `--cache-cluster-id`

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache list-allowed-node-type-modifications \
   	    --cache-cluster-id my-cache-cluster-id
   ```

   对于 Windows：

   ```
   aws elasticache list-allowed-node-type-modifications ^
   	    --cache-cluster-id my-cache-cluster-id
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {
   	    "ScaleUpModifications": [
   	        "cache.m3.2xlarge", 
   	        "cache.m3.large", 
   	        "cache.m3.xlarge", 
   	        "cache.m4.10xlarge", 
   	        "cache.m4.2xlarge", 
   	        "cache.m4.4xlarge", 
   	        "cache.m4.large", 
   	        "cache.m4.xlarge", 
   	        "cache.r3.2xlarge", 
   	        "cache.r3.4xlarge", 
   	        "cache.r3.8xlarge", 
   	        "cache.r3.large", 
   	        "cache.r3.xlarge"
   	    ]
   	       "ScaleDownModifications": [
   	        "cache.t2.micro", 
   	        "cache.t2.small ", 
   	        "cache.t2.medium ",
               "cache.t1.small ",
   	    ], 
   
   	}
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [list-allowed-node-type-modifications](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-allowed-node-type-modifications.html)。

1. 使用Amazon CLI`modify-cache-cluster`命令和以下参数修改现有集群，指定要向上扩展的集群以及新的更大的节点类型。
   + `--cache-cluster-id` – 要纵向扩展的集群的名称。
   + `--cache-node-type` – 要扩展集群的新节点类型。此值必须是步骤 1 中由 `list-allowed-node-type-modifications` 命令返回的节点类型之一。
   + `--cache-parameter-group-name` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `--apply-immediately` – 使纵向扩展过程立即得到应用。要将纵向扩展流程推迟到此集群的下一维护时段，请使用 `--no-apply-immediately` 参数。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache modify-cache-cluster \
   	    --cache-cluster-id my-redis-cache-cluster \
   	    --cache-node-type cache.m3.xlarge \
   	    --cache-parameter-group-name redis32-m2-xl \
   	    --apply-immediately
   ```

   对于 Windows：

   ```
   aws elasticache modify-cache-cluster ^
   	    --cache-cluster-id my-redis-cache-cluster ^
   	    --cache-node-type cache.m3.xlarge ^
   	    --cache-parameter-group-name redis32-m2-xl ^
   	    --apply-immediately
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {
   	    "CacheCluster": {
   	        "Engine": "redis", 
   	        "CacheParameterGroup": {
   	            "CacheNodeIdsToReboot": [], 
   	            "CacheParameterGroupName": "default.redis6.x", 
   	            "ParameterApplyStatus": "in-sync"
   	        }, 
   	        "SnapshotRetentionLimit": 1, 
   	        "CacheClusterId": "my-redis-cache-cluster", 
   	        "CacheSecurityGroups": [], 
   	        "NumCacheNodes": 1, 
   	        "SnapshotWindow": "00:00-01:00", 
   	        "CacheClusterCreateTime": "2017-02-21T22:34:09.645Z", 
   	        "AutoMinorVersionUpgrade": true, 
   	        "CacheClusterStatus": "modifying", 
   	        "PreferredAvailabilityZone": "us-west-2a", 
   	        "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:", 
   	        "CacheSubnetGroupName": "default", 
   	        "EngineVersion": "6.0", 
   	        "PendingModifiedValues": {
   	            "CacheNodeType": "cache.m3.2xlarge"
   	        }, 
   	        "PreferredMaintenanceWindow": "tue:11:30-tue:12:30", 
   	        "CacheNodeType": "cache.m3.medium",
   	         "DataTiering": "disabled"
   	    }
   	}
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [modify-cache-cluster](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-cache-cluster.html)。

1. 如果您使用了`--apply-immediately`，请使用带有以下参数的Amazon CLI`describe-cache-clusters`命令检查新集群的状态。当状态变为 *available* 时，您便可开始使用较大的新集群。
   + `--cache-cluster-id` – 单节点 Valkey 或 Redis OSS 集群的名称。使用此参数可描述特定集群而非所有集群。

   ```
   aws elasticache describe-cache-clusters --cache-cluster-id my-redis-cache-cluster
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [describe-cache-clusters](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-cache-clusters.html)。

#### 扩展单节点 Valkey 或 Redis OSS 集群 (API) ElastiCache
<a name="Scaling.RedisStandalone.ScaleUp.API"></a>

以下过程介绍如何使用 API 扩展单节点 Valkey 或 Redis OSS 集群。 ElastiCache 在此过程中，您的 Valkey 或 Redis OSS 集群将继续处理请求，且停机时间降至最短。

**向上扩展单节点 Valkey 或 Redis OSS 集群 (API) ElastiCache**

1. 通过使用以下参数运行 ElastiCache API `ListAllowedNodeTypeModifications` 操作来确定可以扩展到的节点类型。
   + `CacheClusterId` – 要纵向扩展的单节点 Valkey 或 Redis OSS 集群的名称。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ListAllowedNodeTypeModifications
   	   &CacheClusterId=MyRedisCacheCluster
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ListAllowedNodeTypeModifications](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ListAllowedNodeTypeModifications.html)*中的。

1. 使用 `ModifyCacheCluster` ElastiCache API 操作和以下参数修改现有集群，指定要向上扩展的集群和新的更大的节点类型。
   + `CacheClusterId` – 要纵向扩展的集群的名称。
   + `CacheNodeType` – 要通过纵向扩展使集群达到的较大新节点类型。此值必须是上一步中通由 `ListAllowedNodeTypeModifications` 操作返回的节点类型之一。
   + `CacheParameterGroupName` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `ApplyImmediately` – 设置为 `true` 可促使立即开始执行纵向扩展过程。要将纵向扩展流程推迟到此集群的下一维护时段，请使用 `ApplyImmediately``=false`。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ModifyCacheCluster
   	   &ApplyImmediately=true
   	   &CacheClusterId=MyRedisCacheCluster
   	   &CacheNodeType=cache.m3.xlarge
   	   &CacheParameterGroupName redis32-m2-xl
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ModifyCacheCluster](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyCacheCluster.html)*中的。

1. 如果您使用了 `ApplyImmediately``=true`，请使用带有以下参数的 ElastiCache API `DescribeCacheClusters` 操作检查新集群的状态。当状态变为 *available* 时，您便可开始使用较大的新集群。
   + `CacheClusterId` – 单节点 Valkey 或 Redis OSS 集群的名称。使用此参数可描述特定集群而非所有集群。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=DescribeCacheClusters
   	   &CacheClusterId=MyRedisCacheCluster
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[DescribeCacheClusters](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeCacheClusters.html)*中的。

### 纵向缩减单节点 Valkey 或 Redis OSS 集群
<a name="Scaling.RedisStandalone.ScaleDown"></a>

以下部分介绍了如何将单节点 Valkey 或 Redis OSS 集群纵向缩减为较小的节点类型。确保较小的新节点类型足以容纳所有数据和 Valkey 或 Redis OSS 开销，这一点对于新的 Valkey 或 Redis OSS 集群的长期成功至关重要。有关更多信息，请参阅 [确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)。

**注意**  
对于运行 r6gd 节点类型的集群，您只能在 r6gd 节点系列的节点大小范围内扩缩。

**Topics**
+ [

#### 纵向缩减单节点 Valkey 或 Redis OSS 集群（控制台）
](#Scaling.RedisStandalone.ScaleDown.CON)
+ [

#### 纵向缩减单节点 Valkey 或 Redis OSS 集群（Amazon CLI）
](#Scaling.RedisStandalone.ScaleUpDown-Modify.CLI)
+ [

#### 缩小单节点 Valkey 或 Redis OSS 集群 (API) ElastiCache
](#Scaling.RedisStandalone.ScaleDown.API)

#### 纵向缩减单节点 Valkey 或 Redis OSS 集群（控制台）
<a name="Scaling.RedisStandalone.ScaleDown.CON"></a>

以下过程将引导您使用控制台将单节点 Valkey 或 Redis OSS 集群向下扩展到较小的节点类型。 ElastiCache 

**重要**  
如果您的参数组使用 `reserved-memory` 为 Valkey 或 Redis OSS 开销预留内存，则在开始扩展之前，请确保您有一个为新节点类型预留正确内存量的自定义参数组。或者，您可以修改自定义参数组以便使用 `reserved-memory-percent`，并为您的新集群使用该参数组。  
如果您在使用 `reserved-memory-percent`，则这不是必需的。  
有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

**纵向缩减单节点 Valkey 或 Redis OSS 集群（控制台）**

1. 确保较小的节点类型足以满足您的数据和开销需求。

1. 如果您的参数组使用 `reserved-memory` 为 Valkey 或 Redis OSS 开销预留内存，请确保您有一个为新节点类型预留正确内存量的自定义参数组。

   或者，您可以修改自定义参数组以使用 `reserved-memory-percent`。有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 从集群列表中，选择要缩减的集群。该集群必须运行 Valkey 或 Redis OSS 引擎，而不是 Clustered Valkey 或 Redis OSS 引擎。

1. 选择 **Modify**(修改)。

1. 在 **Modify Cluster** 向导中：

   1. 从 **Node type (节点类型)** 列表中选择您希望缩减到的节点类型。

   1. 如果您在使用 `reserved-memory` 管理内存，请从 **Parameter Group** 列表中，选择为新节点类型预留正确内存量的自定义参数组。

1. 如果您要立即执行缩减过程，请选中 **Apply immediately (立即应用)** 复选框。如果 **Apply immediately (立即应用)** 复选框处于未选中状态，则在此集群的下一维护时段内执行缩减过程。

1. 选择 **Modify**(修改)。

1. 当集群的状态从 *modifying* 变为 *available* 时，即表示您的集群已扩展为新的节点类型。无需更新应用程序中的终端节点。

#### 纵向缩减单节点 Valkey 或 Redis OSS 集群（Amazon CLI）
<a name="Scaling.RedisStandalone.ScaleUpDown-Modify.CLI"></a>

以下过程介绍了如何使用Amazon CLI纵向缩减单节点 Valkey 或 Redis OSS 集群。

**纵向缩减单节点 Valkey 或 Redis OSS 集群（Amazon CLI）**

1. 通过运行带有以下参数的Amazon CLI`list-allowed-node-type-modifications`命令来确定可以缩减到的节点类型。
   + `--cache-cluster-id`

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache list-allowed-node-type-modifications \
   	    --cache-cluster-id my-cache-cluster-id
   ```

   对于 Windows：

   ```
   aws elasticache list-allowed-node-type-modifications ^
   	    --cache-cluster-id my-cache-cluster-id
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {
   	    "ScaleUpModifications": [
   	        "cache.m3.2xlarge", 
   	        "cache.m3.large", 
   	        "cache.m3.xlarge", 
   	        "cache.m4.10xlarge", 
   	        "cache.m4.2xlarge", 
   	        "cache.m4.4xlarge", 
   	        "cache.m4.large", 
   	        "cache.m4.xlarge", 
   	        "cache.r3.2xlarge", 
   	        "cache.r3.4xlarge", 
   	        "cache.r3.8xlarge", 
   	        "cache.r3.large", 
   	        "cache.r3.xlarge"
   	    ]
   	       "ScaleDownModifications": [
   	        "cache.t2.micro", 
   	        "cache.t2.small ", 
   	        "cache.t2.medium ",
               "cache.t1.small ",
   	    ], 
   
   	}
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [list-allowed-node-type-modifications](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-allowed-node-type-modifications.html)。

1. 使用Amazon CLI`modify-cache-cluster`命令和以下参数修改现有集群，指定要向下扩展的集群和新的较小节点类型。
   + `--cache-cluster-id` – 要纵向缩减的集群的名称。
   + `--cache-node-type` – 要扩展集群的新节点类型。此值必须是步骤 1 中由 `list-allowed-node-type-modifications` 命令返回的节点类型之一。
   + `--cache-parameter-group-name` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `--apply-immediately` – 促使立即应用缩减流程。要将纵向扩展流程推迟到此集群的下一维护时段，请使用 `--no-apply-immediately` 参数。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache modify-cache-cluster \
   	    --cache-cluster-id my-redis-cache-cluster \
   	    --cache-node-type cache.m3.xlarge \
   	    --cache-parameter-group-name redis32-m2-xl \
   	    --apply-immediately
   ```

   对于 Windows：

   ```
   aws elasticache modify-cache-cluster ^
   	    --cache-cluster-id my-redis-cache-cluster ^
   	    --cache-node-type cache.m3.xlarge ^
   	    --cache-parameter-group-name redis32-m2-xl ^
   	    --apply-immediately
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {
   	    "CacheCluster": {
   	        "Engine": "redis", 
   	        "CacheParameterGroup": {
   	            "CacheNodeIdsToReboot": [], 
   	            "CacheParameterGroupName": "default.redis6,x", 
   	            "ParameterApplyStatus": "in-sync"
   	        }, 
   	        "SnapshotRetentionLimit": 1, 
   	        "CacheClusterId": "my-redis-cache-cluster", 
   	        "CacheSecurityGroups": [], 
   	        "NumCacheNodes": 1, 
   	        "SnapshotWindow": "00:00-01:00", 
   	        "CacheClusterCreateTime": "2017-02-21T22:34:09.645Z", 
   	        "AutoMinorVersionUpgrade": true, 
   	        "CacheClusterStatus": "modifying", 
   	        "PreferredAvailabilityZone": "us-west-2a", 
   	        "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:", 
   	        "CacheSubnetGroupName": "default", 
   	        "EngineVersion": "6.0", 
   	        "PendingModifiedValues": {
   	            "CacheNodeType": "cache.m3.2xlarge"
   	        }, 
   	        "PreferredMaintenanceWindow": "tue:11:30-tue:12:30", 
   	        "CacheNodeType": "cache.m3.medium",
   	         "DataTiering": "disabled"
   	    }
   	}
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [modify-cache-cluster](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-cache-cluster.html)。

1. 如果您使用了`--apply-immediately`，请使用带有以下参数的Amazon CLI`describe-cache-clusters`命令检查新集群的状态。当状态变为 *available* 时，您便可开始使用较大的新集群。
   + `--cache-cluster-id` – 单节点 Valkey 或 Redis OSS 集群的名称。使用此参数可描述特定集群而非所有集群。

   ```
   aws elasticache describe-cache-clusters --cache-cluster-id my-redis-cache-cluster
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [describe-cache-clusters](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-cache-clusters.html)。

#### 缩小单节点 Valkey 或 Redis OSS 集群 (API) ElastiCache
<a name="Scaling.RedisStandalone.ScaleDown.API"></a>

以下过程介绍如何使用 API 向上扩展单节点 Valkey 或 Redis OSS 集群。 ElastiCache 

**缩小单节点 Valkey 或 Redis OSS 集群 (API) ElastiCache**

1. 通过使用以下参数运行 ElastiCache API `ListAllowedNodeTypeModifications` 操作来确定可以缩减到的节点类型。
   + `CacheClusterId` – 要纵向缩减的单节点 Valkey 或 Redis OSS 集群的名称。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ListAllowedNodeTypeModifications
   	   &CacheClusterId=MyRedisCacheCluster
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ListAllowedNodeTypeModifications](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ListAllowedNodeTypeModifications.html)*中的。

1. 使用 `ModifyCacheCluster` ElastiCache API 操作和以下参数修改现有集群，指定要向上扩展的集群和新的更大的节点类型。
   + `CacheClusterId` – 要纵向缩减的集群的名称。
   + `CacheNodeType` – 要将集群缩减到的较小的新节点类型。此值必须是上一步中通由 `ListAllowedNodeTypeModifications` 操作返回的节点类型之一。
   + `CacheParameterGroupName` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `ApplyImmediately` – 设置为 `true` 可促使立即执行缩减过程。要将纵向扩展流程推迟到此集群的下一维护时段，请使用 `ApplyImmediately``=false`。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ModifyCacheCluster
   	   &ApplyImmediately=true
   	   &CacheClusterId=MyRedisCacheCluster
   	   &CacheNodeType=cache.m3.xlarge
   	   &CacheParameterGroupName redis32-m2-xl
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ModifyCacheCluster](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyCacheCluster.html)*中的。

1. 如果您使用了 `ApplyImmediately``=true`，请使用带有以下参数的 ElastiCache API `DescribeCacheClusters` 操作检查新集群的状态。当状态变为 *available* 时，您便可开始使用较大的新集群。
   + `CacheClusterId` – 单节点 Valkey 或 Redis OSS 集群的名称。使用此参数可描述特定集群而非所有集群。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=DescribeCacheClusters
   	   &CacheClusterId=MyRedisCacheCluster
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[DescribeCacheClusters](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeCacheClusters.html)*中的。

# 扩缩单节点 Valkey 或 Redis OSS（已禁用集群模式）副本节点
<a name="Scaling.RedisReplGrps"></a>

具有副本节点的 Valkey 或 Redis OSS 集群（在 API/CLI 中称作*复制组*）通过启用了自动失效转移功能的多可用区的复制来提供高可用性。具有副本节点的集群是最多包含 6 个 Valkey 或 Redis OSS 节点的逻辑集合（其中一个节点为主节点），能够处理读写请求。该集群中的所有其他节点均为主集群的只读副本。写入主集群的数据异步复制到集群中的所有只读副本。由于 Valkey 或 Redis OSS（禁用集群模式）不支持跨多个集群对数据进行分区，因此 Valkey 或 Redis OSS（禁用集群模式）复制组中的每个节点都包含整个缓存数据集。Valkey 或 Redis OSS（已启用集群模式）集群支持跨多达 500 个分片对数据进行分区。

要更改集群的数据容量，必须将复制组纵向扩展为较大的节点类型或收缩为较小的节点类型。

要更改集群的读取容量，可添加更多只读副本（最多 5 个）或移除只读副本。

 ElastiCache 扩展过程旨在尽最大努力保留您的现有数据，并且需要成功复制 Valkey 或 Redis OSS。对于具有副本的 Valkey 或 Redis OSS（已禁用集群模式）集群，建议留出足够的内存供 Valkey 或 Redis OSS 使用。

**Topics**
+ [

## 纵向扩展具有副本的 Valkey 或 Redis OSS 集群
](#Scaling.RedisReplGrps.ScaleUp)
+ [

## 纵向缩减具有副本的 Valkey 或 Redis OSS 集群
](#Scaling.RedisReplGrps.ScaleDown)
+ [

## 增加读取容量
](#Scaling.RedisReplGrps.ScaleOut)
+ [

## 降低读取容量
](#Scaling.RedisReplGrps.ScaleIn)

**相关主题**
+ [使用复制组时的高可用性](Replication.md)
+ [复制：Valkey 和 Redis OSS 已禁用集群模式与已启用集群模式](Replication.Redis-RedisCluster.md)
+ [利用多可用区以及 Valkey 和 Redis OSS 最大限度减少 ElastiCache 中的停机时间](AutoFailover.md)
+ [确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)

**Topics**
+ [

## 纵向扩展具有副本的 Valkey 或 Redis OSS 集群
](#Scaling.RedisReplGrps.ScaleUp)
+ [

## 纵向缩减具有副本的 Valkey 或 Redis OSS 集群
](#Scaling.RedisReplGrps.ScaleDown)
+ [

## 增加读取容量
](#Scaling.RedisReplGrps.ScaleOut)
+ [

## 降低读取容量
](#Scaling.RedisReplGrps.ScaleIn)

## 纵向扩展具有副本的 Valkey 或 Redis OSS 集群
<a name="Scaling.RedisReplGrps.ScaleUp"></a>

亚马逊 ElastiCache 提供控制台、CLI 和 API 支持，用于向上扩展您的 Valkey 或 Redis OSS（已禁用集群模式）复制组。

启动放大过程后， ElastiCache 会执行以下操作：

1. 使用新节点类型启动复制组。

1. 将当前主节点中的所有数据复制到新的主节点。

1. 将新的只读副本与新的主节点同步。

1. 更新 DNS 条目使其指向新的节点。因此，您便不需要更新应用程序中的终端节点。对于 Valkey 7.2 及更高版本或 Redis OSS 5.0.5 及更高版本，您可以在该集群继续保持在线并处理传入请求时扩展启用失效转移的集群。在 Redis OSS 版本 4.0.10 及更低版本上，更新 DNS 条目时，您可能会发现先前版本上来自主节点的读取和写入短暂中断。

1. 删除旧节点（CLI/API：复制组）。由于与旧节点之间的连接会断开，您会发现旧节点的读取和写入出现短暂中断（几秒钟）。

此过程所需的时间取决于您的节点类型以及集群中的数据量。

如下表所示，如果您在集群的下一维护时段内安排有引擎升级，则 Valkey 或 Redis OSS 纵向扩展操作将会被阻止。


**阻止的 Valkey 或 Redis OSS 操作**  
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonElastiCache/latest/dg/Scaling.RedisReplGrps.html)

如果有待处理的操作正在阻止您，您可以执行以下操作之一。
+ 通过清除**立即应用**复选框（CLI 使用：`--no-apply-immediately`，API 使用：`ApplyImmediately=false`），将 Valkey 或 Redis OSS 纵向扩展操作安排在下一维护时段内。
+ 等到下一维护时段（或之后）再执行 Valkey 或 Redis OSS 纵向扩展操作。
+ 将 Valkey 或 Redis OSS 引擎升级操作添加到选中了**立即应用**复选框（CLI 使用：`--apply-immediately`，API 使用：`ApplyImmediately=true`）的集群修改中。这将导致立即执行引擎升级，从而取消阻止纵向扩展操作。

以下各节介绍如何使用 ElastiCache 控制台、和 API 使用副本向上扩展您的 Valkey 或 Redis OSS 集群。Amazon CLI ElastiCache 

**重要**  
如果您的参数组使用 `reserved-memory` 为 Valkey 或 Redis OSS 开销预留内存，则在开始扩展之前，请确保您有一个为新节点类型预留正确内存量的自定义参数组。或者，您可以修改自定义参数组以便使用 `reserved-memory-percent`，并为您的新集群使用该参数组。  
如果您在使用 `reserved-memory-percent`，则这不是必需的。  
有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

### 纵向扩展具有副本的 Valkey 或 Redis OSS 集群（控制台）
<a name="Scaling.RedisReplGrps.ScaleUp.CON"></a>

扩展为较大的节点类型所需的时间因节点类型和当前集群中的数据量不同而异。

以下过程使用 ElastiCache 控制台将带有副本的集群从当前节点类型扩展到新的更大的节点类型。在此过程中，更新 DNS 条目时，其他版本的主节点可能会短暂中断读取和写入。对于在 5.0.6 版本以更高版本上运行的节点，可能会出现不到一秒钟的停机时间；对于较早的版本，则可能会出现几秒钟的停机时间。

**纵向扩展具有副本的 Valkey 或 Redis OSS 集群（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择 **Valkey 集群**或 **Redis OSS 集群**

1. 从集群列表中，选择要扩展的集群。该集群必须运行 Valkey 或 Redis OSS 引擎，而不是 Clustered Valkey 或 Redis OSS 引擎。

1. 选择 **Modify**(修改)。

1. 在 **Modify Cluster** 向导中：

   1. 从 **Node type** 列表中选择您希望扩展到的节点类型。请注意，并不是可缩减到所有节点类型。

   1. 如果您在使用 `reserved-memory` 管理内存，请从 **Parameter Group** 列表中，选择为新节点类型预留正确内存量的自定义参数组。

1. 如果您要立即执行纵向扩展流程，请选中 **Apply immediately** 复选框。如果 **Apply immediately** 复选框处于未选中状态，则在此集群的下一维护时段内执行纵向扩展过程。

1. 选择 **Modify**(修改)。

1. 当集群的状态从 *modifying* 变为 *available* 时，即表示您的集群已扩展为新的节点类型。无需更新应用程序中的终端节点。

### 纵向扩展 Valkey 或 Redis OSS 复制组（Amazon CLI）
<a name="Scaling.RedisReplGrps.ScaleUp.CLI"></a>

以下过程使用Amazon CLI将复制组从其当前节点类型扩展为较大的新节点类型。在此过程中， ElastiCache 更新 DNS 条目，使其指向新节点。因此，您便不需要更新应用程序中的终端节点。对于 Valkey 7.2 及更高版本或 Redis OSS 5.0.5 及更高版本，您可以在该集群继续保持在线并处理传入请求时扩展启用失效转移的集群。在版本 4.0.10 及更低版本上，更新 DNS 条目时，您可能会发现先前版本上来自主节点的读取和写入短暂中断。

纵向扩展为较大的节点类型所需的时间因节点类型和当前集群中的数据量不同而异。

**纵向扩展 Valkey 或 Redis OSS 复制组（Amazon CLI）**

1. 通过运行带有以下参数的Amazon CLI`list-allowed-node-type-modifications`命令来确定可以扩展到哪些节点类型。
   + `--replication-group-id` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache list-allowed-node-type-modifications \
   	    --replication-group-id my-repl-group
   ```

   对于 Windows：

   ```
   aws elasticache list-allowed-node-type-modifications ^
   	    --replication-group-id my-repl-group
   ```

   该操作的输出内容应类似如下所示 (JSON 格式)。

   ```
   {
   	    "ScaleUpModifications": [
   	        "cache.m3.2xlarge", 
   	        "cache.m3.large", 
   	        "cache.m3.xlarge", 
   	        "cache.m4.10xlarge", 
   	        "cache.m4.2xlarge", 
   	        "cache.m4.4xlarge", 
   	        "cache.m4.large", 
   	        "cache.m4.xlarge", 
   	        "cache.r3.2xlarge", 
   	        "cache.r3.4xlarge", 
   	        "cache.r3.8xlarge", 
   	        "cache.r3.large", 
   	        "cache.r3.xlarge"
   	    ]
   	}
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [list-allowed-node-type-modifications](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-allowed-node-type-modifications.html)。

1. 使用带有以下参数的Amazon CLI`modify-replication-group`命令将当前的复制组扩展到新的节点类型。
   + `--replication-group-id` – 复制组的名称。
   + `--cache-node-type` – 此复制组中集群的较大新节点类型。此值必须是上一步中由 `list-allowed-node-type-modifications` 命令返回的实例类型之一。
   + `--cache-parameter-group-name` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `--apply-immediately` – 使纵向扩展过程立即得到应用。要将扩展操作推迟到下一维护时段，请使用 `--no-apply-immediately`。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache modify-replication-group \
   	    --replication-group-id my-repl-group \
   	    --cache-node-type cache.m3.xlarge \
   	    --cache-parameter-group-name redis32-m3-2xl \
   	    --apply-immediately
   ```

   对于 Windows：

   ```
   aws elasticache modify-replication-group ^
   	    --replication-group-id my-repl-group ^
   	    --cache-node-type cache.m3.xlarge ^
   	    --cache-parameter-group-name redis32-m3-2xl \
   	    --apply-immediately
   ```

   该命令的输出内容应类似如下所示 (JSON 格式)。

   ```
   {
   	"ReplicationGroup": {
   		"Status": "available",
   		"Description": "Some description",
   		"NodeGroups": [{
   			"Status": "available",
   			"NodeGroupMembers": [{
   					"CurrentRole": "primary",
   					"PreferredAvailabilityZone": "us-west-2b",
   					"CacheNodeId": "0001",
   					"ReadEndpoint": {
   						"Port": 6379,
   						"Address": "my-repl-group-001.8fdx4s.0001.usw2.cache.amazonaws.com"
   					},
   					"CacheClusterId": "my-repl-group-001"
   				},
   				{
   					"CurrentRole": "replica",
   					"PreferredAvailabilityZone": "us-west-2c",
   					"CacheNodeId": "0001",
   					"ReadEndpoint": {
   						"Port": 6379,
   						"Address": "my-repl-group-002.8fdx4s.0001.usw2.cache.amazonaws.com"
   					},
   					"CacheClusterId": "my-repl-group-002"
   				}
   			],
   			"NodeGroupId": "0001",
   			"PrimaryEndpoint": {
   				"Port": 6379,
   				"Address": "my-repl-group.8fdx4s.ng.0001.usw2.cache.amazonaws.com"
   			}
   		}],
   		"ReplicationGroupId": "my-repl-group",
   		"SnapshotRetentionLimit": 1,
   		"AutomaticFailover": "disabled",
   		"SnapshotWindow": "12:00-13:00",
   		"SnapshottingClusterId": "my-repl-group-002",
   		"MemberClusters": [
   			"my-repl-group-001",
   			"my-repl-group-002"
   		],
   		"PendingModifiedValues": {}
   	}
   }
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)。

1. 如果您使用了`--apply-immediately`参数，请使用带有以下参数的Amazon CLI`describe-replication-group`命令来监控复制组的状态。当状态仍处于*正在修改*时，在更新 DNS 条目时，在 5.0.6 版本及更高版本上运行的节点可能会出现不到一秒钟的停机时间，以及较早版本上来自主节点的读取和写入出现短暂中断。
   + `--replication-group-id` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache describe-replication-groups \
   	    --replication-group-id my-replication-group
   ```

   对于 Windows：

   ```
   aws elasticache describe-replication-groups ^
   	    --replication-group-id my-replication-group
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [describe-replication-groups](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-replication-groups.html)。

### 扩展 Valkey 或 Redis OSS 复制组 (API) ElastiCache
<a name="Scaling.RedisReplGrps.ScaleUp.API"></a>

以下过程使用 ElastiCache API 将您的复制组从其当前节点类型扩展到新的更大的节点类型。对于 Valkey 7.2 及更高版本或 Redis OSS 5.0.5 及更高版本，您可以在该集群继续保持在线并处理传入请求时扩展启用失效转移的集群。在 Redis OSS 版本 4.0.10 及更低版本上，更新 DNS 条目时，您可能会发现先前版本上来自主节点的读取和写入短暂中断。

纵向扩展为较大的节点类型所需的时间因节点类型和当前集群中的数据量不同而异。

**扩展 Valkey 或 Redis OSS 复制组 (API) ElastiCache**

1. 使用带有以下参数的 ElastiCache API `ListAllowedNodeTypeModifications` 操作来确定可以扩展到哪些节点类型。
   + `ReplicationGroupId` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ListAllowedNodeTypeModifications
   	   &ReplicationGroupId=MyReplGroup
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ListAllowedNodeTypeModifications](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ListAllowedNodeTypeModifications.html)*中的。

1. 使用 `ModifyReplicationGroup` ElastiCache API 操作并使用以下参数将当前的复制组扩展到新的节点类型。
   + `ReplicationGroupId` – 复制组的名称。
   + `CacheNodeType` – 此复制组中集群的较大新节点类型。此值必须是上一步中由 `ListAllowedNodeTypeModifications` 操作返回的实例类型之一。
   + `CacheParameterGroupName` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `ApplyImmediately` – 设置为 `true` 可促使立即应用纵向扩展流程。要将扩展流程推迟到下一维护时段，请使用 `ApplyImmediately``=false`。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ModifyReplicationGroup
   	   &ApplyImmediately=true
   	   &CacheNodeType=cache.m3.2xlarge
   	   &CacheParameterGroupName=redis32-m3-2xl
   	   &ReplicationGroupId=myReplGroup
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20141201T220302Z
   	   &Version=2014-12-01
   	   &X-Amz-Algorithm=&AWS;4-HMAC-SHA256
   	   &X-Amz-Date=20141201T220302Z
   	   &X-Amz-SignedHeaders=Host
   	   &X-Amz-Expires=20141201T220302Z
   	   &X-Amz-Credential=<credential>
   	   &X-Amz-Signature=<signature>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)*中的。

1. 如果您使用了 `ApplyImmediately``=true`，请使用带有以下参数的 ElastiCache API `DescribeReplicationGroups` 操作监控复制组的状态。当状态从 *modifying* 变为 *available* 时，您便可开始写入已扩展的新复制组。
   + `ReplicationGroupId` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=DescribeReplicationGroups
   	   &ReplicationGroupId=MyReplGroup
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[DescribeReplicationGroups](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html)*中的。

## 纵向缩减具有副本的 Valkey 或 Redis OSS 集群
<a name="Scaling.RedisReplGrps.ScaleDown"></a>

以下部分介绍了如何将具有副本节点的 Valkey 或 Redis OSS（已禁用集群模式）集群纵向缩减为较小的节点类型。确保较小的新节点类型足以容纳所有数据和开销对成功非常重要。有关更多信息，请参阅 [确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)。

**注意**  
对于运行 r6gd 节点类型的集群，您只能在 r6gd 节点系列的节点大小范围内扩缩。

**重要**  
如果您的参数组使用 `reserved-memory` 为 Valkey 或 Redis OSS 开销预留内存，则在开始扩展之前，请确保您有一个为新节点类型预留正确内存量的自定义参数组。或者，您可以修改自定义参数组以便使用 `reserved-memory-percent`，并为您的新集群使用该参数组。  
如果您在使用 `reserved-memory-percent`，则这不是必需的。  
有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

**Topics**

### 纵向缩减具有副本的 Valkey 或 Redis OSS 集群（控制台）
<a name="Scaling.RedisReplGrps.ScaleDown.CON"></a>

以下过程使用控制台将带有副本节点的 Valkey 或 Redis OSS 集群扩展到较小的节点类型。 ElastiCache 

**纵向缩减具有副本节点的 Valkey 或 Redis OSS 集群（控制台）**

1. 确保较小的节点类型足以满足您的数据和开销需求。

1. 如果您的参数组使用 `reserved-memory` 为 Valkey 或 Redis OSS 开销预留内存，请确保您有一个为新节点类型预留正确内存量的自定义参数组。

   或者，您可以修改自定义参数组以使用 `reserved-memory-percent`。有关更多信息，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 从集群列表中，选择要缩减的集群。该集群必须运行 Valkey 或 Redis OSS 引擎，而不是 Clustered Valkey 或 Redis OSS 引擎。

1. 选择 **Modify**(修改)。

1. 在 **Modify Cluster** 向导中：

   1. 从 **Node type (节点类型)** 列表中选择您希望缩减到的节点类型。

   1. 如果您在使用 `reserved-memory` 管理内存，请从 **Parameter Group** 列表中，选择为新节点类型预留正确内存量的自定义参数组。

1. 如果您要立即执行缩减过程，请选中 **Apply immediately (立即应用)** 复选框。如果 **Apply immediately (立即应用)** 复选框处于未选中状态，则在此集群的下一维护时段内执行缩减过程。

1. 选择 **Modify**(修改)。

1. 当集群的状态从 *modifying* 变为 *available* 时，即表示您的集群已扩展为新的节点类型。无需更新应用程序中的终端节点。

### 纵向缩减 Valkey 或 Redis OSS 复制组（Amazon CLI）
<a name="Scaling.RedisReplGrps.ScaleUp.CLI"></a>

以下过程使用Amazon CLI将复制组从其当前节点类型收缩为较小的新节点类型。在此过程中， ElastiCache 更新 DNS 条目，使其指向新节点。因此，您便不需要更新应用程序中的终端节点。对于 Valkey 7.2 及更高版本或 Redis OSS 5.0.5 及更高版本，您可以在该集群继续保持在线并处理传入请求时扩展启用失效转移的集群。在版本 4.0.10 及更低版本上，更新 DNS 条目时，您可能会发现先前版本上来自主节点的读取和写入短暂中断。

但是，只读副本集群的读取继续不受干扰地进行。

缩减为较小的节点类型所需的时间因节点类型和当前集群中的数据量而异。

**纵向缩减 Valkey 或 Redis OSS 复制组（Amazon CLI）**

1. 通过运行带有以下参数的Amazon CLI`list-allowed-node-type-modifications`命令来确定可以缩减到哪些节点类型。
   + `--replication-group-id` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache list-allowed-node-type-modifications \
   	    --replication-group-id my-repl-group
   ```

   对于 Windows：

   ```
   aws elasticache list-allowed-node-type-modifications ^
   	    --replication-group-id my-repl-group
   ```

   该操作的输出内容应类似如下所示 (JSON 格式)。

   ```
   {
   	    "ScaleDownModifications": [
   	        "cache.m3.2xlarge", 
   	        "cache.m3.large", 
   	        "cache.m3.xlarge", 
   	        "cache.m4.10xlarge", 
   	        "cache.m4.2xlarge", 
   	        "cache.m4.4xlarge", 
   	        "cache.m4.large", 
   	        "cache.m4.xlarge", 
   	        "cache.r3.2xlarge", 
   	        "cache.r3.4xlarge", 
   	        "cache.r3.8xlarge", 
   	        "cache.r3.large", 
   	        "cache.r3.xlarge"
   	    ]
   	}
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [list-allowed-node-type-modifications](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-allowed-node-type-modifications.html)。

1. 使用带有以下参数的Amazon CLI`modify-replication-group`命令将当前的复制组扩展到新的节点类型。
   + `--replication-group-id` – 复制组的名称。
   + `--cache-node-type` – 此复制组中集群的较小新节点类型。此值必须是上一步中由 `list-allowed-node-type-modifications` 命令返回的实例类型之一。
   + `--cache-parameter-group-name` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `--apply-immediately` – 使纵向扩展过程立即得到应用。要将扩展操作推迟到下一维护时段，请使用 `--no-apply-immediately`。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache modify-replication-group \
   	    --replication-group-id my-repl-group \
   	    --cache-node-type cache.t2.small  \
   	    --cache-parameter-group-name redis32-m3-2xl \
   	    --apply-immediately
   ```

   对于 Windows：

   ```
   aws elasticache modify-replication-group ^
   	    --replication-group-id my-repl-group ^
   	    --cache-node-type cache.t2.small  ^
   	    --cache-parameter-group-name redis32-m3-2xl \
   	    --apply-immediately
   ```

   该命令的输出内容应类似如下所示 (JSON 格式)。

   ```
   {"ReplicationGroup": {
   	        "Status": "available", 
   	        "Description": "Some description", 
   	        "NodeGroups": [
   	            {
   	                "Status": "available", 
   	                "NodeGroupMembers": [
   	                    {
   	                        "CurrentRole": "primary", 
   	                        "PreferredAvailabilityZone": "us-west-2b", 
   	                        "CacheNodeId": "0001", 
   	                        "ReadEndpoint": {
   	                            "Port": 6379, 
   	                            "Address": "my-repl-group-001.8fdx4s.0001.usw2.cache.amazonaws.com"
   	                        }, 
   	                        "CacheClusterId": "my-repl-group-001"
   	                    }, 
   	                    {
   	                        "CurrentRole": "replica", 
   	                        "PreferredAvailabilityZone": "us-west-2c", 
   	                        "CacheNodeId": "0001", 
   	                        "ReadEndpoint": {
   	                            "Port": 6379, 
   	                            "Address": "my-repl-group-002.8fdx4s.0001.usw2.cache.amazonaws.com"
   	                        }, 
   	                        "CacheClusterId": "my-repl-group-002"
   	                    }
   	                ], 
   	                "NodeGroupId": "0001", 
   	                "PrimaryEndpoint": {
   	                    "Port": 6379, 
   	                    "Address": "my-repl-group.8fdx4s.ng.0001.usw2.cache.amazonaws.com"
   	                }
   	            }
   	        ], 
   	        "ReplicationGroupId": "my-repl-group", 
   	        "SnapshotRetentionLimit": 1, 
   	        "AutomaticFailover": "disabled", 
   	        "SnapshotWindow": "12:00-13:00", 
   	        "SnapshottingClusterId": "my-repl-group-002", 
   	        "MemberClusters": [
   	            "my-repl-group-001", 
   	            "my-repl-group-002", 
   	        ], 
   	        "PendingModifiedValues": {}
   	    }
   	}
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)。

1. 如果您使用了`--apply-immediately`参数，请使用带有以下参数的Amazon CLI`describe-replication-group`命令来监控复制组的状态。当状态从 *modifying* 变为 *available* 时，您便可开始写入已收缩的新复制组。
   + `--replication-group-id` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache describe-replication-group \
   	    --replication-group-id my-replication-group
   ```

   对于 Windows：

   ```
   aws elasticache describe-replication-groups ^
   	    --replication-group-id my-replication-group
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [describe-replication-groups](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-replication-groups.html)。

### 缩小 Valkey 或 Redis OSS 复制组 (API) ElastiCache
<a name="Scaling.RedisReplGrps.ScaleDown.API"></a>

以下过程使用 ElastiCache API 将您的复制组从其当前节点类型扩展到新的较小节点类型。在此过程中， ElastiCache 更新 DNS 条目，使其指向新节点。因此，您便不需要更新应用程序中的终端节点。对于 Valkey 7.2 及更高版本或 Redis OSS 5.0.5 及更高版本，您可以在该集群继续保持在线并处理传入请求时扩展启用失效转移的集群。在 Redis OSS 版本 4.0.10 及更低版本上，更新 DNS 条目时，您可能会发现先前版本上来自主节点的读取和写入短暂中断。但是，只读副本集群的读取继续不受干扰地进行。

缩减为较小的节点类型所需的时间因节点类型和当前集群中的数据量而异。

**缩小 Valkey 或 Redis OSS 复制组 (API) ElastiCache**

1. 使用带有以下参数的 ElastiCache API `ListAllowedNodeTypeModifications` 操作来确定可以缩减为哪些节点类型。
   + `ReplicationGroupId` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ListAllowedNodeTypeModifications
   	   &ReplicationGroupId=MyReplGroup
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ListAllowedNodeTypeModifications](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ListAllowedNodeTypeModifications.html)*中的。

1. 使用 `ModifyReplicationGroup` ElastiCache API 操作并使用以下参数将当前的复制组扩展到新的节点类型。
   + `ReplicationGroupId` – 复制组的名称。
   + `CacheNodeType` – 此复制组中集群的较小新节点类型。此值必须是上一步中由 `ListAllowedNodeTypeModifications` 操作返回的实例类型之一。
   + `CacheParameterGroupName` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `ApplyImmediately` – 设置为 `true` 可促使立即应用纵向扩展流程。要将缩减流程推迟到下一维护时段，请使用 `ApplyImmediately``=false`。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ModifyReplicationGroup
   	   &ApplyImmediately=true
   	   &CacheNodeType=cache.m3.2xlarge
   	   &CacheParameterGroupName=redis32-m3-2xl
   	   &ReplicationGroupId=myReplGroup
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20141201T220302Z
   	   &Version=2014-12-01
   	   &X-Amz-Algorithm=&AWS;4-HMAC-SHA256
   	   &X-Amz-Date=20141201T220302Z
   	   &X-Amz-SignedHeaders=Host
   	   &X-Amz-Expires=20141201T220302Z
   	   &X-Amz-Credential=<credential>
   	   &X-Amz-Signature=<signature>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)*中的。

1. 如果您使用了 `ApplyImmediately``=true`，请使用带有以下参数的 ElastiCache API `DescribeReplicationGroups` 操作监控复制组的状态。当状态从 *modifying* 变为 *available* 时，您便可开始写入已收缩的新复制组。
   + `ReplicationGroupId` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=DescribeReplicationGroups
   	   &ReplicationGroupId=MyReplGroup
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[DescribeReplicationGroups](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html)*中的。

## 增加读取容量
<a name="Scaling.RedisReplGrps.ScaleOut"></a>

要增加读取容量，可向 Valkey 或 Redis OSS 复制组添加只读副本（最多 5 个）。

您可以使用 ElastiCache 控制台、或 API 扩展 Valkey 或 Redis OSS 集群的Amazon CLI读取容量。 ElastiCache 有关更多信息，请参阅 [为 Valkey 或 Redis OSS（已禁用集群模式）添加只读副本](Replication.AddReadReplica.md)。

## 降低读取容量
<a name="Scaling.RedisReplGrps.ScaleIn"></a>

要降低读取容量，请从具有副本的 Valkey 或 Redis OSS 集群中删除一个或多个只读副本（在 API/CLI 中称作*复制组*）。如果集群是启用自动故障转移功能的多可用区，则在未先禁用多可用区的情况下，无法删除上一个只读副本。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

有关更多信息，请参阅 [为 Valkey 或 Redis OSS（已禁用集群模式）删除只读副本](Replication.RemoveReadReplica.md)。

# 扩缩 Valkey 或 Redis OSS（已启用集群模式）集群
<a name="scaling-redis-cluster-mode-enabled"></a>

由于对集群的需求发生变化，您可能决定通过更改 Valkey 或 Redis OSS（已启用集群模式）集群中的分片数量来提高性能或降低成本。我们建议使用在线水平扩展来实现这一目的，因为采用这种方法，您的集群在扩展过程中可以继续为请求提供服务。

您决定重新调节集群的情况包括以下几种：
+ **内存压力：**

  如果集群中的节点存在内存压力，您可能会决定进行横向扩展，以便获得更多资源来更好地存储数据并为请求提供服务。

  您可以通过监控以下指标来确定您的节点是否承受内存压力：*FreeableMemory*SwapUsage**、和*BytesUsedForCache*。
+ **CPU 或网络瓶颈：**

  如果 latency/throughput 问题困扰着您的集群，则可能需要向外扩展以解决问题。

  您可以通过监控以下指标来监控延迟和吞吐量级别：*CPUUtilization*NetworkBytesIn**、*NetworkBytesOut*、*CurrConnections*、和*NewConnections*。
+ **您的集群过度扩展：**

  对集群的当前需求是缩减集群不会降低性能，并可以降低成本。

  您可以使用以下指标监控集群的使用情况，以确定是否可以安全地进行扩展：*FreeableMemory*、*SwapUsage*、*BytesUsedForCache*CPUUtilization**、*NetworkBytesIn*、*NetworkBytesOut*、*CurrConnections*、和*NewConnections*。

**扩展的性能影响**  
当使用离线过程进行扩展时，您的集群在大部分过程中处于离线状态，因此无法为请求提供服务。当使用在线方法进行扩展时，由于扩展是计算密集型操作，因此会导致一定程度的性能下降，但是在整个扩展操作过程中您的集群仍然会继续为请求提供服务。性能的降低程度取决于您的常规 CPU 利用率和数据。

有两种方法可以扩缩您的 Valkey 或 Redis OSS（已启用集群模式）集群：水平扩缩和垂直扩缩。
+ 利用横向扩展，可以通过添加或删除节点组（分片）来更改复制组中的节点组（分片）数量。在线重新分片过程允许在集群继续处理传入请求的 in/out 同时进行扩展。

  采用与旧集群不同的方法来配置新集群中的槽。仅采用离线方法。
+ 纵向扩展 – 更改节点类型以调整集群大小。在线垂直扩展允许在集群继续处理传入请求的 up/down 同时进行扩展。

如果要通过横向缩减或纵向缩减来减小集群的大小和内存容量，请确保新配置具有足够的内存用于数据和 Valkey 或 Redis OSS 开销。

有关更多信息，请参阅 [选择节点大小](CacheNodes.SelectSize.md)。

**Contents**
+ [

## Valkey 或 Redis OSS（已启用集群模式）的离线重新分片
](#redis-cluster-resharding-offline)
+ [

## Valkey 或 Redis OSS（已启用集群模式）的离线重新分片
](#redis-cluster-resharding-online)
  + [

### 通过在线重新分片功能添加分片
](#redis-cluster-resharding-online-add)
  + [

### 通过在线重新分片功能删除分片
](#redis-cluster-resharding-online-remove)
    + [

#### 删除分片（控制台）
](#redis-cluster-resharding-online-remove-console)
    + [

#### 删除分片（Amazon CLI）
](#redis-cluster-resharding-online-remove-cli)
    + [

#### 移除分片 (ElastiCacheAPI)
](#redis-cluster-resharding-online-remove-api)
  + [

### 在线分片重新平衡
](#redis-cluster-resharding-online-rebalance)
    + [

#### 在线分片重新平衡（控制台）
](#redis-cluster-resharding-online-rebalance-console)
    + [

#### 在线分片重新平衡（Amazon CLI）
](#redis-cluster-resharding-online-rebalance-cli)
    + [

#### 在线分片再平衡 (API) ElastiCache
](#redis-cluster-resharding-online-rebalance-api)
+ [

# 通过修改节点类型来在线纵向扩展
](redis-cluster-vertical-scaling.md)
  + [

## 在线纵向扩展
](redis-cluster-vertical-scaling.md#redis-cluster-vertical-scaling-scaling-up)
    + [

### 纵向扩展 Valkey 或 Redis OSS 集群（控制台）
](redis-cluster-vertical-scaling.md#redis-cluster-vertical-scaling-console)
    + [

### 纵向扩展 Valkey 或 Redis OSS 集群（Amazon CLI）
](redis-cluster-vertical-scaling.md#Scaling.RedisStandalone.ScaleUp.CLI)
    + [

### 扩展 Valkey 或 Redis OSS 集群 (API) ElastiCache
](redis-cluster-vertical-scaling.md#VeticalScaling.RedisReplGrps.ScaleUp.API)
  + [

## 在线缩减
](redis-cluster-vertical-scaling.md#redis-cluster-vertical-scaling-scaling-down)
    + [

### 纵向缩减 Valkey 或 Redis OSS 集群（控制台）
](redis-cluster-vertical-scaling.md#redis-cluster-vertical-scaling-down-console)
    + [

### 纵向缩减 Valkey 或 Redis OSS 集群（Amazon CLI）
](redis-cluster-vertical-scaling.md#Scaling.RedisStandalone.ScaleDown.CLI)
    + [

### 缩小 Valkey 或 Redis OSS 集群 (API) ElastiCache
](redis-cluster-vertical-scaling.md#Scaling.Vertical.ScaleDown.API)

## Valkey 或 Redis OSS（已启用集群模式）的离线重新分片
<a name="redis-cluster-resharding-offline"></a>

离线分片重新配置带来的主要优势便是，除了在复制组中添加或删除分片以外，您还可以执行更多操作。在进行离线重新分片和重新平衡时，除了更改复制组中的分片数量，您还可以执行以下操作：

**注意**  
启用了数据分层的 Valkey 或 Redis OSS 集群不支持离线重新分片。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。
+ 更改复制组的节点类型。
+ 为复制组中的每个节点指定可用区。
+ 升级为更新的引擎版本。
+ 单独指定每个分片中的副本节点数量。
+ 为每个分片指定密钥空间。

离线分片重新配置的主要缺点是，从过程的还原部分开始直到更新应用程序中的终端节点，集群一直处于离线状态。您的集群处于离线状态的时间长短因集群中的数据量而异。

**离线重新配置分片 Valkey 或 Redis OSS（已启用集群模式）集群**

1. 手动备份现有的 Valkey 或 Redis OSS 集群。有关更多信息，请参阅 [进行手动备份](backups-manual.md)。

1. 通过从备份中还原来创建新集群。有关更多信息，请参阅 [从备份还原到新缓存](backups-restoring.md)。

1. 将您的应用程序中的终端节点更新为新集群的终端节点。有关更多信息，请参阅 [查找 ElastiCache 中的缓存连接端点](Endpoints.md)。

## Valkey 或 Redis OSS（已启用集群模式）的离线重新分片
<a name="redis-cluster-resharding-online"></a>

通过在 ElastiCache Valkey 7.2 或更高版本或 Redis OSS 3.2.10 或更高版本中使用在线重新分片和分片再平衡，您可以在不停机的情况下动态扩展 Valkey 或 Redis OSS（已启用集群模式）集群。此方法意味着，即使在进行扩展或重新平衡的过程中，您的集群也可以继续为请求提供服务。

您可执行以下操作：
+ **横向扩展** – 通过向 Valkey 或 Redis OSS（已启用集群模式）集群（复制组）添加分片（节点组）来增加读写容量。

  如果您向复制组添加一个或多个分片，则每个新分片中的节点数量与最小的现有分片中的节点数量相同。
+ **横向缩减** – 通过删除 Valkey 或 Redis OSS（已启用集群模式）集群中的分片来降低读写容量，从而降低成本。
+ **重新平衡** – 在 Valkey 或 Redis OSS（已启用集群模式）集群中的分片之间移动键空间，尽可能使其在分片之间均匀分布。

您无法执行以下操作：
+ **单独配置分片：**

  您无法单独指定分片的键空间。要执行此操作，您必须使用离线过程。

目前，以下限制适用于 ElastiCache 在线重新分片和重新平衡：
+ 这些过程需要 Valkey 7.2 和更新版本或者 Redis OSS 3.2.10 或更新版本。有关升级引擎版本的信息，请参阅[的版本管理 ElastiCache](VersionManagement.md)。
+ 槽或键空间和大型项目存在以下限制：

  如果分片中的任何密钥包含一个大型项，在横向扩展或重新平衡时关键字不会迁移到新分片。此功能会导致分片不平衡。

  如果某个分片中的任何密钥包含大型项目（序列化后大于 256MB 的项目），则在缩减时不会删除该分片。此功能可导致某些分片无法删除。
+ 在横向扩展时，任何新分片中的节点数量等于最小的现有分片中的节点数量。
+ 在横向扩展时，所有现有分片的任何常见标签将被复制到新分片中。
+ 扩展全局数据存储集群时，不会自动 ElastiCache 将函数从一个现有节点复制到新节点。我们建议在横向扩展集群后将您的函数加载到新的分片中，这样每个分片都具有相同的函数。

**注意**  
在 ElastiCache Valkey 7.2 及 ElastiCache 更高版本以及 Redis OSS 版本 7 及更高版本中：扩展集群时， ElastiCache 会自动将现有节点（随机选择）中加载的函数复制到新节点。如果您的应用程序使用[函数](https://valkey.io/topics/functions-intro/)，我们建议您在横向扩展之前将所有函数加载到所有分片，这样您的集群就不会在不同的分片上出现不同的函数定义。

有关更多信息，请参阅 [在线集群大小调整](best-practices-online-resharding.md)。

您可以使用、和 API 水平扩展或重新平衡您的 Valkey 或 Redis OSS（已启用集群模式）集群。Amazon Web Services 管理控制台Amazon CLI ElastiCache 

### 通过在线重新分片功能添加分片
<a name="redis-cluster-resharding-online-add"></a>

你可以使用、或 API 向你的 Valkey 或 Redis OSS（已启用集群模式）集群添加分片。Amazon Web Services 管理控制台Amazon CLI ElastiCache向 Valkey 或 Redis OSS（已启用集群模式）集群添加分片时，现有分片的所有标签都将复制到新分片。

**Topics**

#### 添加分片（控制台）
<a name="redis-cluster-resharding-online-add-console"></a>

您可以使用将一个或多个分片Amazon Web Services 管理控制台添加到您的 Valkey 或 Redis OSS（已启用集群模式）集群。以下步骤描述了这个过程。

**向 Valkey 或 Redis OSS（已启用集群模式）集群添加分片**

1. 打开 ElastiCache 控制台，网址为[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择 **Valkey 集群**或 **Redis OSS 集群**。

1. 找到并选择要将分片添加到其中的 Valkey 或 Redis OSS（已启用集群模式）集群的名称，而不是选择集群名称左侧的框。
**提示**  
Valkey 或 Redis OSS（已启用集群模式）的**模式**列中会显示**Clustered Valkey**** 或 Clustered Redis**

1. 选择 **Add shard**。

   1. 对于 **Number of shards to be added**，请选择要添加到此集群的分片数量。

   1. 对于 **Availability zone(s)**，请选择 **No preference** 或 **Specify availability zones**。

   1. 如果您选择 **Specify availability zones**，则对于每个分片中的每个节点，请从可用区列表中选择节点的可用区。

   1. 选择**添加**。

#### 添加分片（Amazon CLI）
<a name="redis-cluster-resharding-online-add-cli"></a>

以下过程介绍了如何通过使用Amazon CLI添加分片来重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。

在`modify-replication-group-shard-configuration`中使用以下参数：

**Parameters**
+ `--apply-immediately` – 必需。指定分片重新配置操作立即开始。
+ `--replication-group-id` – 必需。指定在哪个复制组（集群）上执行分片重新配置操作。
+ `--node-group-count` – 必需。指定操作完成时存在的分片（节点组）数量。添加分片后，`--node-group-count` 的值必须大于当前分片数量。

  您也可以使用 `--resharding-configuration` 为复制组中的每个节点指定可用区。
+ `--resharding-configuration` – 可选。复制组中每个分片中的每个节点的首选可用区列表。只有当 `--node-group-count` 的值大于当前分片数量时，才能使用此参数。如果在添加分片时省略此参数，Amazon 将为新节点 ElastiCache 选择可用区。

以下示例将重新配置名为 `my-cluster` 的 Valkey 或 Redis OSS（已启用集群模式）集群中四个分片的键空间。该示例还为每个分片中的每个节点指定可用区。操作将立即开始。

**Example - 添加分片**  
对于 Linux、macOS 或 Unix：  

```
aws elasticache modify-replication-group-shard-configuration \
    --replication-group-id my-cluster \
    --node-group-count 4 \
    --resharding-configuration \
        "PreferredAvailabilityZones=us-east-2a,us-east-2c" \
        "PreferredAvailabilityZones=us-east-2b,us-east-2a" \
        "PreferredAvailabilityZones=us-east-2c,us-east-2d" \
        "PreferredAvailabilityZones=us-east-2d,us-east-2c" \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache modify-replication-group-shard-configuration ^
    --replication-group-id my-cluster ^
    --node-group-count 4 ^
    --resharding-configuration ^
        "PreferredAvailabilityZones=us-east-2a,us-east-2c" ^
        "PreferredAvailabilityZones=us-east-2b,us-east-2a" ^
        "PreferredAvailabilityZones=us-east-2c,us-east-2d" ^
        "PreferredAvailabilityZones=us-east-2d,us-east-2c" ^
    --apply-immediately
```

有关更多信息，请参阅Amazon CLI文档中的 [modify-replication-group-shard-配置](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group-shard-configuration.html)。

#### 添加分片 (ElastiCache API)
<a name="redis-cluster-resharding-online-add-api"></a>

您可以使用该 ElastiCache API 通过操作在线重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。`ModifyReplicationGroupShardConfiguration`

在`ModifyReplicationGroupShardConfiguration`中使用以下参数：

**Parameters**
+ `ApplyImmediately=true` – 必需。指定分片重新配置操作立即开始。
+ `ReplicationGroupId` – 必需。指定在哪个复制组（集群）上执行分片重新配置操作。
+ `NodeGroupCount` – 必需。指定操作完成时存在的分片（节点组）数量。添加分片后，`NodeGroupCount` 的值必须大于当前分片数量。

  您也可以使用 `ReshardingConfiguration` 为复制组中的每个节点指定可用区。
+ `ReshardingConfiguration` – 可选。复制组中每个分片中的每个节点的首选可用区列表。只有当 `NodeGroupCount` 的值大于当前分片数量时，才能使用此参数。如果在添加分片时省略此参数，Amazon 将为新节点 ElastiCache 选择可用区。

以下过程介绍如何通过使用 API 添加分片来重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。 ElastiCache 

**Example - 添加分片**  
以下示例将节点组添加到 Valkey 或 Redis OSS（已启用集群模式）集群 `my-cluster` 中，因此操作完成后共有 4 个节点组。该示例还为每个分片中的每个节点指定可用区。操作将立即开始。  

```
https://elasticache.us-east-2.amazonaws.com/
    ?Action=ModifyReplicationGroupShardConfiguration
    &ApplyImmediately=true
    &NodeGroupCount=4
    &ReplicationGroupId=my-cluster
    &ReshardingConfiguration.ReshardingConfiguration.1.PreferredAvailabilityZones.AvailabilityZone.1=us-east-2a 
    &ReshardingConfiguration.ReshardingConfiguration.1.PreferredAvailabilityZones.AvailabilityZone.2=us-east-2c 
    &ReshardingConfiguration.ReshardingConfiguration.2.PreferredAvailabilityZones.AvailabilityZone.1=us-east-2b 
    &ReshardingConfiguration.ReshardingConfiguration.2.PreferredAvailabilityZones.AvailabilityZone.2=us-east-2a 
    &ReshardingConfiguration.ReshardingConfiguration.3.PreferredAvailabilityZones.AvailabilityZone.1=us-east-2c 
    &ReshardingConfiguration.ReshardingConfiguration.3.PreferredAvailabilityZones.AvailabilityZone.2=us-east-2d 
    &ReshardingConfiguration.ReshardingConfiguration.4.PreferredAvailabilityZones.AvailabilityZone.1=us-east-2d 
    &ReshardingConfiguration.ReshardingConfiguration.4.PreferredAvailabilityZones.AvailabilityZone.2=us-east-2c 
    &Version=2015-02-02
    &SignatureVersion=4
    &SignatureMethod=HmacSHA256
    &Timestamp=20171002T192317Z
    &X-Amz-Credential=<credential>
```

有关更多信息，请参阅 ElastiCache API 参考[ModifyReplicationGroupShardConfiguration](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroupShardConfiguration.html)中的。

### 通过在线重新分片功能删除分片
<a name="redis-cluster-resharding-online-remove"></a>

您可以使用、或 API 从 Valkey 或 Redis OSS（已启用集群模式）集群中Amazon Web Services 管理控制台移除分片。Amazon CLI ElastiCache 

**Topics**
+ [

#### 删除分片（控制台）
](#redis-cluster-resharding-online-remove-console)
+ [

#### 删除分片（Amazon CLI）
](#redis-cluster-resharding-online-remove-cli)
+ [

#### 移除分片 (ElastiCacheAPI)
](#redis-cluster-resharding-online-remove-api)

#### 删除分片（控制台）
<a name="redis-cluster-resharding-online-remove-console"></a>

以下过程介绍了如何通过使用Amazon Web Services 管理控制台删除分片来重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。

在从复制组中移除节点组（分片）之前，请 ElastiCache 确保所有数据都适合剩余的分片。如果数据将适合，将根据要求从复制组中删除指定分片。如果数据不适合剩余的节点组，则过程将终止，并且复制组的节点组配置将保留为与发出请求之前相同。

您可以使用从 Valkey 或 Redis OSS（已启用集群模式）集群中移除一个或多个分片。Amazon Web Services 管理控制台您无法删除某个复制组中的所有分片。而必须删除复制组。有关更多信息，请参阅 [删除复制组](Replication.DeletingRepGroup.md)。以下步骤描述了删除一个或多个分片的过程。

**从 Valkey 或 Redis OSS（已启用集群模式）集群中删除分片**

1. 打开 ElastiCache 控制台，网址为[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择 **Valkey 集群**或 **Redis OSS 集群**。

1. 找到并选择要从中删除分片的 Valkey 或 Redis OSS（已启用集群模式）集群的名称，而不是选择集群名称左侧的框。
**提示**  
Valkey 或 Redis OSS（已启用集群模式）集群的**分片**列中会显示 1 或大于 1 的值。

1. 从分片列表中，选择要删除的每个分片的名称左侧的框。

1. 选择 **Delete shard**。

#### 删除分片（Amazon CLI）
<a name="redis-cluster-resharding-online-remove-cli"></a>

以下过程介绍了如何通过使用Amazon CLI删除分片来重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。

**重要**  
在从复制组中移除节点组（分片）之前，请 ElastiCache 确保所有数据都适合剩余的分片。如果数据将适合，将根据要求从复制组中删除指定分片（`--node-groups-to-remove`），并将其密钥空间映射到其余分片。如果数据不适合剩余的节点组，则过程将终止，并且复制组的节点组配置将保留为与发出请求之前相同。

您可以使用从 Valkey 或 Redis OSS（已启用集群模式）集群中移除一个或多个分片。Amazon CLI您无法删除某个复制组中的所有分片。而必须删除复制组。有关更多信息，请参阅 [删除复制组](Replication.DeletingRepGroup.md)。

在`modify-replication-group-shard-configuration`中使用以下参数：

**Parameters**
+ `--apply-immediately` – 必需。指定分片重新配置操作立即开始。
+ `--replication-group-id` – 必需。指定在哪个复制组（集群）上执行分片重新配置操作。
+ `--node-group-count` – 必需。指定操作完成时存在的分片（节点组）数量。删除分片后，`--node-group-count` 的值必须小于当前分片数量。

  
+ `--node-groups-to-remove` – 当 `--node-group-count` 小于当前节点组（分片）数量时，此参数为必需。 IDs 要从复制组中移除的分片（节点组）的列表。

以下步骤描述了删除一个或多个分片的过程。

**Example - 删除分片**  
以下示例从 Valkey 或 Redis OSS（已启用集群模式）集群 `my-cluster` 中删除 2 个节点组，因此操作完成后共有 2 个节点组。删除分片的键空间会均匀地分布在其余分片上。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache modify-replication-group-shard-configuration \
    --replication-group-id my-cluster \
    --node-group-count 2 \
    --node-groups-to-remove "0002" "0003" \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache modify-replication-group-shard-configuration ^
    --replication-group-id my-cluster ^
    --node-group-count 2 ^
    --node-groups-to-remove "0002" "0003" ^
    --apply-immediately
```

#### 移除分片 (ElastiCacheAPI)
<a name="redis-cluster-resharding-online-remove-api"></a>

您可以使用该 ElastiCache API 通过操作在线重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。`ModifyReplicationGroupShardConfiguration`

以下过程介绍如何通过使用 API 移除分片来重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。 ElastiCache 

**重要**  
在从复制组中移除节点组（分片）之前，请 ElastiCache 确保所有数据都适合剩余的分片。如果数据将适合，将根据要求从复制组中删除指定分片（`NodeGroupsToRemove`），并将其密钥空间映射到其余分片。如果数据不适合剩余的节点组，则过程将终止，并且复制组的节点组配置将保留为与发出请求之前相同。

你可以使用 ElastiCache API 从 Valkey 或 Redis OSS（已启用集群模式）集群中移除一个或多个分片。您无法删除某个复制组中的所有分片。而必须删除复制组。有关更多信息，请参阅 [删除复制组](Replication.DeletingRepGroup.md)。

在`ModifyReplicationGroupShardConfiguration`中使用以下参数：

**Parameters**
+ `ApplyImmediately=true` – 必需。指定分片重新配置操作立即开始。
+ `ReplicationGroupId` – 必需。指定在哪个复制组（集群）上执行分片重新配置操作。
+ `NodeGroupCount` – 必需。指定操作完成时存在的分片（节点组）数量。删除分片后，`NodeGroupCount` 的值必须小于当前分片数量。
+ `NodeGroupsToRemove` – 当 `--node-group-count` 小于当前节点组（分片）数量时，此参数为必需。 IDs 要从复制组中移除的分片（节点组）的列表。

以下步骤描述了删除一个或多个分片的过程。

**Example - 删除分片**  
以下示例从 Valkey 或 Redis OSS（已启用集群模式）集群 `my-cluster` 中删除 2 个节点组，因此操作完成后共有 2 个节点组。删除分片的键空间会均匀地分布在其余分片上。  

```
https://elasticache.us-east-2.amazonaws.com/
    ?Action=ModifyReplicationGroupShardConfiguration
    &ApplyImmediately=true
    &NodeGroupCount=2
    &ReplicationGroupId=my-cluster
    &NodeGroupsToRemove.member.1=0002
    &NodeGroupsToRemove.member.2=0003
    &Version=2015-02-02
    &SignatureVersion=4
    &SignatureMethod=HmacSHA256
    &Timestamp=20171002T192317Z
    &X-Amz-Credential=<credential>
```

### 在线分片重新平衡
<a name="redis-cluster-resharding-online-rebalance"></a>

您可以使用、或 API 重新平衡您的 Valkey 或 Redis OSS（已启用集群模式）集群中的Amazon Web Services 管理控制台分片。Amazon CLI ElastiCache 

**Topics**
+ [

#### 在线分片重新平衡（控制台）
](#redis-cluster-resharding-online-rebalance-console)
+ [

#### 在线分片重新平衡（Amazon CLI）
](#redis-cluster-resharding-online-rebalance-cli)
+ [

#### 在线分片再平衡 (API) ElastiCache
](#redis-cluster-resharding-online-rebalance-api)

#### 在线分片重新平衡（控制台）
<a name="redis-cluster-resharding-online-rebalance-console"></a>

以下过程介绍了如何通过使用Amazon Web Services 管理控制台重新平衡分片来重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。

**在 Valkey 或 Redis OSS（已启用集群模式）集群的分片之间重新平衡键空间**

1. 打开 ElastiCache 控制台，网址为[https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择 **Valkey 集群**或 **Redis OSS 集群**。

1. 选择要重新平衡的 Valkey 或 Redis OSS（已启用集群模式）集群的名称，而不是名称左侧的框。
**提示**  
Valkey 或 Redis OSS（已启用集群模式）集群的**分片**列中会显示 1 或大于 1 的值。

1. 选择 **Rebalance**。

1. 系统提示时，请选择 **Rebalance**。您可能会看到类似于此的消息:*Slots in the replication group are uniformly distributed. Nothing to do. (Service: AmazonElastiCache; Status Code: 400; Error Code: InvalidReplicationGroupState; Request ID: 2246cebd-9721-11e7-8d5b-e1b0f086c8cf)*. 如果如此，请选择 **Cancel**。

#### 在线分片重新平衡（Amazon CLI）
<a name="redis-cluster-resharding-online-rebalance-cli"></a>

在`modify-replication-group-shard-configuration`中使用以下参数：

**Parameters**
+ `-apply-immediately` – 必需。指定分片重新配置操作立即开始。
+ `--replication-group-id` – 必需。指定在哪个复制组（集群）上执行分片重新配置操作。
+ `--node-group-count` – 必需。要在集群中的所有分片之间重新平衡键空间，该值必须与当前分片数量相同。

以下过程介绍了如何通过使用Amazon CLI重新平衡分片来重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。

**Example - 重新平衡集群中的分片**  
以下示例演示重新平衡 Valkey 或 Redis OSS（已启用集群模式）集群 `my-cluster` 中的槽，以便使槽尽可能均匀分布。`--node-group-count` (`4`) 的值为集群中的当前分片数量。  
对于 Linux、macOS 或 Unix：  

```
aws elasticache modify-replication-group-shard-configuration \
    --replication-group-id my-cluster \
    --node-group-count 4 \
    --apply-immediately
```
对于 Windows：  

```
aws elasticache modify-replication-group-shard-configuration ^
    --replication-group-id my-cluster ^
    --node-group-count 4 ^
    --apply-immediately
```

#### 在线分片再平衡 (API) ElastiCache
<a name="redis-cluster-resharding-online-rebalance-api"></a>

您可以使用该 ElastiCache API 通过操作在线重新配置 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。`ModifyReplicationGroupShardConfiguration`

在`ModifyReplicationGroupShardConfiguration`中使用以下参数：

**Parameters**
+ `ApplyImmediately=true` – 必需。指定分片重新配置操作立即开始。
+ `ReplicationGroupId` – 必需。指定在哪个复制组（集群）上执行分片重新配置操作。
+ `NodeGroupCount` – 必需。要在集群中的所有分片之间重新平衡键空间，该值必须与当前分片数量相同。

以下过程介绍如何通过使用 API 重新平衡分片来重新配置您的 Valkey 或 Redis OSS（已启用集群模式）集群中的分片。 ElastiCache 

**Example - 集群重新平衡**  
以下示例演示重新平衡 Valkey 或 Redis OSS（已启用集群模式）集群 `my-cluster` 中的槽，以便使槽尽可能均匀分布。`NodeGroupCount` (`4`) 的值为集群中的当前分片数量。  

```
https://elasticache.us-east-2.amazonaws.com/
    ?Action=ModifyReplicationGroupShardConfiguration
    &ApplyImmediately=true
    &NodeGroupCount=4
    &ReplicationGroupId=my-cluster
    &Version=2015-02-02
    &SignatureVersion=4
    &SignatureMethod=HmacSHA256
    &Timestamp=20171002T192317Z
    &X-Amz-Credential=<credential>
```

# 通过修改节点类型来在线纵向扩展
<a name="redis-cluster-vertical-scaling"></a>

通过对 Valkey 7.2 或更新版本或者 Redis OSS 版本 3.2.10 或更新版本使用在线垂直扩缩，您可以在最少停机时间的情况下动态扩缩 Valkey 或 Redis OSS 集群。这样，即使在扩展时，Valkey 或 Redis OSS 集群也可以处理请求。

**注意**  
不支持在使用数据分层功能的集群（例如，使用 r6gd 节点类型的集群）和不使用数据分层功能的集群（例如，使用 r6g 节点类型的集群）之间扩缩。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

您可执行以下操作：
+ **纵向扩展** – 通过调整 Valkey 或 Redis OSS 集群的节点类型以使用较大的节点类型来增加读取和写入容量。

  ElastiCache 在保持在线状态并处理请求的同时，动态调整集群的大小。
+ **缩减** – 通过向下调整节点类型以使用较小节点来减少读写容量。同样，在保持在线状态并处理请求的同时， ElastiCache 动态调整集群的大小。在这种情况下，您可以通过缩小节点来降低成本。

**注意**  
扩展和缩减过程依赖于使用新选择的节点类型创建集群并将新节点与先前节点同步。为确保秤 up/down 流畅无阻，请执行以下操作：  
确保您具有足够的 ENI（弹性网络接口）容量。如果要缩减，请确保较小的节点具有足够的内存来承受预期流量。  
有关内存管理的最佳实践，请参阅 [管理 Valkey 和 Redis OSS 的预留内存](redis-memory-management.md)。
虽然纵向扩展过程旨在保持完全在线，但它确实依赖于在旧节点和新节点之间同步数据。我们建议您在预期数据流量最小时启动扩展/缩减。
尽可能在生产前调试环境中测试扩展期间的应用程序行为。

**Contents**
+ [

## 在线纵向扩展
](#redis-cluster-vertical-scaling-scaling-up)
  + [

### 纵向扩展 Valkey 或 Redis OSS 集群（控制台）
](#redis-cluster-vertical-scaling-console)
  + [

### 纵向扩展 Valkey 或 Redis OSS 集群（Amazon CLI）
](#Scaling.RedisStandalone.ScaleUp.CLI)
  + [

### 扩展 Valkey 或 Redis OSS 集群 (API) ElastiCache
](#VeticalScaling.RedisReplGrps.ScaleUp.API)
+ [

## 在线缩减
](#redis-cluster-vertical-scaling-scaling-down)
  + [

### 纵向缩减 Valkey 或 Redis OSS 集群（控制台）
](#redis-cluster-vertical-scaling-down-console)
  + [

### 纵向缩减 Valkey 或 Redis OSS 集群（Amazon CLI）
](#Scaling.RedisStandalone.ScaleDown.CLI)
  + [

### 缩小 Valkey 或 Redis OSS 集群 (API) ElastiCache
](#Scaling.Vertical.ScaleDown.API)

## 在线纵向扩展
<a name="redis-cluster-vertical-scaling-scaling-up"></a>

**Topics**
+ [

### 纵向扩展 Valkey 或 Redis OSS 集群（控制台）
](#redis-cluster-vertical-scaling-console)
+ [

### 纵向扩展 Valkey 或 Redis OSS 集群（Amazon CLI）
](#Scaling.RedisStandalone.ScaleUp.CLI)
+ [

### 扩展 Valkey 或 Redis OSS 集群 (API) ElastiCache
](#VeticalScaling.RedisReplGrps.ScaleUp.API)

### 纵向扩展 Valkey 或 Redis OSS 集群（控制台）
<a name="redis-cluster-vertical-scaling-console"></a>

以下过程介绍如何使用 ElastiCache 管理控制台扩展 Valkey 或 Redis OSS 集群。在此过程中，集群将继续处理请求，且停机时间降至最短。

**纵向扩展 Valkey 或 Redis OSS 集群（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择 **Valkey 集群**或 **Redis OSS 集群**。

1. 从集群列表中，选择集群。

1. 选择 **Modify**(修改)。

1. 在 **Modify Cluster** 向导中：

   1. 从 **Node type** 列表中选择您希望扩展到的节点类型。要扩展，请选择大于现有节点的节点类型。

1. 如果您要立即执行扩展过程，请选中**立即应用**框。如果 **Apply immediately** 框处于未选中状态，则在此集群的下一维护时段内执行纵向扩展过程。

1. 选择 **Modify**(修改)。

   如果您在上一步选择了 **Apply immediately**，则集群的状态将变为 *modifying*。当状态变为 *available* 时，即表示修改完成，您可以开始使用新集群。

### 纵向扩展 Valkey 或 Redis OSS 集群（Amazon CLI）
<a name="Scaling.RedisStandalone.ScaleUp.CLI"></a>

以下过程介绍如何使用Amazon CLI纵向扩展 Valkey 或 Redis OSS 集群。在此过程中，集群将继续处理请求，且停机时间降至最短。

**纵向扩展 Valkey 或 Redis OSS 集群（Amazon CLI）**

1. 通过运行带有以下参数的Amazon CLI`list-allowed-node-type-modifications`命令来确定可以扩展到的节点类型。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache list-allowed-node-type-modifications \
   	    --replication-group-id my-replication-group-id
   ```

   对于 Windows：

   ```
   aws elasticache list-allowed-node-type-modifications ^
   	    --replication-group-id my-replication-group-id
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {
   	    "ScaleUpModifications": [
   	        "cache.m3.2xlarge", 
   	        "cache.m3.large", 
   	        "cache.m3.xlarge", 
   	        "cache.m4.10xlarge", 
   	        "cache.m4.2xlarge", 
   	        "cache.m4.4xlarge", 
   	        "cache.m4.large", 
   	        "cache.m4.xlarge", 
   	        "cache.r3.2xlarge", 
   	        "cache.r3.4xlarge", 
   	        "cache.r3.8xlarge", 
   	        "cache.r3.large", 
   	        "cache.r3.xlarge"
   	    ]
   	       "ScaleDownModifications": [
   	        "cache.t2.micro", 
   	        "cache.t2.small ", 
   	        "cache.t2.medium",
   	       	"cache.t1.small "
   	    ], 
   }
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [list-allowed-node-type-modifications](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-allowed-node-type-modifications.html)。

1. 使用Amazon CLI`modify-replication-group`命令和以下参数修改您的复制组以向上扩展到新的更大的节点类型。
   + `--replication-group-id` – 要纵向扩展到的复制组的名称。
   + `--cache-node-type` – 要扩展集群的新节点类型。此值必须是步骤 1 中由 `list-allowed-node-type-modifications` 命令返回的节点类型之一。
   + `--cache-parameter-group-name` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `--apply-immediately` – 使纵向扩展过程立即得到应用。要将纵向扩展流程推迟到此集群的下一维护时段，请使用 `--no-apply-immediately` 参数。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache modify-replication-group  \
   	    --replication-group-id my-redis-cluster \
   	    --cache-node-type cache.m3.xlarge \	    
   	    --apply-immediately
   ```

   对于 Windows：

   ```
   aws elasticache modify-replication-group ^
   	    --replication-group-id my-redis-cluster ^
   	    --cache-node-type cache.m3.xlarge ^	   
   	    --apply-immediately
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {
   		"ReplicationGroup": {
           "Status": "modifying",
           "Description": "my-redis-cluster",
           "NodeGroups": [
               {
                   "Status": "modifying",
                   "Slots": "0-16383",
                   "NodeGroupId": "0001",
                   "NodeGroupMembers": [
                       {
                           "PreferredAvailabilityZone": "us-east-1f",
                           "CacheNodeId": "0001",
                           "CacheClusterId": "my-redis-cluster-0001-001"
                       },
                       {
                           "PreferredAvailabilityZone": "us-east-1d",
                           "CacheNodeId": "0001",
                           "CacheClusterId": "my-redis-cluster-0001-002"
                       }
                   ]
               }
           ],
           "ConfigurationEndpoint": {
               "Port": 6379,
               "Address": "my-redis-cluster.r7gdfi.clustercfg.use1.cache.amazonaws.com"
           },
           "ClusterEnabled": true,
           "ReplicationGroupId": "my-redis-cluster",
           "SnapshotRetentionLimit": 1,
           "AutomaticFailover": "enabled",
           "SnapshotWindow": "07:30-08:30",
           "MemberClusters": [
               "my-redis-cluster-0001-001",
               "my-redis-cluster-0001-002"
           ],
           "CacheNodeType": "cache.m3.xlarge",
            "DataTiering": "disabled"
           "PendingModifiedValues": {}
       }
   }
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)。

1. 如果您使用了`--apply-immediately`，请使用带有以下参数的Amazon CLI`describe-cache-clusters`命令检查集群的状态。当状态变为 *available* 时，您便可开始使用较大的新集群节点。

### 扩展 Valkey 或 Redis OSS 集群 (API) ElastiCache
<a name="VeticalScaling.RedisReplGrps.ScaleUp.API"></a>

以下过程使用 ElastiCache API 将您的集群从当前节点类型扩展到新的更大的节点类型。在此过程中， ElastiCache 更新 DNS 条目，使其指向新节点。因此，您便不需要更新应用程序中的终端节点。对于 Valkey 7.2 及更高版本或 Redis OSS 5.0.5 及更高版本，您可以在该集群继续保持在线并处理传入请求时扩展启用失效转移的集群。在 Redis OSS 版本 4.0.10 及更低版本上，更新 DNS 条目时，您可能会发现先前版本上来自主节点的读取和写入短暂中断。

纵向扩展为较大的节点类型所需的时间因节点类型和当前集群中的数据量不同而异。

**扩展 Valkey 或 Redis OSS 缓存集群 (API) ElastiCache**

1. 使用带有以下参数的 ElastiCache API `ListAllowedNodeTypeModifications` 操作来确定可以扩展到哪些节点类型。
   + `ReplicationGroupId` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ListAllowedNodeTypeModifications
   	   &ReplicationGroupId=MyReplGroup
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ListAllowedNodeTypeModifications](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ListAllowedNodeTypeModifications.html)*中的。

1. 使用 `ModifyReplicationGroup` ElastiCache API 操作并使用以下参数将当前的复制组扩展到新的节点类型。
   + `ReplicationGroupId` – 复制组的名称。
   + `CacheNodeType` – 此复制组中集群的较大新节点类型。此值必须是上一步中由 `ListAllowedNodeTypeModifications` 操作返回的实例类型之一。
   + `CacheParameterGroupName` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `ApplyImmediately` – 设置为 `true` 可促使立即应用纵向扩展流程。要将扩展流程推迟到下一维护时段，请使用 `ApplyImmediately``=false`。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ModifyReplicationGroup
   	   &ApplyImmediately=true
   	   &CacheNodeType=cache.m3.2xlarge
   	   &CacheParameterGroupName=redis32-m3-2xl
   	   &ReplicationGroupId=myReplGroup
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20141201T220302Z
   	   &Version=2014-12-01
   	   &X-Amz-Algorithm=&AWS;4-HMAC-SHA256
   	   &X-Amz-Date=20141201T220302Z
   	   &X-Amz-SignedHeaders=Host
   	   &X-Amz-Expires=20141201T220302Z
   	   &X-Amz-Credential=<credential>
   	   &X-Amz-Signature=<signature>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)*中的。

1. 如果您使用了 `ApplyImmediately``=true`，请使用带有以下参数的 ElastiCache API `DescribeReplicationGroups` 操作监控复制组的状态。当状态从 *modifying* 变为 *available* 时，您便可开始写入已扩展的新复制组。
   + `ReplicationGroupId` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=DescribeReplicationGroups
   	   &ReplicationGroupId=MyReplGroup
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[DescribeReplicationGroups](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html)*中的。

## 在线缩减
<a name="redis-cluster-vertical-scaling-scaling-down"></a>

**Topics**
+ [

### 纵向缩减 Valkey 或 Redis OSS 集群（控制台）
](#redis-cluster-vertical-scaling-down-console)
+ [

### 纵向缩减 Valkey 或 Redis OSS 集群（Amazon CLI）
](#Scaling.RedisStandalone.ScaleDown.CLI)
+ [

### 缩小 Valkey 或 Redis OSS 集群 (API) ElastiCache
](#Scaling.Vertical.ScaleDown.API)

### 纵向缩减 Valkey 或 Redis OSS 集群（控制台）
<a name="redis-cluster-vertical-scaling-down-console"></a>

以下过程介绍如何使用 ElastiCache 管理控制台缩小 Valkey 或 Redis OSS 集群。在此过程中，您的 Valkey 或 Redis OSS 集群将继续处理请求，且停机时间降至最短。

**缩减 Valkey 或 Redis OSS 集群（控制台）**

1. 登录Amazon Web Services 管理控制台并打开 ElastiCache 控制台，网址为[ https://console.aws.amazon.com/elasticache/](https://console.amazonaws.cn/elasticache/)。

1. 在导航窗格中，选择 **Valkey 集群**或 **Redis OSS 集群**。

1. 从集群列表中，选择首选集群。

1. 选择 **Modify**(修改)。

1. 在 **Modify Cluster** 向导中：

   1. 从 **Node type** 列表中选择您希望扩展到的节点类型。要缩减，请选择小于现有节点的节点类型。请注意，并不是可缩减到所有节点类型。

1. 如果您要立即执行缩减过程，请选中**立即应用**框。如果**立即应用**框处于未选中状态，则在此集群的下一维护时段内执行缩减过程。

1. 选择 **Modify**(修改)。

   如果您在上一步选择了 **Apply immediately**，则集群的状态将变为 *modifying*。当状态变为 *available* 时，即表示修改完成，您可以开始使用新集群。

### 纵向缩减 Valkey 或 Redis OSS 集群（Amazon CLI）
<a name="Scaling.RedisStandalone.ScaleDown.CLI"></a>

以下过程介绍如何使用Amazon CLI纵向缩减 Valkey 或 Redis OSS 集群。在此过程中，集群将继续处理请求，且停机时间降至最短。

**纵向缩减 Valkey 或 Redis OSS 集群（Amazon CLI）**

1. 通过运行带有以下参数的Amazon CLI`list-allowed-node-type-modifications`命令来确定可以缩减到的节点类型。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache list-allowed-node-type-modifications \
   	    --replication-group-id my-replication-group-id
   ```

   对于 Windows：

   ```
   aws elasticache list-allowed-node-type-modifications ^
   	    --replication-group-id my-replication-group-id
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {
   	    "ScaleUpModifications": [
   	        "cache.m3.2xlarge", 
   	        "cache.m3.large", 
   	        "cache.m3.xlarge", 
   	        "cache.m4.10xlarge", 
   	        "cache.m4.2xlarge", 
   	        "cache.m4.4xlarge", 
   	        "cache.m4.large", 
   	        "cache.m4.xlarge", 
   	        "cache.r3.2xlarge", 
   	        "cache.r3.4xlarge", 
   	        "cache.r3.8xlarge", 
   	        "cache.r3.large", 
   	        "cache.r3.xlarge"
   	    ]
   	
   	       "ScaleDownModifications": [
   	        "cache.t2.micro", 
   	        "cache.t2.small ", 
   	        "cache.t2.medium ",
     	      "cache.t1.small"
   	    ]
   }
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [list-allowed-node-type-modifications](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-allowed-node-type-modifications.html)。

1. 使用Amazon CLI`modify-replication-group`命令和以下参数修改您的复制组以缩小到新的较小节点类型。
   + `--replication-group-id` – 要缩减到的复制组的名称。
   + `--cache-node-type` – 要扩展集群的新节点类型。此值必须是步骤 1 中由 `list-allowed-node-type-modifications` 命令返回的节点类型之一。
   + `--cache-parameter-group-name` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `--apply-immediately` – 使纵向扩展过程立即得到应用。要将收缩流程推迟到此集群的下一维护时段，请使用 `--no-apply-immediately` 参数。

   对于 Linux、macOS 或 Unix：

   ```
   aws elasticache modify-replication-group  \
   	    --replication-group-id my-redis-cluster \
   	    --cache-node-type cache.t2.micro \	    
   	    --apply-immediately
   ```

   对于 Windows：

   ```
   aws elasticache modify-replication-group ^
   	    --replication-group-id my-redis-cluster ^
   	    --cache-node-type cache.t2.micro ^	   
   	    --apply-immediately
   ```

   以上命令的输出类似于此处所示（JSON 格式）。

   ```
   {	
   		"ReplicationGroup": {
           "Status": "modifying",
           "Description": "my-redis-cluster",
           "NodeGroups": [
               {
                   "Status": "modifying",
                   "Slots": "0-16383",
                   "NodeGroupId": "0001",
                   "NodeGroupMembers": [
                       {
                           "PreferredAvailabilityZone": "us-east-1f",
                           "CacheNodeId": "0001",
                           "CacheClusterId": "my-redis-cluster-0001-001"
                       },
                       {
                           "PreferredAvailabilityZone": "us-east-1d",
                           "CacheNodeId": "0001",
                           "CacheClusterId": "my-redis-cluster-0001-002"
                       }
                   ]
               }
           ],
           "ConfigurationEndpoint": {
               "Port": 6379,
               "Address": "my-redis-cluster.r7gdfi.clustercfg.use1.cache.amazonaws.com"
           },
           "ClusterEnabled": true,
           "ReplicationGroupId": "my-redis-cluster",
           "SnapshotRetentionLimit": 1,
           "AutomaticFailover": "enabled",
           "SnapshotWindow": "07:30-08:30",
           "MemberClusters": [
               "my-redis-cluster-0001-001",
               "my-redis-cluster-0001-002"
           ],
           "CacheNodeType": "cache.t2.micro",
            "DataTiering": "disabled"
           "PendingModifiedValues": {}
       }
   }
   ```

   有关更多信息，请参阅 *Amazon CLI参考*中的 [modify-replication-group](https://docs.amazonaws.cn/cli/latest/reference/elasticache/modify-replication-group.html)。

1. 如果您使用了`--apply-immediately`，请使用带有以下参数的Amazon CLI`describe-cache-clusters`命令检查集群的状态。当状态变为 *available* 时，您便可开始使用较小的新集群节点。

### 缩小 Valkey 或 Redis OSS 集群 (API) ElastiCache
<a name="Scaling.Vertical.ScaleDown.API"></a>

以下过程使用 ElastiCache API 将您的复制组从其当前节点类型扩展到新的较小节点类型。在此过程中，您的 Valkey 或 Redis OSS 集群将继续处理请求，且停机时间降至最短。

缩减为较小的节点类型所需的时间因节点类型和当前集群中的数据量而异。

**缩小规模 (ElastiCache API)**

1. 使用带有以下参数的 ElastiCache API `ListAllowedNodeTypeModifications` 操作来确定可以缩减为哪些节点类型。
   + `ReplicationGroupId` – 复制组的名称。使用此参数可描述特定复制组而非所有复制组。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ListAllowedNodeTypeModifications
   	   &ReplicationGroupId=MyReplGroup
   	   &Version=2015-02-02
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20150202T192317Z
   	   &X-Amz-Credential=<credential>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ListAllowedNodeTypeModifications](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ListAllowedNodeTypeModifications.html)*中的。

1. 使用 `ModifyReplicationGroup` ElastiCache API 操作并使用以下参数将当前的复制组缩小到新的节点类型。
   + `ReplicationGroupId` – 复制组的名称。
   + `CacheNodeType` – 此复制组中集群的较小新节点类型。此值必须是上一步中由 `ListAllowedNodeTypeModifications` 操作返回的实例类型之一。
   + `CacheParameterGroupName` – [可选] 如果您使用 `reserved-memory` 管理集群的预留内存，则使用此参数。指定为您的新节点类型预留正确内存量的自定义缓存参数组。如果您在使用 `reserved-memory-percent`，则可以忽略此参数。
   + `ApplyImmediately` – 设置为 `true` 可促使立即应用缩减流程。要将缩减流程推迟到下一维护时段，请使用 `ApplyImmediately``=false`。

   ```
   https://elasticache.us-west-2.amazonaws.com/
   	   ?Action=ModifyReplicationGroup
   	   &ApplyImmediately=true
   	   &CacheNodeType=cache.t2.micro
   	   &CacheParameterGroupName=redis32-m3-2xl
   	   &ReplicationGroupId=myReplGroup
   	   &SignatureVersion=4
   	   &SignatureMethod=HmacSHA256
   	   &Timestamp=20141201T220302Z
   	   &Version=2014-12-01
   	   &X-Amz-Algorithm=&AWS;4-HMAC-SHA256
   	   &X-Amz-Date=20141201T220302Z
   	   &X-Amz-SignedHeaders=Host
   	   &X-Amz-Expires=20141201T220302Z
   	   &X-Amz-Credential=<credential>
   	   &X-Amz-Signature=<signature>
   ```

   有关更多信息，请参阅 *Amazon ElastiCache API 参考[ModifyReplicationGroup](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroup.html)*中的。

# 开始使用 Bloom 筛选条件
<a name="BloomFilters"></a>

ElastiCache 支持 Bloom filter 数据结构，它提供了一种节省空间的概率数据结构来检查元素是否是集合的成员。使用 Bloom 筛选条件时，可能会出现误报，即筛选条件可能会错误地表明某个元素存在，但其实该元素并未添加到集合中。不过，使用 Bloom 筛选条件可以防止*误报*，即错误地表明某个元素*不*存在，但其实该元素已添加到集合中。

通过调整误报率，您可以将潜在误报的百分比设置为工作负载的首选比率。您还可以配置容量（Bloom 筛选条件可以容纳的项目数量）、扩展和非扩展属性等。

使用受支持的引擎版本创建集群后，Bloom 数据类型和关联的命令将自动可用。`bloom` 数据类型与 Valkey 官方客户端库（包括 `valkey-py`、`valkey-java` 和 `valkey-go`）的 Bloom 筛选命令语法具有 API 兼容性。你可以轻松地将现有的基于 Bloom 的 Valkey 和 Redis OSS 应用程序迁移到。 ElastiCache有关命令的完整列表，请参阅[Bloom 筛选命令](#SupportedCommandsBloom)。

与 Bloom 相关的指标`BloomFilterBasedCmds``BloomFilterBasedCmdsLatency`、和`BloomFilterBasedCmdsECPUs`， CloudWatch 用于监控此数据类型的使用情况。有关更多信息，请参阅 [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)。

**注意**  
要使用 Bloom 过滤器，你必须在 ElastiCache Valkey 8.1 及更高版本上运行。
Bloom 数据类型与其他并非基于 Valkey 的 Bloom 产品不具有 RDB 兼容性。

## Bloom 筛选条件数据类型概述
<a name="BloomFilters.datatype"></a>

Bloom 筛选条件是一种空间利用率高的概率数据结构，允许添加元素和检查元素是否存在。如果筛选条件错误地表明某个元素存在，但其实该元素并未添加，则可能会出现误报。不过，Bloom 筛选条件可以保证不出现误报（错误地表明某个元素不存在，但其实该元素已添加）。

有关 Bloom 筛选条件文档的主要来源，请参阅 valkey.io 文档页面。这包含以下信息：
+ [Bloom 筛选条件的常见使用案例](https://valkey.io/topics/bloomfilters/#common-use-cases-for-bloom-filters)
  + 广告/事件重复数据删除
  + 欺诈侦测
  + 筛除有害内容/垃圾邮件
  + 唯一用户检测
+ [扩展和非扩展 Bloom 筛选条件之间的区别](https://valkey.io/topics/bloomfilters/#scaling-and-non-scaling-bloom-filters)
  + 如何在扩展和非扩展 Bloom 筛选条件进行选择
+ [Bloom 属性](https://valkey.io/topics/bloomfilters/#bloom-properties)
  + 了解 Bloom 筛选条件的可调整属性。这包括误报率、容量、扩展和非扩展属性等。
+ [Bloom 命令的性能](https://valkey.io/topics/bloomfilters/#performance)
+ [监控总体 Bloom 筛选条件统计信息](https://valkey.io/topics/bloomfilters/#monitoring)
+ [处理大型 Bloom 筛选条件](https://valkey.io/topics/bloomfilters/#handling-large-bloom-filters)
  + 有关如何检查 Bloom 筛选条件是否达到其内存使用限制以及能否扩展以达到所需容量的建议和详细信息。
  + 您可以使用 [BF.INFO](https://valkey.io/commands/bf.info/) 命令专门检查 Bloom 筛选条件文档所使用的内存量。

## Bloom 大小限制
<a name="BloomFilters.size"></a>

单个 Bloom 筛选条件对象的内存使用上限为 128 MB。您可以使用 `BF.INFO <key> SIZE` 命令检查 Bloom 筛选条件所使用的内存量。

## 绽放 ACLs
<a name="BloomFilters.ACL"></a>

与现有的每数据类型类别（@string、@hash 等）类似，添加了一个新的类别 @bloom，以简化对 Bloom 命令和数据的访问管理。没有其他现有的 Valkey 或 Redis OSS 命令属于 @bloom 类别。

有 3 个现有的 ACL 类别已更新为包含新 Bloom 命令：@read、@write 和 @fast。下表指示 Bloom 命令到相应类别的映射。


| Bloom 命令 | @read | @write | @fast | @bloom | 
| --- | --- | --- | --- | --- | 
|  BF.ADD  |    |  y  |  y  |  y  | 
|  BF.CARD  |  y  |    |  y  |  y  | 
|  BF.EXISTS  |  y  |    |  y  |  y  | 
|  BF.INFO  |  y  |    |  y  |  y  | 
|  BF.INSERT  |    |  y  |  y  |  y  | 
|  BF.MADD  |    |  y  |  y  |  y  | 
|  BF.MEXISTS  |  y  |    |  y  |  y  | 
|  BF.RESERVE  |  y  |    |  y  |  y  | 

## Bloom 筛选条件相关指标
<a name="BloomFilters.Metrics"></a>

提供了以下与 bloom 数据结构相关的 CloudWatch 指标：


| CW 指标 | 单位 | 无服务器/基于节点 | 说明 | 
| --- | --- | --- | --- | 
|  BloomFilterBasedCmds  |  计数  |  二者  |  Bloom 筛选命令的总数，包括读取和写入命令。  | 
|  BloomFilterBasedCmdsLatency  |  微秒  |  自行管理  |  所有 Bloom 筛选命令的延迟，包括读取和写入命令。  | 
|  BloomFilterBasedCmdsECPUs  |  计数  |  Serverless  |  ECPUs 由所有 Bloom 过滤器命令消耗，包括读取和写入命令。  | 

## Bloom 筛选命令
<a name="SupportedCommandsBloom"></a>

[Bloom 筛选命令](https://valkey.io/commands/#bloom)记录在 [Valkey.io](https://valkey.io/) 网站上。每个命令页面都全面概述了 Bloom 命令，包括其语法、行为、返回值和潜在的错误条件。


| Name | 说明 | 
| --- | --- | 
| [BF.ADD](https://valkey.io/commands/bf.add/) |  向 Bloom 筛选条件添加单个项目。如果该筛选条件尚不存在，则将创建。  | 
| [BF.CARD](https://valkey.io/commands/bf.card/) | 返回 Bloom 筛选条件的基数。 | 
| [BF.EXISTS](https://valkey.io/commands/bf.exists/) | 确定 Bloom 筛选条件是否包含指定项目。  | 
| [BF.INFO](https://valkey.io/commands/bf.info/) | 返回特定 Bloom 筛选条件的使用信息和属性。 | 
| [BF.INSERT](https://valkey.io/commands/bf.insert/) | 创建包含 0 个或更多项目的 Bloom 筛选条件，或者向现有 Bloom 筛选条件添加项目。 | 
| [BF.MADD](https://valkey.io/commands/bf.madd/) | 向 Bloom 筛选条件添加一个或多个项目。 | 
| [BF.MEXISTS](https://valkey.io/commands/bf.mexists/) | 确定 Bloom 筛选条件是否包含 1 个或多个项目。 | 
| [BF.RESERVE](https://valkey.io/commands/bf.reserve/) | 创建一个具有指定属性的空 Bloom 筛选条件。 | 

**注意**  
不支持 **BF.LOAD**。 ElastiCache它仅与 AOF 的使用有关，后者 ElastiCache 不支持。

# 无服务器版 Watch 入门
<a name="ServerlessWatch"></a>

ElastiCache 支持该`WATCH`命令，该命令允许您监视密钥的更改并执行条件[事务](https://valkey.io/topics/transactions/)。该`WATCH`命令对于需要乐观并发控制的应用程序特别有用，可确保只有在未修改监控密钥的情况下才会执行事务。这包括客户端所做的修改（例如写入命令）和 Valkey 本身所做的修改，例如到期或驱逐。如果从设置密钥之时起到收到密钥时`EXEC`已对其进行了修改，则整个事务都将中止。`WATCH`

对于 ElastiCache 无服务器，引入了以下限制- 

ElastiCache 无服务器的作用域`WATCH`仅限于单个哈希槽。这意味着只有映射到同一个哈希槽的密钥才能通过同一个连接同时被监视，而跟随监视命令的交易只能在同一个哈希槽上运行。当应用程序尝试监视来自不同哈希槽的密钥，或者执行对映射到与监视密钥不同的哈希槽的密钥进行操作的交易命令时，将返回`CROSSSLOT`错误。[哈希标签](https://valkey.io/topics/cluster-spec/#hash-tags)可用于确保多个密钥映射到同一个哈希槽。

此外，无法在带有监视键的连接内执行`SCAN`命令，并且会返回`command not supported during watch state`错误。

当 ElastiCache Serverless 不确定密钥是否被修改时，交易将被中止（就像触摸了监视的密钥一样）。例如，当一个插槽已迁移并且在同一个节点上找不到被监视的密钥时。

**代码示例**

## 观看和操作来自不同插槽的按键
<a name="w2aac24c33c15b1"></a>

在以下示例中，监视的密钥和`SET`命令中指定的密钥映射到不同的哈希槽。执行会返回 a `CROSSSLOT ERROR`。

```
> WATCH foo:{005119} 
OK 
> MULTI 
OK 
> SET bar:{011794} 1234 
QUEUED 
> EXEC 
CROSSSLOT Keys in request don't hash to the same slot
```

## 观看和操作同一插槽中的按键
<a name="w2aac24c33c15b3"></a>

以下示例显示了一笔成功的交易，因为中设置的密钥`WATCH`未更改。

```
> WATCH foo:{005119} 
OK 
> MULTI 
OK 
> SET bar:{005119} 1234 
QUEUED 
> EXEC 
1) OK
```

## 观看来自不同老虎机的按键
<a name="w2aac24c33c15b5"></a>

在以下示例中，如果尝试在同一个客户端连接中同时从不同的插槽中获取`WATCH`密钥，则会返回`CROSSSLOT ERROR`。

```
> WATCH foo:{005119} 
OK 
> WATCH bar:{123455}  
CROSSSLOT Keys in request don't hash to the same slot
```

## 观看限制
<a name="ServerlessWatch.size"></a>

每个客户端连接最多可以同时监视 1000 个密钥。

## 支持的与 Watch 相关的命令
<a name="SupportedCommandsWatch"></a>

[WATCH](https://valkey.io/commands/watch/) 和 [UNWATCH](https://valkey.io/commands/unwatch/) 命令记录在 [Valkey](https://valkey.io/) .io 网站上。它提供了命令的全面概述，包括其语法、行为、返回值和潜在的错误条件。

# 开始使用向量搜索
<a name="vector-search"></a>

Amazon for Valkey 支持矢量搜索，使您能够在内存中存储、搜索和更新数十亿个高维矢量嵌入，延迟低至微秒，召回率大 ElastiCache 于 99%。 ElastiCache for Valkey 提供了索引、搜索和更新来自亚马逊 Bedrock、Amazon、Anthropic 或 OpenAI 等热门提供商的数十亿个高维矢量嵌入的功能，便于快速搜索和检索。 SageMakerAmazon 的矢量搜索 ElastiCache 非常适合以峰值性能和可扩展性为最重要的选择标准的用例。这包括语义缓存、检索增强生成、实时推荐、个性化和异常检测。

矢量搜索可以与其他 ElastiCache 功能结合使用，以增强您的应用程序。在 Valk ElastiCache ey 版本 8.2 中，所有[Amazon区域中基于节点的集群均提供矢量搜索，无需支付](https://www.amazonaws.cn/about-aws/global-infrastructure/regional-product-services/)额外费用。首先，请使用、Amazon SDK 或Amazon CLI创建一个新的 Valkey 8.2 集群。[Amazon Web Services 管理控制台](https://console.amazonaws.cn/elasticache/)您还可以在现有集群上使用向量搜索，方法是从任一较旧版本的 Valkey 或 Redis OSS 升级到 Valkey 8.2，[只需单击几下，无需停机](VersionManagement.HowTo.md)。

# 向量搜索概述
<a name="vector-search-overview"></a>

ElastiCache for Valkey 提供了索引、搜索和更新数十亿个高维向量嵌入的功能。借助向量搜索功能，您可以创建、维护和使用二级索引，实现高效且可扩展的搜索。每个向量搜索操作都应用于单个索引。索引操作仅应用于指定的索引。除索引创建和删除操作外，任何索引在任何时候均可执行任意数量的操作。在集群级别，可以同时对多个索引执行多个操作。

在本文档中，术语“键”、“行”和“记录”的含义相同，可以互换使用。同样，术语“列”、“字段”、“路径”和“成员”也可以互换使用。

`FT.CREATE` 命令可用于为具有指定索引类型的键子集创建索引。`FT.SEARCH` 对创建的索引执行查询，而 `FT.DROPINDEX` 删除现有索引和所有关联数据。没有用于添加、删除或修改索引数据的特殊命令。使用现有的 `HASH` 或 `JSON` 命令对索引中的键进行修改会自动更新索引。

**Topics**
+ [

## 索引和 Valkey OSS 键空间
](#indexes-keyspace)
+ [

## 索引字段类型
](#index-field-types)
+ [

## 向量索引算法
](#vector-index-algorithms)
+ [

## 向量搜索安全
](#vector-search-security)

## 索引和 Valkey OSS 键空间
<a name="indexes-keyspace"></a>

在 Valkey OSS 键空间子集的基础上构造和维护索引。每个索引的键空间由创建索引时提供的键前缀列表定义。前缀列表是可选的，如果省略前缀列表，则整个键空间将成为该索引的一部分。多个索引可以不受限制地选择不相交或不重叠的键空间子集。

索引还具有类型，并且仅涵盖具有匹配类型的键。目前仅支持 `JSON` 和 `HASH` 类型的索引。`HASH` 索引仅为前缀列表所涵盖的 `HASH` 键编制索引，同样，`JSON` 索引仅为其前缀列表所涵盖的 `JSON` 键编制索引。在索引的键空间前缀列表中，未指定类型的键将被忽略，并且也不会影响搜索操作。

当命令修改索引键空间内的键时，该索引就会更新。Valkey 会自动提取每个索引的已声明字段，并使用新值更新索引。更新过程包含三个步骤。第一步，修改 HASH 或 JSON 键并阻止发出请求的客户端。第二步在后台执行，更新包含修改后的键的每个索引。第三步，取消阻止客户端。因此，对于在与变更相同的连接上执行的查询操作，该更改会立即反映在搜索结果中。

索引的创建是一个多步骤过程。第一步是执行定义索引的 FT.CREATE 命令。成功执行创建命令后会自动启动第二步：回填。回填过程在后台线程中运行，并会扫描键空间，查找位于新索引前缀列表中的键。找到的每个键都会添加到索引中。最终，整个键空间都会接受扫描，完成索引创建过程。请注意，在回填过程运行时，允许对索引键进行变更并且没有任何限制，索引回填过程只有在所有键都正确编制索引后才会完成。在索引回填时，不允许尝试查询操作，否则回填终止并显示错误。FT.INFO 命令在“backfill\$1status”字段中返回回填过程状态。

## 索引字段类型
<a name="index-field-types"></a>

每个索引都有创建索引时声明的特定类型以及要索引到的字段（列）的位置。对于 `HASH` 键，位置是 `HASH` 中的字段名称。对于 `JSON` 键，位置是 JSON 路径描述。修改键时，系统会提取与已声明字段关联的数据，将其转换为声明的类型并存储在索引中。如果数据丢失或无法成功转换为声明的类型，则该字段将从索引中省略。有三种类型的字段，如下所述：
+ **向量字段**包含一个数字向量，也称为向量嵌入。向量字段可用于根据指定的距离指标（用于衡量相似度）来筛选向量。对于 `HASH` 索引，该字段应包含以二进制格式（小端序 IEEE 754）编码的整个向量。对于 `JSON` 键，路径应引用大小正确且填充数字的数组。请注意，当将 JSON 数组用作向量字段时，JSON 键中数组的内部表示形式会转换为所选算法所需的格式，从而减少内存消耗和精度。使用 JSON 命令进行的后续读取操作所产生值的精度会降低。
+ **数值字段**包含一个数字。数值字段可以与范围搜索运算符搭配使用。对于 `HASH`，字段应包含以固定或浮点数标准格式编写的数值 ASCII 文本。对于 `JSON` 字段，必须遵守 JSON 数字规则。无论键内的表示形式如何，字段都将转换为在索引中存储的 64 位浮点数。基础数字以浮点数形式存储并且有精度限制，因此适用于浮点数比较的常用规则对于数值字段也适用。
+ **标签字段**包含零个或多个标签值，编码为单个 UTF-8 字符串。对于标签字段，可以在查询时对标签值进行筛选，并且可以选择区分大小写或不区分大小写。字符串解析为使用分隔符（默认为英文逗号，但可更改）分隔的标签值，并删除前导和尾随空格。单个标签字段中可以包含任意数量的标签值。

## 向量索引算法
<a name="vector-index-algorithms"></a>

Valkey 支持两种向量索引算法：
+ **Flat** – Flat 算法是对索引中每个向量进行暴力线性处理，提供距离计算精度范围内的精确答案。由于索引采用线性处理，因此对于大型索引，此算法的运行时间可能非常长。扁平索引支持更高的摄取速度。
+ **分层可导航小世界（HNSW）**：HNSW 算法是一种替代方案，它能够提供近似最近向量匹配结果，从而极大程度缩短执行时间。该算法由 `M`、`EF_CONSTRUCTION` 和 `EF_RUNTIME` 三个参数控制。前两个参数在创建索引时指定，无法更改。`EF_RUNTIME` 参数的默认值在创建索引时指定，但之后可以在任何单独的查询操作中更改。这三个参数相互作用，在摄取和查询操作期间平衡内存和 CPU 消耗，并控制精确 KNN 搜索近似值的质量（称为查准率）。

在 HNSW 中，参数 M 控制每个节点可以连接的最大邻居数量，从而调整索引密度。较高的 M（例如 32 及以上）会生成更联通的图，从而提高召回率和查询速度，因为有更多的路径可以到达相关邻居。但是，这会增加索引大小和内存占用量，并且会减慢索引速度。较低的 M（例如 8 及以下）产生的 faster-to-build索引较小，内存使用量较低，但由于连接较少，召回率会降低，查询可能需要更长的时间。

参数 EF\$1construction 定义在构建索引时要评估多少个候选连接。较高的 EF\$1construction（例如 400 及以上）意味着索引器在选择邻居之前会考虑更多路径，从而生成一个在后续操作中能同时提升召回率和查询效率的图，但在构造过程中会降低索引速度并且会增加 CPU 和内存使用量。较低的 EF\$1construction（例如 64-120）可以加快索引速度并减少资源使用量，但是生成的图也会降低召回率和查询速度，即使将 EF\$1runtime 设置的较高也是如此。

最后，EF\$1runtime 控制查询过程中的搜索范围，决定运行时探索的候选邻居数量。将该值设置得较高可提高召回率和准确率，但会增加查询延迟和 CPU 使用量。较低的 EF\$1runtime 可以使查询速度更快、更轻松，但召回率会降低。与 M 或 EF\$1construction 不同，此参数不会影响索引大小或构建时间，因此是在构建索引后在召回率和延迟之间取得平衡的理想调整参数。

两种向量搜索算法（Flat 和 HNSW）都支持可选的 `INITIAL_CAP` 参数。指定此参数时，它会为索引预先分配内存，从而减少内存管理开销并提高向量摄取速度。与 HNSW 相比，扁平索引支持更快的摄取速度。

类似于 HNSW 的向量搜索算法可能无法高效处理对先前插入向量的删除或覆盖。使用这些操作可能会导致索引内存消耗过多，从而 and/or 降低召回质量。重新索引是恢复最佳内存使用 and/or 回调的一种方法。

## 向量搜索安全
<a name="vector-search-security"></a>

[针对命令和数据访问的 Valkey ACL（访问控制列表）](https://valkey.io/topics/acl/)安全机制已扩展到控制搜索工具。系统完全支持针对单个搜索命令进行 ACL 控制。提供了一个新的 ACL 类别 `@search`，并更新了许多现有类别（`@fast`、`@read`、`@write` 等），以包含新命令。搜索命令不会修改键数据，这意味着将保留现有的 ACL 写入访问机制。`HASH` 和 `JSON` 操作的访问规则不因索引的存在而改变；这些命令仍然受到普通键级别访问控制的约束。

带索引的搜索命令也可以通过 ACL 进行访问控制。访问检查在整个索引级别执行，而不是在每个键级别执行。这意味着，只有当用户有权访问该索引键空间前缀列表中所有可能的键时，系统才会向该用户授予对该索引的访问权限。换句话说，索引的实际内容并不能控制访问权限。用于安全检查的是前缀列表定义的索引理论内容。可能出现用户对密钥具有读 and/or 写权限但无法访问包含该密钥的索引的情况。请注意，创建或使用索引只需要具有对键空间的读取访问权限，而不考虑是否有写入访问权限。

# 向量搜索功能和限制
<a name="vector-search-features-limits"></a>

## 向量搜索可用性
<a name="vector-search-availability"></a>

Amazon ElastiCache 的矢量搜索在 Valkey 版本 8.2 中可用，适用于所有Amazon区域的基于节点的集群，无需支付额外费用。您还可以在现有集群上使用向量搜索功能，方法是从任意版本的 Valkey 或 Redis OSS 升级到 Valkey 8.2，[只需单击几下，无需停机](VersionManagement.HowTo.md)。

目前，除具有数据分层的节点外，所有 ElastiCache 实例类型都可以使用矢量搜索。要在 t2、t3 和 t4g 实例上使用向量搜索功能，您需要将微型实例的内存预留增加到至少 50%，小型实例的内存预留至少增加到 30%。如需了解更多信息，请参阅[此页面](redis-memory-management.md)。

## 参数限制
<a name="parametric-restrictions"></a>

下表列出了各种向量搜索项目的限制：


**向量搜索限制**  

| Item | 最大值 | 
| --- | --- | 
| 向量中的维数 | 32768 | 
| 可以创建的索引数量 | 10 | 
| 索引中的字段数量 | 50 | 
| FT.SEARCH TIMEOUT 子句（毫秒） | 60000 | 
| 每个索引的最大前缀数量 | 16 | 
| 标签字段的最大长度 | 10000 | 
| 数值字段的最大长度 | 256 | 
| HNSW M 参数 | 2000000 | 
| HNSW EF\$1CONSTRUCTION 参数 | 4096 | 
| HNSW EF\$1RUNTIME 参数 | 4096 | 

## 操作限制
<a name="operational-restrictions"></a>

### 索引持久性和回填
<a name="index-persistence-backfilling"></a>

更新过程包含三个步骤。第一步，修改 HASH 或 JSON 键并阻止发出请求的客户端。第二步在后台执行，更新包含修改后的键的每个索引。第三步，取消阻止客户端。因此，对于在与变更相同的连接上执行的查询操作，该更改会立即反映在搜索结果中。但是，插入或更新键后，可能短时间内不会出现在其他客户端的搜索结果中。在系统负载繁重的时期，数据发生 and/or 大量突变，可见性延迟可能会变得更长。

向量搜索功能保留索引定义和索引内容。系统会保存向量字段的索引，但不会保存 TAGS 和 NUMERIC 的索引，这意味着系统在外部加载索引时必须重新构建索引（完全同步或重新加载）。这意味着，在任何会导致节点启动或重新启动的操作请求或事件中，将从最新快照中恢复索引定义和内容。无需用户执行任何操作即可启动此操作。但是，对于 TAGS 和 NUMERIC 索引，重建过程会在数据恢复后立即作为回填操作执行。这在功能上等同于系统自动为每个定义的索引执行 FT.CREATE 命令。请注意，数据恢复后，很可能在索引回填完成之前，节点便可用于应用程序操作，这意味着应用程序将再次看到回填操作。

索引回填的完成在主索引和副本之间不同步。应用程序可能会意外看到这种不同步的情况，因此建议应用程序在启动搜索操作之前，先在主副本和所有副本上验证回填完成情况。

### 扩展限制
<a name="scaling-limits"></a>

在扩展事件期间，随着数据的迁移，索引可能会被回填。这将降低搜索查询的召回率。

### 快照 import/export 和实时迁移
<a name="snapshot-import-export"></a>

可以将具有搜索索引的一个集群中的 RDB 文件导入到另一个版本为 8.2 或更高版本的 ElastiCache Valkey 集群。新集群将在加载 RDB 文件时重新构建索引内容。但是，RDB 文件中存在搜索索引会限制该数据与较旧 Valkey 版本的兼容性。由向量搜索功能定义的搜索索引的格式只能由另一个版本为 Valkey 8.2 或更高版本的 ElastiCache 集群理解。但是，不包含索引的 RDB 文件不受这种限制。

### 在回填期间内存不足
<a name="out-of-memory-backfill"></a>

与 Valkey OSS 写入操作类似，索引回填会受到限制。 out-of-memory如果引擎内存在回填过程中已满，则所有回填都将暂停。有可用内存后，回填过程会恢复。当由于内存不足导致回填暂停时，也可以删除索引。

### 事务
<a name="transactions"></a>

命令 `FT.CREATE`、`FT.DROPINDEX`、`FT.ALIASADD`、`FT.ALIASDEL` 和 `FT.ALIASUPDATE` 不能在事务上下文中执行，也就是说，不能在 `MULTI/EXEC` 数据块或者 LUA 或 FUNCTION 脚本中执行。

# 选择合适的配置
<a name="choosing-configuration"></a>

在控制台体验中， ElastiCache 提供了一种根据矢量工作负载的内存和 CPU 要求选择正确的实例类型的简便方法。

## 内存消耗
<a name="memory-consumption"></a>

内存消耗基于向量数、维度数、M 值和非向量数据量，例如与向量关联的元数据或实例中存储的其他数据。所需的总存储空间是实际向量数据所需空间和向量索引所需空间的组合。计算向量数据所需空间时，需要测量在 `HASH` 或 `JSON` 数据结构中存储向量所需的实际容量，以及为实现优化内存分配而需向最近的内存块增加的额外开销。每个向量索引都使用对存储在这些数据结构中的向量数据的引用，以及索引中向量的附加副本。建议为索引占用的额外空间做好计划。

向量的数量取决于您将数据表示为向量的方式。例如，您可以选择将单个文档表示成几个块，其中每个块表示一个向量。或者，您可以选择将整个文档表示为单个向量。向量的维数取决于您选择的嵌入模型。例如，如果您选择使用Amazon泰坦嵌入模型，则维度数将为 1536。请注意，您应该测试该实例类型以确保它符合您的要求。

## 扩展工作负载
<a name="scaling-workload"></a>

向量搜索支持所有三种扩缩方法：水平、垂直和副本。在扩缩容量时，向量搜索的行为就像常规 Valkey 一样，也就是说，增加单个节点的内存（垂直扩缩）或增加节点数量（水平扩缩）将增加整体容量。在集群模式下，可以将 `FT.CREATE` 命令发送到集群的任何主节点，系统会自动将新的索引定义分发给所有集群成员。

但是，从性能的角度来看，向量搜索的行为与常规 Valkey 截然不同。矢量搜索的多线程实现意味着查询吞吐 CPUs 量和摄取吞吐量都将呈线性增长。水平扩缩会使摄取吞吐量实现线性增长，但可能会降低查询吞吐量。如果需要额外的查询吞吐量，则需要通过副本或其他副本进行扩展。 CPUs 

# 向量搜索命令
<a name="vector-search-commands"></a>

以下是受支持的向量搜索命令列表。

**Topics**
+ [

# FT.CREATE
](vector-search-commands-ft.create.md)
+ [

# FT.SEARCH
](vector-search-commands-ft.search.md)
+ [

# FT.DROPINDEX
](vector-search-commands-ft.dropindex.md)
+ [

# FT.INFO
](vector-search-commands-ft.info.md)
+ [

# FT.\$1LIST
](vector-search-commands-ft.list.md)

# FT.CREATE
<a name="vector-search-commands-ft.create"></a>

`FT.CREATE` 命令创建一个空索引并启动回填过程。每个索引都由许多字段定义组成。每个字段定义都指定字段名称、字段类型以及在每个索引键内用于查找声明的类型值的路径。某些字段类型定义还有其他子类型说明符。

对于 HASH 键上的索引，路径与哈希成员名称相同。如果需要，可选 `AS` 子句可用于对字段进行重命名。当成员名包含特殊字符时，对字段进行重命名特别有用。

对于 JSON 键上的索引，路径是指向声明的类型数据的 JSON 路径。由于 JSON 路径总是包含特殊字符，因此 `AS` 子句是必需的。

**语法**

```
FT.CREATE <index-name>
ON HASH | JSON
[PREFIX <count> <prefix1> [<prefix2>...]]
SCHEMA 
(<field-identifier> [AS <alias>] 
| VECTOR [HNSW|FLAT] <attr_count> [<attribute_name> <attribute_value>])
| TAG [SEPARATOR <sep>] [CASESENSITIVE] 
| NUMERIC 
)+
```

**<index-name>（必填）：**这是您为索引指定的名称。如果已存在同名索引，则系统会返回错误。

**ON HASH \$1 JSON（可选）：**此索引中仅包含与指定类型匹配的键。如果省略，则假定为 HASH。

**PREFIX <prefix-count> <prefix>（可选）：**如果指定了此子句，则只有与一个或多个指定前缀相同的字节开头的键才会包含在此索引中。如果省略此子句，则将包括所有正确类型的键。零长度前缀也将匹配正确类型的所有键。

**字段类型：**
+ TAG：标签字段是一个包含一个或多个标签值的字符串。
  + SEPARATOR <sep>（可选）：用于分隔单个标签的字符（`,.<>{}[]"':;!@#$%^&*()-+=~`）之一。如果省略，则默认值为 `,`。
  + CASESENSITIVE（可选）：如果存在，则标签比较将区分大小写。默认情况下，标签比较不区分大小写。
+ NUMERIC：数值字段包含数字。
+ VECTOR：向量字段包含向量。目前支持两种向量索引算法：HNSW（分层可导航小世界）和 FLAT（暴力）。每种算法都有一组附加属性，有些是必填的，有些是可选的。
  + FLAT：Flat 算法可提供精确的答案，但其运行时与索引向量数量成正比，因此可能不适用于大型数据集。
    + DIM <number>（必填）：指定向量中的维度数。
    + 类型 FLOAT32 （必填）：数据类型，目前 FLOAT32 仅支持。
    + DISTANCE\$1METRIC [L2 \$1 IP \$1 COSINE]（必填）：指定距离算法。
    + INITIAL\$1CAP <size>（可选）：初始索引大小。
  + HNSW：HNSW 算法可提供近似的答案，但运行速度比 FLAT 快得多。
    + DIM <number>（必填）：指定向量中的维度数。
    + 类型 FLOAT32 （必填）：数据类型，目前 FLOAT32 仅支持。
    + DISTANCE\$1METRIC [L2 \$1 IP \$1 COSINE]（必填）：指定距离算法。
    + INITIAL\$1CAP <size>（可选）：初始索引大小。
    + M <number>（可选）：图中每层每个节点允许的最大出站边缘数量。在零层，出站边缘的最大数量为 2\$1M。默认值为 16，最大值为 512。
    + EF\$1CONSTRUCTION <number>（可选）：控制索引构造期间检查的向量数。此参数的值越大，查准率就越高，但索引创建时间也会越长。默认值为 200。最大值为 4096。
    + EF\$1RUNTIME <number>（可选）：控制查询操作期间要检查的向量数。默认值为 10，最大值为 4096。您可以为运行的每个查询设置此参数值。较高的值会增加查询所需时间，但会提高查询召回率。

**RESPONSE：**“OK”或者错误。

# FT.SEARCH
<a name="vector-search-commands-ft.search"></a>

对指定索引执行搜索。系统会返回与查询表达式匹配的键。

```
FT.SEARCH <index-name> <query>
[NOCONTENT]
[RETURN <token_count> (<field-identifier> [AS <alias>])+]
[TIMEOUT timeout] 
[PARAMS <count> <name> <value> [<name> <value>]]
[LIMIT <offset> <count>]
```
+ <index>（必填）：要查询的索引名称。
+ <query>（必填）：查询字符串，详情见下文。
+ NOCONTENT（可选）：如果存在，则仅返回生成的键名称，不包含任何键值。
+ TIMEOUT <timeout>（可选）：允许您为搜索命令设置超时值。该值必须是整数，以毫秒为单位。
+ PARAMS <count> <name1> <value1> <name2> <value2> ...（可选）：`count` 是参数的数量，即值名对数量的两倍。有关用法的详细信息，请参阅查询字符串。
+ RETURN <count> <field1> <field2> ...（可选）：计数是要返回的字段数量。指定要从文档中检索的字段，以及返回值的任何别名。默认情况下，系统会返回所有字段，除非设置了 NOCONTENT 选项，在这种情况下，系统不会返回任何字段。如果计数设置为“0”，则其行为与 NOCONTENT 相同。
+ LIMIT: <offset> <count>：让您能够选择结果的一部分。系统会跳过第一个 <offset> 键，最多只能包含 <count> 个键。默认值为“LIMIT 0 10”，最多返回 10 个键。
+ PARAMS：键值对数量的两倍。可以在查询表达式中引用参数 key/value 对。有关更多信息，请参阅[向量搜索查询表达式](https://docs.amazonaws.cn/memorydb/latest/devguide/vector-search-overview.html#vector-search-query-expression)。
+ DIALECT: <dialect>（可选）：指定方言。唯一支持的方言是 2。

**RESPONSE**

如果成功，该命令会返回数组，否则会返回错误。

成功后，响应数组中的第一个条目表示匹配键的数量，后面是每个匹配键的一个数组条目。请注意，如果指定 `LIMIT` 选项，它将仅控制返回的键的数量，不会影响第一个条目的值。

如果指定 `NOCONTENT`，则响应中的每个条目仅包含匹配的键名称。否则，每个条目都包含匹配的键名称，后面是返回的字段数组。密钥的结果字段由一组 name/value 对组成。第一 name/value 对用于计算的距离。该对名称由向量字段名称前缀“\$1\$1”、后缀“\$1score”构成，其值是计算出的距离。其余 name/value 对是该`RETURN`子句控制的密钥的成员和值。

查询字符串遵循以下语法：

```
<filtering>=>[ KNN <K> @<vector_field_name> $<vector_parameter_name> <query-modifiers> ]
```

其中：
+ <filtering>：是 \$1 或筛选表达式。\$1 表示不筛选，因此将搜索索引内的所有向量。您可以使用筛选表达式来指定要搜索的向量的子集。
+ <vector\$1field\$1name>：指定索引内向量字段的名称。
+ <K>：要返回的近邻向量的数量。
+ <vector\$1parameter\$1name>：PARAM 名称，其相应值为 KNN 算法提供查询向量。请注意，此参数必须以 little-endian 格式编码为 32 位 IEEE 754 二进制浮点数。
+ <query-modifiers>:（可选）修改此特定 KNN 搜索的 keyword/value 配对列表。当前，支持两个关键字：
  + EF\$1RUNTIME：此关键字附带一个整数值，该值将覆盖创建索引时指定的 EF\$1RUNTIME 的默认值。
  + AS：此关键字附带一个字符串值，该值将成为结果中分数字段的名称，覆盖默认的分数字段名称生成算法。

**筛选表达式**

筛选表达式是一个逻辑组合，由括号内的标签和数值搜索运算符构成。

**Tag**

标签搜索运算符使用一个或多个字符串来指定，这些字符串通过 \$1 字符分隔。如果指定的字段包含任何一个指定的字符串，则键将满足标签搜索运算符的要求。

```
@<field_name>:{<tag>}
or
@<field_name>:{<tag1> | <tag2>}
or
@<field_name>:{<tag1> | <tag2> | ...}
```

例如，以下查询将返回蓝色、黑色或绿色的文档。

`@color:{blue | black | green}`

再举一个例子，以下查询将返回包含“hello world”或“hello universe”的文档。

`@description:{hello world | hello universe}`

**数值范围**

数值范围运算符允许筛选查询，仅返回介于给定起始值和结束值之间的值。既支持包含范围查询，也支持排除范围查询。对于简单的关系比较，您可以将 \$1inf 和 -inf 与范围查询一起使用。范围搜索运算符的语法是：

```
@<field_name>:[ [(] <bound> [(] <bound>]
```

...其中 <bound> 要么是数字，要么是 \$1inf 或 -inf。包含没有前导左圆括号的边界值，排除有前导左圆括号的边界值。

参照下表，了解数学表达式与筛选查询的映射关系。

```
min <= field <= max         @field:[min max]
min < field <= max          @field:[(min max]
min <= field < max            @field:[min (max]
min < field < max            @field:[(min (max]
field >= min                @field:[min +inf]
field > min                    @field:[(min +inf]
field <= max                @field:[-inf max]
field < max                    @field:[-inf (max]
field == val                @field:[val val]
```

**逻辑运算符**

多个标签和数值搜索运算符可用于使用逻辑运算符来构造复杂的查询。

**逻辑和**

要设置逻辑 AND，请在谓词之间使用空格。例如：

`query1 query2 query3`

**逻辑或**

要设置逻辑 OR，请在谓词之间使用空格。例如：

`query1 | query2 | query3`

**逻辑否定**

对于任何查询，您都可以通过在其前面加上 `-` 字符来执行否定查询。否定查询会返回所有与查询不匹配的条目。这也包括没有相应字段的键。

例如，对 @genre:\$1comedy\$1 的否定查询将返回所有不是喜剧的书籍以及所有没有类型字段的书籍。

以下查询将返回所有属于“喜剧”类型且出版时间不在 2015 至 2024 年之间的书籍，或者没有年份字段“@genre:[comedy] -@year:[2015 2024]”的书籍。

**运算符优先顺序**

典型运算符优先顺序规则适用，即逻辑 NEGATE 是最高优先级，其次是逻辑 AND，然后是逻辑 OR（优先级最低）。要覆盖默认优先顺序规则，您可以使用圆括号。

*组合逻辑运算符的示例*

您可以组合逻辑运算符以组成复杂的筛选表达式。

以下查询将返回所有类型为“喜剧”或“恐怖”（且）出版时间在 2015 至 2024 年间的书籍：`@genre:[comedy|horror] @year:[2015 2024]`

以下查询将返回所有类型为“喜剧”或“恐怖”（或者）出版时间在 2015 至 2024 年间的书籍：`@genre:[comedy|horror] | @year:[2015 2024]`

以下查询将返回所有没有类型字段或类型字段不是“喜剧”且出版时间在 2015 年至 2024 年间的书籍：`-@genre:[comedy] @year:[2015 2024]`

# FT.DROPINDEX
<a name="vector-search-commands-ft.dropindex"></a>

**语法**

```
FT.DROPINDEX <index-name>
```

指定的索引已删除。如果索引不存在，系统会返回“OK”或错误。
+ <index-name>（必填）：要删除的索引的名称。

# FT.INFO
<a name="vector-search-commands-ft.info"></a>

**语法**

```
FT.INFO <index-name>
```

向量搜索对 [FT.INFO](https://valkey.io/commands/info/) 命令进行了补充，增加了几个统计数据和计数器部分。请求检索 SEARCH 部分将检索以下所有统计数据：


| 键名称 | 值类型 | 说明 | 
| --- | --- | --- | 
| index\$1name | 字符串 | 索引的名称 | 
| index\$1options | 字符串 | 预留。当前设置为“0” | 
| index\$1definition | array | 有关这些数组元素的定义，请参见下文。 | 
| 属性 | 属性信息数组 | 该数组中每个已定义的属性都对应一个元素，有关属性信息定义，请参见下文。 | 
| num\$1docs | 整数 | 当前包含在索引中的键数 | 
| num\$1terms | 整数 | 预留。当前设置为“0”。 | 
| record\$1count | 整数 | 每个属性的“大小”字段的总和。 | 
| hash\$1indexing\$1failures | 整数 | 无法将属性转换为声明的属性类型的次数。尽管名称如此，但此字段也适用于 JSON 键。 | 
| backfill\$1in\$1progress | 整数 | 如果当前正在进行回填，则该值为“1”，否则为“0” | 
| backfill\$1percent\$1complete | 浮点数 | 回填完成率的估计值，范围介于 [0..1] 之间的小数 | 
| mutation\$1queue\$1size | 整数 | 等待更新索引的键数。 | 
| recent\$1mutations\$1queue\$1delay | 整数 | 索引更新的延迟估计值（秒）。若无更新正在进行，则该值为“0”。 | 
| 状态 | 字符串 | 回填状态：“ready”表示回填已成功完成。“backfill\$1in\$1progres”表示回填正在进行。“backfill\$1paused\$1by\$1oom”表示由于内存不足，回填已暂停。内存不足问题解决后，回填将继续进行。 | 

index\$1definition 结构是一个由 key/value 对组成的数组，定义为：


| 键名称 | 值类型 | 说明 | 
| --- | --- | --- | 
| key\$1type | 字符串 | 要么是字符串“JSON”，要么是字符串“HASH” | 
| prefixes | array | 数组中的每个元素均为索引的已定义前缀。如果在创建索引时未指定前缀，则此数组将有 0 个条目。 | 
| default\$1score | 字符串 | 预留。当前设置为“1” | 

属性信息：属性信息因类型而异。

数字属性：


| Key | 值类型 | 说明 | 
| --- | --- | --- | 
| identifier | 字符串 | 属性在键中的位置。哈希成员名称或 JSON 路径 | 
| 别名 | 字符串 | 查询描述中使用的属性的名称。 | 
| 类型 | 字符串 | 字符串“NUMERIC” | 
| size | 整数 | 此属性中具有有效数值的键的数量。 | 

标签属性：


| 键名称 | 值类型 | 说明 | 
| --- | --- | --- | 
| identifier | 字符串 | 属性在键中的位置。哈希成员名称或 JSON 路径 | 
| 别名 | 字符串 | 查询描述中使用的属性的名称。 | 
| 类型 | 字符串 | 字符串“TAG” | 
| SEPARATOR | 字符 | 创建索引时定义的分隔符 | 
| CASESENSITIVE | 不适用 | 此键没有关联值。仅当使用此选项创建属性时，它才会出现。 | 
| size | 整数 | 此属性中包含有效标签值的键的数量 | 

向量属性：


| 键名称 | 值类型 | 说明 | 
| --- | --- | --- | 
| identifier | 字符串 | 属性在键中的位置。哈希成员名称或 JSON 路径 | 
| 别名 | 字符串 | 查询描述中使用的属性的名称。 | 
| 类型 | 字符串 | 字符串“VECTOR” | 
| 索引 | 字符 | 有关向量索引的进一步说明，请参见下文。 | 

向量索引描述：


| 键名称 | 值类型 | 说明 | 
| --- | --- | --- | 
| 容量 | 字符串 | 索引的当前容量 | 
| 维度 | 字符串 | 每个向量中的元素数量 | 
| distance\$1metric | 字符串 | 以下值之一：“COSINE”、“L2”或“IP” | 
| size | array  | 向量索引的描述，请参见下文。 | 
| data\$1type | 字符串 | 声明的数据类型。目前仅支持 FLOAT32 “”。 | 
| 算法 | array  | 向量搜索算法的进一步说明。 | 

FLAT 向量搜索算法描述：


| 键名称 | 值类型 | 说明 | 
| --- | --- | --- | 
| name | 字符串 | 算法名称：FLAT | 
| block\$1size | 数字 | FLAT 索引数据块的大小。 | 

HNSW 向量索引描述：


| 键名称 | 值类型 | 说明 | 
| --- | --- | --- | 
| name | 字符串 | 算法名称：HNSW | 
| m | 数字 | HNSW 的“M”参数 | 
| ef\$1construction | 数字 | HNSW 的“ef\$1construction”参数 | 
| ef\$1runtime | 数字 | HNSW 的“ef\$1runtime”参数。 | 

# FT.\$1LIST
<a name="vector-search-commands-ft.list"></a>

列出所有索引。

**语法**

```
FT._LIST 
```

返回一个字符串数组，这些字符串是当前定义的索引的名称。

# 开始使用 Valkey 和 Redis OSS 的 JSON
<a name="json-gs"></a>

ElastiCache 支持原生 JavaScript 对象表示法（JSON）格式，这是在 Valkey 和 Redis OSS 集群中对复杂数据集进行编码的一种简单的无架构方法。您可以使用 JavaScript 对象表示法（JSON）格式在集群中进行数据的本地存储和访问，并更新在这些集群中存储的 JSON 数据，无需管理自定义代码来对其进行序列化和反序列化。

除了对通过 JSON 运行的应用程序使用 Valkey 和 Redis OSS API 操作之外，您现在还可以有效地检索和更新 JSON 文档的特定部分，而无需对整个对象进行操作。这可以提高性能并降低成本。您还可以使用 [Goessner 样式的](https://goessner.net/articles/JsonPath/) `JSONPath` 查询来搜索您的 JSON 文档内容。

使用受支持的引擎版本创建集群后，JSON 数据类型和关联的命令将自动可用。这与版本 2 的 JSON 模块的 API 和 RDB 均兼容，因此您可以轻松地将现有的基于 JSON 的 Valkey 和 Redis OSS 应用程序迁移到 ElastiCache。有关受支持的命令的更多信息，请参阅 [支持的 Valkey 和 Redis OSS 命令JSON 命令](json-list-commands.md)。

与 JSON 相关的指标 `JsonBasedCmds` 和 `JsonBasedCmdsLatency` 合并到 CloudWatch 中，以监控此数据类型的使用情况。有关更多信息，请参阅 [Valkey 和 Redis OSS 指标](CacheMetrics.Redis.md)。

**注意**  
要使用 JSON，您必须运行 Valkey 7.2 和更高版本，或运行 Redis OSS 6.2.6 或更高版本。

**Topics**
+ [

# JSON 数据类型概述
](json-document-overview.md)
+ [

# 支持的 Valkey 和 Redis OSS 命令
](json-list-commands.md)

# JSON 数据类型概述
<a name="json-document-overview"></a>

ElastiCache 支持许多用于处理 JSON 数据类型的 Valkey 和 Redis OSS 命令。以下是 JSON 数据类型的概述和支持的命令的详细列表。

## 术语
<a name="json-terminology"></a>


****  

| 租期 | 描述 | 
| --- | --- | 
|  JSON 文档 | 引用 JSON 键的值。 | 
|  JSON 值 | 指 JSON 文档的子集，包括代表整个文档的根。值可以是容器或容器内的条目。 | 
|  JSON 元素 | 相当于 JSON 值。 | 

## 支持的 JSON 标准
<a name="Supported-JSON-Standard"></a>

JSON 格式符合 [RFC 7159](https://www.ietf.org/rfc/rfc7159.txt) 和 [ECMA-404](https://www.ietf.org/rfc/rfc7159.txt) JSON 数据交换标准。支持 JSON 文本中的 UTF-8 [Unicode](https://www.unicode.org/standard/WhatIsUnicode.html)。

## 根元素
<a name="json-root-element"></a>

根元素可以是任何 JSON 数据类型。请注意，在早期的 RFC 4627 中，只允许将对象或数组作为根值。自 RFC 7159 更新以来，JSON 文档的根目录可以是任何 JSON 数据类型。

## 文档大小限制
<a name="json-document-size-limit"></a>

JSON 文档以针对快速访问和修改而优化的格式在内部存储。此格式通常会导致比同一文档的等效序列化表示使用稍多的内存。

单个 JSON 文档的内存使用限制为 64 MB，这是内存中数据结构的大小，而不是 JSON 字符串的大小。您可以使用 `JSON.DEBUG MEMORY` 命令检查 JSON 文档所使用的内存量。

## JSON ACL
<a name="json-acls"></a>
+ 与现有的每数据类型类别（@string、@hash 等）类似，添加了一个新的类别 @json，以简化对 JSON 命令和数据的访问管理。没有其他现有的 Valkey 或 Redis OSS 命令属于 @json 类别。所有 JSON 命令均强制执行任何键空间或命令限制和权限。
+ 有五个现有的 Valkey 和 Redis OSS ACL 类别已更新为包含新 JSON 命令：@read、@write、@fast、@slow 和 @admin。下表指示 JSON 命令到相应类别的映射。


**ACL**  

| JSON 命令 | @read | @write | @fast | @slow | @admin | 
| --- | --- | --- | --- | --- | --- | 
|  JSON.ARRAPPEND |  | y | y |  |  | 
|  JSON.ARRINDEX | y |  | y |  |  | 
|  JSON.ARRINSERT |  | y | y |  |  | 
|  JSON.ARRLEN | y |  | y |  |  | 
|  JSON.ARRPOP |  | y | y |  |  | 
|  JSON.ARRTRIM |  | y | y |  |  | 
|  JSON.CLEAR |  | y | y |  |  | 
|  JSON.DEBUG | y |  |  | y | y | 
|  JSON.DEL |  | y | y |  |  | 
|  JSON.FORGET |  | y | y |  |  | 
|  JSON.GET | y |  | y |  |  | 
|  JSON.MGET | y |  | y |  |  | 
|  JSON.NUMINCRBY |  | y | y |  |  | 
|  JSON.NUMMULTBY |  | y | y |  |  | 
|  JSON.OBJKEYS | y |  | y |  |  | 
|  JSON.OBJLEN | y |  | y |  |  | 
|  JSON.RESP | y |  | y |  |  | 
|  JSON.SET |  | y |  | y |  | 
|  JSON.STRAPPEND |  | y | y |  |  | 
|  JSON.STRLEN | y |  | y |  |  | 
|  JSON.STRLEN | y |  | y |  |  | 
|  JSON.TOGGLE |  | y | y |  |  | 
|  JSON.TYPE | y |  | y |  |  | 
|  JSON.NUMINCRBY |  | y | y |  |  | 

## 嵌套深度限制
<a name="json-nesting-depth-limit"></a>

当 JSON 对象或数组有一个元素本身就是其他 JSON 对象或数组时，该内部对象或数组被称为“嵌套”在外部对象或数组中。最大嵌套深度上限为 128。任何创建包含嵌套深度大于 128 的文档的尝试都将被拒绝，并出现错误。

## 命令语法
<a name="json-command-syntax"></a>

大多数命令均要求将键名称作为第一个参数。某些命令还带有一个路径参数。如果该路径参数是可选的且未提供，则默认为根目录。

 表示法：
+ 必需的参数括在尖括号内。例如：<key>
+ 可选的参数括在方括号内。例如：[path]
+ 其他可选参数由省略号（“…”）来表示。例如：[json ...]

## 路径语法
<a name="json-path-syntax"></a>

Redis JSON 支持两种路径语法：
+ **增强的语法** – 遵循由 [Goessner](https://goessner.net/articles/JsonPath/) 描述的 JSONPath 语法，如下表所示。我们对表中的描述进行了重新排序和修改使其更加清楚。
+ **受限的语法** – 查询功能有限。

**注意**  
某些命令的结果对使用哪种类型的路径语法很敏感。

 如果查询路径以“\$1”开头，则使用的是增强的语法。否则使用的是受限的语法。

**增强的语法**


****  

| 符号/表达式 | 描述 | 
| --- | --- | 
|  \$1 | 根元素。 | 
|  . 或 [] | 子运算符。 | 
|  .. | 递归下降。 | 
|  \$1 | 通配符。对象或数组中的所有元素。 | 
|  [] | 数组下标运算符。索引从 0 开始。 | 
|  [,] | 联合运算符。 | 
|  [start:end:step] | 数组 Slice 运算符。 | 
|  ?() | 将筛选（脚本）表达式应用于当前的数组或对象。 | 
|  () | 筛选表达式。 | 
|  @ | 用于引用当前正在处理的节点的筛选表达式。 | 
|  == | 等于，用于筛选表达式。 | 
|  \$1= | 不等于，用于筛选表达式。 | 
|  > | 大于，用于筛选表达式。 | 
|  >= | 大于或等于，用于筛选表达式。 | 
|  < | 小于，用于筛选表达式。 | 
|  <= | 小于或等于，用于筛选表达式。 | 
|  && | 逻辑 AND，用于组合多个筛选表达式。 | 
|  \$1\$1 | L逻辑 OR，用于组合多个筛选表达式。 | 

**示例**

以下示例基于 [Goessner](https://goessner.net/articles/JsonPath/) 的示例 XML 数据而构建，我们已通过添加其他字段对数据进行了修改。

```
{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95,
        "in-stock": true,
        "sold": true
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99,
        "in-stock": false,
        "sold": true
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99,
        "in-stock": true,
        "sold": false
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99,
        "in-stock": false,
        "sold": false
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95,
      "in-stock": true,
      "sold": false
    }
  }
}
```


****  

| 路径 | 描述 | 
| --- | --- | 
|  \$1.store.book[\$1].author | 商店中所有书籍的作者。 | 
|  \$1..author | 所有作者。 | 
|  \$1.store.\$1 | 商店的所有成员。 | 
|  \$1["store"].\$1 | 商店的所有成员。 | 
|  \$1.store..price | 商店中所有商品的价格。 | 
|  \$1..\$1 | JSON 结构的所有递归成员。 | 
|  \$1..book[\$1] | 所有书籍。 | 
|  \$1..book[0] | 第一本书籍。 | 
|  \$1..book[-1] | 最后一本书籍。 | 
|  \$1..book[0:2] | 前两本书籍。 | 
|  \$1..book[0,1] | 前两本书籍。 | 
|  \$1..book[0:4] | 从索引 0 到 3 的书籍（不包括结尾索引）。 | 
|  \$1..book[0:4:2] | 索引为 0、2 的书籍。 | 
|  \$1..book[?(@.isbn)] | 所有带 ISBN 编号的书籍。 | 
|  \$1..book[?(@.price<10)] | 所有价格低于 10 美元的书籍。 | 
|  '\$1..book[?(@.price < 10)]' | 所有价格低于 10 美元的书籍。（如果路径包含空格，则必须用引号将其引起来。） | 
|  '\$1..book[?(@["price"]< 10)]' | 所有价格低于 10 美元的书籍。 | 
|  '\$1..book[?(@.["price"]< 10)]' | 所有价格低于 10 美元的书籍。 | 
|  \$1..book[?(@.price>=10&&@.price<=100)] | 所有价格在 10 美元到 100 美元之间（含 10 美元和 100 美元）的书籍。 | 
|  '\$1..book[?(@.price>=10 && @.price<=100)]' | 所有价格在 10 美元到 100 美元之间（含 10 美元和 100 美元）的书籍。（如果路径包含空格，则必须用引号将其引起来。） | 
|  \$1..book[?(@.sold==true\$1\$1@.in-stock==false)] | 所有书籍已售出或缺货。 | 
|  '\$1..book[?(@.sold == true \$1\$1 @.in-stock == false)]' | 所有书籍已售出或缺货。（如果路径包含空格，则必须用引号将其引起来。） | 
|  '\$1.store.book[?(@.["category"] == "fiction")]' | 所有小说类书籍。 | 
|  '\$1.store.book[?(@.["category"] \$1= "fiction")]' | 所有非小说类书籍。 | 

其他筛选表达式示例：

```
127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}'
OK
127.0.0.1:6379> JSON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)]
"[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]'
"[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]'
"[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]'
[{"price":15,"sold":false,"title":"abc"}]

127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]'
127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)]
"[3,4,5]"
127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]'
"[3,4,5]"

127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]'
OK
127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)]
"[true,true]"
127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]'
"[true,true]"
127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)]
"[2,3,4]"
127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]'
"[2,3,4]"
```

**受限的语法**


****  

| 符号/表达式 | 描述 | 
| --- | --- | 
|  . 或 [] | 子运算符。 | 
|  [] | 数组下标运算符。索引从 0 开始。 | 

**示例**


****  

| 路径 | 描述 | 
| --- | --- | 
|  .store.book[0].author | 第一本书籍的作者。 | 
|  .store.book[-1].author | 最后一本书籍的作者。 | 
|  .address.city | 城市名称。 | 
|  ["store"]["book"][0]["title"] | 第一本书籍的书名。 | 
|  ["store"]["book"][-1]["title"] | 最后一本书籍的书名。 | 

**注意**  
本文档中引用的所有 [Goessner](https://goessner.net/articles/JsonPath/) 内容均受[知识共享许可证](https://creativecommons.org/licenses/by/2.5/)的约束。

## 常见错误前缀
<a name="json-error-prefixes"></a>

每条错误消息均有一个前缀。以下是常见错误前缀的列表。


****  

| Prefix | 描述 | 
| --- | --- | 
|  ERR | 一般性错误。 | 
|  LIMIT | 超出大小限制时发生的错误。例如，超出了文档大小限制或嵌套深度限制。 | 
|  NONEXISTENT | 键或路径不存在。 | 
|  OUTOFBOUNDARIES | 数组索引超出界限。 | 
|  SYNTAXERR | 语法错误。 | 
|  WRONGTYPE | 错误的值类型。 | 

## JSON 相关指标
<a name="json-info-metrics"></a>

提供了以下 JSON 信息指标：


****  

| Info | 描述 | 
| --- | --- | 
|  json\$1total\$1memory\$1bytes | 分配给 JSON 对象的总内存。 | 
|  json\$1num\$1documents | Valkey 或 Redis OSS 中的文档总数。 | 

要查询核心指标，请运行以下命令：

```
info json_core_metrics
```

## ElastiCache for Valkey 和 ElastiCache for Redis OSS 如何与 JSON 交互
<a name="json-differences"></a>

以下部分介绍了 ElastiCache for Valkey 和 ElastiCache for Redis OSS 如何与 JSON 数据类型交互。

### 运算符优先顺序
<a name="json-operator-precedence"></a>

当评估条件表达式以进行筛选时，&& 优先评估，然后评估 \$1\$1，这一点在大多数语言中很常见。首先运行括号内的运算符。

### 最大路径嵌套限制行为
<a name="json-max-path"></a>

 ElastiCache for Redis OSS 中的最大路径嵌套限制为 128。因此，像 `$.a.b.c.d...` 这样的值只能达到 128 个级别。

### 处理数字值
<a name="json-about-numbers"></a>

JSON 没有针对整数和浮点数的单独数据类型。它们都被称为数字。

数字的表示形式：

当在输入时接收 JSON 数字时，它会转换为两种内部二进制表示之一：64 位有符号整数或 64 位 IEEE 双精度浮点。不保留原始字符串及其所有格式。因此，当数字作为 JSON 响应的一部分输出时，它会从内部二进制表示转换为使用通用格式规则的可打印字符串。这些规则可能会导致生成的字符串与收到的字符串不同。

算术命令 `NUMINCRBY` 和 `NUMMULTBY`：
+ 如果两个数字都是整数并且结果超出 `int64` 的范围，则它会自动变成一个 64 位 IEEE 双精度浮点数。
+ 如果至少有一个数字是浮点，则结果是 64 位 IEEE 双精度浮点数。
+ 如果结果超出 64 位 IEEE 双精度值的范围，则该命令将返回 `OVERFLOW` 错误。

有关可用命令的详细列表，请参阅 [支持的 Valkey 和 Redis OSS 命令JSON 命令](json-list-commands.md)。

### 直接数组筛选
<a name="json-direct-array-filtering"></a>

ElastiCache for Valkey 和 ElastiCache for Redis OSS 可直接筛选数组对象。

对于像 `[0,1,2,3,4,5,6]` 这样的数据和像 `$[?(@<4)]` 这样的路径查询，或者像 `{"my_key":[0,1,2,3,4,5,6]}` 这样的数据和像 `$.my_key[?(@<4)]` 这样的路径查询，在这两种情况下，ElastiCache 都会返回 [1,2,3]。

### 数组索引行为
<a name="json-direct-array-indexing"></a>

ElastiCache for Valkey 和 ElastiCache for Redis OSS 允许数组的正索引和负索引。对于长度为 5 的数组，0 将查询第一个元素，1 将查询第二个元素，依此类推。负数从数组的末尾开始，因此 -1 将查询第五个元素，-2 将查询第四个元素，依此类推。

为确保客户行为可预测，ElastiCache 不会向下或向上舍入数组索引，因此如果您有一个长度为 5 的数组，则调用索引 5 及更高或 -6 及更低将不会产生结果。

### 严格语法评估
<a name="json-strict-syntax-evaluation"></a>

MemoryDB 不允许使用无效语法的 JSON 路径，即使路径的子集包含有效路径也是如此。这是为了维护我们客户的正确行为。

# 支持的 Valkey 和 Redis OSS 命令
<a name="json-list-commands"></a>

ElastiCache 支持以下 Valkey 和 Redis OSS JSON 命令：

**Topics**
+ [

# JSON.ARRAPPEND
](json-arrappend.md)
+ [

# JSON.ARRINDEX
](json-arrindex.md)
+ [

# JSON.ARRINSERT
](json-arrinsert.md)
+ [

# JSON.ARRLEN
](json-arrlen.md)
+ [

# JSON.ARRPOP
](json-arrpop.md)
+ [

# JSON.ARRTRIM
](json-arrtrim.md)
+ [

# JSON.CLEAR
](json-clear.md)
+ [

# JSON.DEBUG
](json-debug.md)
+ [

# JSON.DEL
](json-del.md)
+ [

# JSON.FORGET
](json-forget.md)
+ [

# JSON.GET
](json-get.md)
+ [

# JSON.MGET
](json-mget.md)
+ [

# JSON.MSET
](json-mset.md)
+ [

# JSON.NUMINCRBY
](json-numincrby.md)
+ [

# JSON.NUMMULTBY
](json-nummultby.md)
+ [

# JSON.OBJLEN
](json-objlen.md)
+ [

# JSON.OBJKEYS
](json-objkeys.md)
+ [

# JSON.RESP
](json-resp.md)
+ [

# JSON.SET
](json-set.md)
+ [

# JSON.STRAPPEND
](json-strappend.md)
+ [

# JSON.STRLEN
](json-strlen.md)
+ [

# JSON.TOGGLE
](json-toggle.md)
+ [

# JSON.TYPE
](json-type.md)

# JSON.ARRAPPEND
<a name="json-arrappend"></a>

将一个或多个值附加到路径上的数组值。

语法

```
JSON.ARRAPPEND <key> <path> <json> [json ...]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。
+ json（必需）– 要附加到数组的 JSON 值。

**Return**

如果路径是增强的语法：
+ 表示每个路径处数组的新长度的整数数组。
+ 如果值不是数组，则其对应的返回值为 Null。
+ 如果路径不存在，则为 `NONEXISTENT` 错误。

如果路径是受限的语法：
+ 整数，该数组的新长度。
+ 如果选择了多个数组值，该命令将返回首次更新的数组的新长度。
+ 如果路径中的值不是数组，则为 `WRONGTYPE` 错误。
+ 如果输入 json 参数之一不是有效的 JSON 字符串，则为 `SYNTAXERR` 错误。
+ 如果路径不存在，则为 `NONEXISTENT` 错误。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 $[*] '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"a\",\"c\"],[\"a\",\"b\",\"c\"]]"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 [-1] '"c"'
(integer) 3
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"],[\"a\",\"b\",\"c\"]]"
```

# JSON.ARRINDEX
<a name="json-arrindex"></a>

搜索标量 JSON 值在路径的数组中的首次出现。
+ 超出范围错误的处理方法是将索引舍入到数组的开头和结尾。
+ 如果 start > end，则返回 -1（未找到）。

语法

```
JSON.ARRINDEX <key> <path> <json-scalar> [start [end]]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。
+ json-scalar（必需）- 要搜索的标量值。JSON 标量是指不是对象或数组的值。也就是说，字符串、数字、布尔值和 Null 是标量值。
+ start（可选）– 起始索引（含）。如果未提供，则默认为 0。
+ end（可选）– 结束索引（不含）。如果未提供，则默认为 0，这意味着包含最后一个元素。0 或 -1 意味着包含最后一个元素。

**Return**

如果路径是增强的语法：
+ 整数数组。每个值都是路径内数组中匹配元素的索引。如果未找到，则值为 -1。
+ 如果值不是数组，则其对应的返回值为 Null。

如果路径是受限的语法：
+ 整数、匹配元素的索引，如果未找到，则为 -1。
+ 如果路径中的值不是数组，则为 `WRONGTYPE` 错误。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 $[*] '"b"'
1) (integer) -1
2) (integer) -1
3) (integer) 1
4) (integer) 1
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 .children '"Tom"'
(integer) 2
```

# JSON.ARRINSERT
<a name="json-arrinsert"></a>

将一个或多个值插入到索引之前路径处的数组值中。

语法

```
JSON.ARRINSERT <key> <path> <index> <json> [json ...]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。
+ index（必需）– 在其前面插入值的数组索引。
+ json（必需）– 要附加到数组的 JSON 值。

**Return**

如果路径是增强的语法：
+ 表示每个路径处数组的新长度的整数数组。
+ 如果值为空数组，则其对应的返回值为 Null。
+ 如果值不是数组，则其对应的返回值为 Null。
+ 如果索引参数超出界限，则为 `OUTOFBOUNDARIES` 错误。

如果路径是受限的语法：
+ 整数，该数组的新长度。
+ 如果路径中的值不是数组，则为 `WRONGTYPE` 错误。
+ 如果索引参数超出界限，则为 `OUTOFBOUNDARIES` 错误。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 $[*] 0 '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"c\",\"a\"],[\"c\",\"a\",\"b\"]]"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 . 0 '"c"'
(integer) 4
127.0.0.1:6379> JSON.GET k1
"[\"c\",[],[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRLEN
<a name="json-arrlen"></a>

获取路径中数组值的长度。

语法

```
JSON.ARRLEN <key> [path] 
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**

如果路径是增强的语法：
+ 表示每个路径处数组长度的整数数组。
+ 如果值不是数组，则其对应的返回值为 Null。
+ 如果文档键不存在，则为 Null。

如果路径是受限的语法：
+ 整数，数组长度。
+ 如果选择了多个对象，该命令将返回第一个数组的长度。
+ 如果路径中的值不是数组，则为 `WRONGTYPE` 错误。
+ `NONEXISTENT JSON`如果路径不存在，则为 错误。
+ 如果文档键不存在，则为 Null。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRLEN k1 $[*]
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]'
OK
127.0.0.1:6379> JSON.ARRLEN k2 $[*]
1) (integer) 0
2) (nil)
3) (integer) 2
4) (integer) 3
5) (nil)
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]' 
OK 
127.0.0.1:6379> JSON.ARRLEN k1 [*] 
(integer) 0 
127.0.0.1:6379> JSON.ARRLEN k1 [1] 
(integer) 1 
127.0.0.1:6379> JSON.ARRLEN k1 [2] 
(integer) 2

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]' 
OK
127.0.0.1:6379> JSON.ARRLEN k2 [1] 
(error) WRONGTYPE JSON element is not an array 
127.0.0.1:6379> JSON.ARRLEN k2 [0] 
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k2 [6] 
(error) OUTOFBOUNDARIES Array index is out of bounds
127.0.0.1:6379> JSON.ARRLEN k2 a.b 
(error) NONEXISTENT JSON path does not exist
```

# JSON.ARRPOP
<a name="json-arrpop"></a>

从数组中删除并返回索引处的元素。弹出空数组会返回 Null。

语法

```
JSON.ARRPOP <key> [path [index]]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。
+ index（可选）– 数组中要开始弹出的位置。
  + 如果未提供，则默认为 -1，这表示最后一个元素。
  + 负值表示距离最后一个元素的位置。
  + 超出边界的索引会舍入到其各自的数组边界。

**Return**

如果路径是增强的语法：
+ 表示每个路径上弹出值的批量字符串数组。
+ 如果值为空数组，则其对应的返回值为 Null。
+ 如果值不是数组，则其对应的返回值为 Null。

如果路径是受限的语法：
+ 批量字符串，表示弹出的 JSON 值。
+ 如果数组为空，则为 Null。
+ 如果路径中的值不是数组，则为 `WRONGTYPE` 错误。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1 $[*]
1) (nil)
2) "\"a\""
3) "\"b\""
127.0.0.1:6379> JSON.GET k1
"[[],[],[\"a\"]]"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1
"[\"a\",\"b\"]"
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"]]"

127.0.0.1:6379> JSON.SET k2 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k2 . 0
"[]"
127.0.0.1:6379> JSON.GET k2
"[[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRTRIM
<a name="json-arrtrim"></a>

修剪路径处的数组，以便其成为子数组 [start、end]（两者均包括在内）。
+ 如果该数组为空，则不执行任何操作，返回 0。
+ 如果 start <0，则将其视为 0。
+ 如果 end >= size（数组的大小），则将其视为 size-1。
+ 如果 start >= size 或 start > end，则清空数组并返回 0。

语法

```
JSON.ARRTRIM <key> <path> <start> <end>
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。
+ start（必需）– 起始索引（含）。
+ end（必需）– 结束索引（含）。

**Return**

如果路径是增强的语法：
+ 表示每个路径处数组的新长度的整数数组。
+ 如果值为空数组，则其对应的返回值为 Null。
+ 如果值不是数组，则其对应的返回值为 Null。
+ 如果有索引参数超出界限，则为 `OUTOFBOUNDARIES` 错误。

如果路径是受限的语法：
+ 整数，该数组的新长度。
+ 如果数组为空，则为 Null。
+ 如果路径中的值不是数组，则为 `WRONGTYPE` 错误。
+ 如果有索引参数超出界限，则为 `OUTOFBOUNDARIES` 错误。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 $[*] 0 1
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 2
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"],[\"a\",\"b\"],[\"a\",\"b\"]]"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 .children 0 1
(integer) 2
127.0.0.1:6379> JSON.GET k1 .children
"[\"John\",\"Jack\"]"
```

# JSON.CLEAR
<a name="json-clear"></a>

清除路径中的数组或对象。

语法

```
JSON.CLEAR <key> [path]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**
+ 整数，已清除的容器数量。
+ 清除空数组或对象会导致清除 1 个容器。
+ 清除非容器值会返回 0。

** 示例**

```
127.0.0.1:6379> JSON.SET k1 . '[[], [0], [0,1], [0,1,2], 1, true, null, "d"]'
OK
127.0.0.1:6379>  JSON.CLEAR k1  $[*]
(integer) 7
127.0.0.1:6379> JSON.CLEAR k1  $[*]
(integer) 4
127.0.0.1:6379> JSON.SET k2 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.CLEAR k2 .children
(integer) 1
127.0.0.1:6379> JSON.GET k2 .children
"[]"
```

# JSON.DEBUG
<a name="json-debug"></a>

报告信息。支持的子命令有：
+ MEMORY <key> [path] – 报告 JSON 值的内存使用量（以字节为单位）。如果未提供，则路径默认为根目录。
+ FIELDS <key> [path] – 报告指定文档路径中的字段数。如果未提供，则路径默认为根目录。每个非容器 JSON 值均计为一个字段。对象和数组以递归方式为其包含的每个 JSON 值计数一个字段。除根容器外，每个容器值均计为一个额外字段。
+ HELP – 打印命令的帮助消息。

语法

```
JSON.DEBUG <subcommand & arguments>
```

取决于子命令：

MEMORY
+ 如果路径是增强的语法：
  + 返回一个整数数组，该数组表示每个路径处 JSON 值的内存大小（以字节为单位）。
  + 如果 Valkey 或 Redis OSS 键不存在，则返回空数组。
+ 如果路径是受限的语法：
  + 返回整数、内存大小和 JSON 值（以字节为单位）。
  + 如果 Valkey 或 Redis OSS 键不存在，则返回 Null。

FIELDS
+ 如果路径是增强的语法：
  + 返回一个整数数组，该数组表示每个路径中 JSON 值的字段数。
  + 如果 Valkey 或 Redis OSS 键不存在，则返回空数组。
+ 如果路径是受限的语法：
  + 返回一个整数，即 JSON 值的字段数。
  + 如果 Valkey 或 Redis OSS 键不存在，则返回 Null。

HELP – 返回一个帮助消息数组。

**示例**

增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, [], {"a":1, "b":2}, [1,2,3]]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1 $[*]
1) (integer) 16
2) (integer) 16
3) (integer) 19
4) (integer) 16
5) (integer) 16
6) (integer) 16
7) (integer) 16
8) (integer) 50
9) (integer) 64
127.0.0.1:6379> JSON.DEBUG FIELDS k1 $[*]
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 1
5) (integer) 1
6) (integer) 0
7) (integer) 0
8) (integer) 2
9) (integer) 3
```

受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1
(integer) 632
127.0.0.1:6379> JSON.DEBUG MEMORY k1 .phoneNumbers
(integer) 166

127.0.0.1:6379> JSON.DEBUG FIELDS k1
(integer) 19
127.0.0.1:6379> JSON.DEBUG FIELDS k1 .address
(integer) 4

127.0.0.1:6379> JSON.DEBUG HELP
1) JSON.DEBUG MEMORY <key> [path] - report memory size (bytes) of the JSON element. Path defaults to root if not provided.
2) JSON.DEBUG FIELDS <key> [path] - report number of fields in the JSON element. Path defaults to root if not provided.
3) JSON.DEBUG HELP - print help message.
```

# JSON.DEL
<a name="json-del"></a>

删除文档键中路径处的 JSON 值。如果路径是根目录，则相当于从 Valkey 或 Redis OSS 中删除键。

语法

```
JSON.DEL <key> [path]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**
+ 已删除元素的数量。
+ 如果 Valkey 或 Redis OSS 键不存在，则返回 0。
+ 如果 JSON 路径无效或不存在，则为 0。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 $.d.*
(integer) 3
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 $.e[*]
(integer) 5
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 .d.*
(integer) 3
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 .e[*]
(integer) 5
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

# JSON.FORGET
<a name="json-forget"></a>

[JSON.DEL](json-del.md) 的别名。

# JSON.GET
<a name="json-get"></a>

返回一个或多个路径的序列化 JSON。

语法

```
JSON.GET <key>
[INDENT indentation-string]
[NEWLINE newline-string]
[SPACE space-string]
[NOESCAPE]
[path ...]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ 缩进/换行/空格（可选）– 控制返回的 JSON 字符串的格式，也就是“漂亮的打印格式”。每个字符串的默认值均为空字符串。他们在任意组合中都可被覆盖。可以按任意顺序指定这些字符串。
+ NOESCAPE – 可选，允许存在以实现与旧版的兼容性，且没有其他影响。
+ path（可选）– 零个或多个 JSON 路径，如果没有给出，则默认为根目录。路径参数必须放在末尾。

**Return**

增强的路径语法：

 如果给出了一条路径：
+ 返回值数组的序列化字符串。
+ 如果未选择值，则此命令会返回一个空数组。

 如果给出了多条路径：
+ 返回一个字符串化的 JSON 对象，其中的每个路径都是一个键。
+ 如果混合了增强的路径语法和受限的路径语法，则结果符合增强的语法。
+ 如果路径不存在，则其相应的值为空数组。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 $.address.*
"[\"21 2nd Street\",\"New York\",\"NY\",\"10021-3100\"]"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" $.address.*
"[\n\t\"21 2nd Street\",\n\t\"New York\",\n\t\"NY\",\n\t\"10021-3100\"\n]"
127.0.0.1:6379> JSON.GET k1 $.firstName $.lastName $.age
"{\"$.firstName\":[\"John\"],\"$.lastName\":[\"Smith\"],\"$.age\":[27]}"            
127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}}'
OK
127.0.0.1:6379> json.get k2 $..*
"[{},{\"a\":1},{\"a\":1,\"b\":2},1,1,2]"
```

 受限的路径语法：

```
 127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 .address
"{\"street\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"zipcode\":\"10021-3100\"}"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" .address
"{\n\t\"street\": \"21 2nd Street\",\n\t\"city\": \"New York\",\n\t\"state\": \"NY\",\n\t\"zipcode\": \"10021-3100\"\n}"
127.0.0.1:6379> JSON.GET k1 .firstName .lastName .age
"{\".firstName\":\"John\",\".lastName\":\"Smith\",\".age\":27}"
```

# JSON.MGET
<a name="json-mget"></a>

从多个文档键获取路径的序列化 JSON。对于不存在的键或 JSON 路径，将返回 Null。

**语法**

```
JSON.MGET <key> [key ...] <path>
```
+ key（必需）– 一个或多个文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。

**Return**
+ 批量字符串数组。数组的大小等于命令中的键数。数组中的每个元素都填充有（a）由路径定位的序列化 JSON 或（b）如果键不存在、路径在文档中不存在或路径无效（语法错误），则填充 Null。
+ 如果存在任何指定的键且不是 JSON 键，该命令返回 `WRONGTYPE` 错误。

**示例**

增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK
127.0.0.1:6379> JSON.MGET k1 k2 k3 $.address.city
1) "[\"New York\"]"
2) "[\"Boston\"]"
3) "[\"Seattle\"]"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK

127.0.0.1:6379> JSON.MGET k1 k2 k3 .address.city
1) "\"New York\""
2) "\"Seattle\""
3) "\"Seattle\""
```

# JSON.MSET
<a name="json-mset"></a>

支持 Valkey 8.1 及更高版本。

为多个密钥设置 JSON 值。该操作属于原子操作，要么设置所有值，要么一个值都不设置。

**语法**

```
JSON.MSET key path json [ key path json ... ]
```
+ 如果路径调用对象成员：
  + 如果父元素不存在，该命令将返回 NONEXISTENT 错误。
  + 如果父元素存在但不是对象，该命令将返回 ERROR。
  + 如果父元素存在并且是对象：
    + 如果成员不存在，当且仅当父对象是路径中的最后一个子对象时，才会将新成员附加到父对象。否则，该命令将返回 NONEXISTENT 错误。
    + 如果成员存在，则其值将替换为 JSON 值。
+ 如果路径调用数组索引：
  + 如果父元素不存在，该命令将返回 NONEXISTENT 错误。
  + 如果父元素存在但不是数组，该命令将返回 ERROR。
  + 如果父元素存在但索引超出界限，该命令返回 OUTOFBOUNDARIES 错误。
  + 如果父元素存在且索引有效，该元素将被新的 JSON 值替换。
+ 如果路径调用对象或数组，该值（对象或数组）将被新的 JSON 值替换。

**Return**
+ 简单字符串回复：操作成功时返回“OK”。
+ 简单错误回复：操作失败时返回。

**示例**

增强的路径语法：

```
127.0.0.1:6379> JSON.MSET k1 . '[1,2,3,4,5]' k2 . '{"a":{"a":1, "b":2, "c":3}}' k3 . '{"a": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.GET k1
"[1,2,3,4,5]"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.MSET k2 $.a.* '0' k3 $.a[*] '0'
OK
127.0.0.1:6379> JSON.GET k2
"{\"a\":{\"a\":0,\"b\":0,\"c\":0}}"
127.0.0.1:6379> JSON.GET k3
"{\"a\":[0,0,0,0,0]}"
```

受限的路径语法：

```
127.0.0.1:6379> JSON.MSET k1 . '{"name": "John","address": {"street": "123 Main St","city": "Springfield"},"phones": ["555-1234","555-5678"]}'
OK
127.0.0.1:6379> JSON.MSET k1 .address.street '"21 2nd Street"' k1 .address.city '"New York"'
OK
127.0.0.1:6379> JSON.GET k1 .address.street
"\"21 2nd Street\""
127.0.0.1:6379> JSON.GET k1 .address.city
"\"New York\""
```

# JSON.NUMINCRBY
<a name="json-numincrby"></a>

将路径上的数字值增加给定的数字。

语法

```
JSON.NUMINCRBY <key> <path> <number>
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。
+ number（必填）– 一个数字。

**Return**

如果路径是增强的语法：
+ 表示每个路径的结果值的批量字符串数组。
+ 如果值不是数字，其对应的返回值为 Null。
+ 如果该数字无法解析，则为 `WRONGTYPE` 错误。
+ 如果结果超出 64 位 IEEE 双精度范围，则为 `OVERFLOW` 错误。
+ 如果文档键不存在，则为 `NONEXISTENT`。

如果路径是受限的语法：
+ 表示结果值的批量字符串。
+ 如果选择了多个值，该命令将返回上次更新值的结果。
+ 如果路径中的值不是数字，则为 `WRONGTYPE` 错误。
+ 如果该数字无法解析，则为 `WRONGTYPE` 错误。
+ 如果结果超出 64 位 IEEE 双精度范围，则为 `OVERFLOW` 错误。
+ 如果文档键不存在，则为 `NONEXISTENT`。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 10
"[11,12,13]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[11,12,13]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.a[*] 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.b[*] 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.c[*] 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 $.a.* 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.b.* 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.c.* 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.d.* 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 $.a.* 1
"[null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.b.* 1
"[null,2]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.c.* 1
"[null,null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.d.* 1
"[2,null,4]"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":4}}"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[1] 10
"12"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,12,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .a[*] 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k1 .b[*] 1
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .c[*] 1
"3"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[*] 1
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 .a.* 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k2 .b.* 1
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .c.* 1
"3"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .d.* 1
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 .a.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .b.* 1
"2"
127.0.0.1:6379> JSON.NUMINCRBY k3 .c.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .d.* 1
"4"
```

# JSON.NUMMULTBY
<a name="json-nummultby"></a>

将路径上的数值乘以给定的数字。

语法

```
JSON.NUMMULTBY <key> <path> <number>
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。
+ number（必填）– 一个数字。

**Return**

如果路径是增强的语法：
+ 表示每个路径的结果值的批量字符串数组。
+ 如果值不是数字，其对应的返回值为 Null。
+ 如果该数字无法解析，则为 `WRONGTYPE` 错误。
+ 如果结果超出某 64 位 IEEE 双精度浮点值的范围，则为 `OVERFLOW` 错误。
+ 如果文档键不存在，则为 `NONEXISTENT`。

如果路径是受限的语法：
+ 表示结果值的批量字符串。
+ 如果选择了多个值，该命令将返回上次更新值的结果。
+ 如果路径中的值不是数字，则为 `WRONGTYPE` 错误。
+ 如果该数字无法解析，则为 `WRONGTYPE` 错误。
+ 如果结果超出某 64 位 IEEE 双精度的范围，则为 `OVERFLOW` 错误。
+ 如果文档键不存在，则为 `NONEXISTENT`。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.a[*] 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.b[*] 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.c[*] 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 $.a.* 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.b.* 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.c.* 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.d.* 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 $.a.* 2
"[null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.b.* 2
"[null,2]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.c.* 2
"[null,null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.d.* 2
"[2,null,6]"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[1] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,4,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .a[*] 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k1 .b[*] 2
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .c[*] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[*] 2
"6"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 .a.* 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k2 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .c.* 2
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":2,\"b\":4,\"c\":6}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 .a.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":1,\"b\":\"b\",\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k3 .c.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":6}}"
```

# JSON.OBJLEN
<a name="json-objlen"></a>

获取路径对象值中的键数。

语法

```
JSON.OBJLEN <key> [path]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**

如果路径是增强的语法：
+ 表示每个路径的对象长度的整数数组。
+ 如果值不是对象，其对应的返回值为 Null。
+ 如果文档键不存在，则为 Null。

如果路径是受限的语法：
+ 整数，对象中的键数。
+ 如果选择了多个对象，该命令将返回第一个对象的长度。
+ 如果路径中的值不是对象，则为 `WRONGTYPE` 错误。
+ `NONEXISTENT JSON`如果路径不存在，则为 错误。
+ 如果文档键不存在，则为 Null。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 $.a
1) (integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 $.a.*
(empty array)
127.0.0.1:6379> JSON.OBJLEN k1 $.b
1) (integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 $.b.*
1) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.c
1) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.c.*
1) (nil)
2) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.d
1) (integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 $.d.*
1) (nil)
2) (nil)
3) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.*
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3
5) (nil)
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 .a
(integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 .a.*
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.OBJLEN k1 .b
(integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 .b.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .c
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .c.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .d
(integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 .d.*
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .*
(integer) 0
```

# JSON.OBJKEYS
<a name="json-objkeys"></a>

获取路径对象值中的键名。

语法

```
JSON.OBJKEYS <key> [path]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**

如果路径是增强的语法：
+ 批量字符串数组的数组。每个元素都是匹配对象中的键数组。
+ 如果值不是对象，其对应的返回值为空值。
+ 如果文档键不存在，则为 Null。

如果路径是受限的语法：
+ 批量字符串数组。每个元素都是对象中的键名称。
+ 如果选择了多个对象，该命令将返回第一个对象的键。
+ 如果路径中的值不是对象，则为 `WRONGTYPE` 错误。
+ 如果文档键不存在，则为 Null。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 $.*
1) (empty array)
2) 1) "a"
3) 1) "a"
   2) "b"
4) 1) "a"
   2) "b"
   3) "c"
5) (empty array)
127.0.0.1:6379> JSON.OBJKEYS k1 $.d
1) 1) "a"
   2) "b"
   3) "c"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 .*
1) "a"
127.0.0.1:6379> JSON.OBJKEYS k1 .d
1) "a"
2) "b"
3) "c"
```

# JSON.RESP
<a name="json-resp"></a>

返回 Valkey 或 Redis OSS 序列化协议（RESP）中给定路径的 JSON 值。如果值为容器，则响应为 RESP 数组或嵌套数组。
+ JSON 空值映射到 RESP Null 批量字符串。
+ JSON 布尔值映射到相应的 RESP 简单字符串。
+ 整数被映射到 RESP 整数。
+ 64 位 IEEE 双浮点数映射到 RESP 批量字符串。
+ JSON 字符串被映射到 RESP 批量字符串。
+ JSON 数组表示为 RESP 数组，其中第一个元素是简单字符串 [，然后是数组的元素。
+ JSON 对象表示为 RESP 数组，其中第一个元素是简单字符串 \$1，然后是键值对，每个键值对都是 RESP 批量字符串。

语法

```
JSON.RESP <key> [path]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**

如果路径是增强的语法：
+ 数组的数组。每个数组元素都代表一个路径上值的 RESP 形式。
+ 如果文档键不存在，则为空数组。

如果路径是受限的语法：
+ 表示路径中值的 RESP 形式的数组。
+ 如果文档键不存在，则为 Null。

**示例**

增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 $.address
1) 1) {
   2) 1) "street"
      2) "21 2nd Street"
   3) 1) "city"
      2) "New York"
   4) 1) "state"
      2) "NY"
   5) 1) "zipcode"
      2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.address.*
1) "21 2nd Street"
2) "New York"
3) "NY"
4) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers
1) 1) [
   2) 1) {
      2) 1) "type"
         2) "home"
      3) 1) "number"
         2) "555 555-1234"
   3) 1) {
      2) 1) "type"
         2) "office"
      3) 1) "number"
         2) "555 555-4567"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers[*]
1) 1) {
   2) 1) "type"
      2) "home"
   3) 1) "number"
      2) "212 555-1234"
2) 1) {
   2) 1) "type"
      2) "office"
   3) 1) "number"
      2) "555 555-4567"
```

受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 .address
1) {
2) 1) "street"
   2) "21 2nd Street"
3) 1) "city"
   2) "New York"
4) 1) "state"
   2) "NY"
5) 1) "zipcode"
   2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1
 1) {
 2) 1) "firstName"
    2) "John"
 3) 1) "lastName"
    2) "Smith"
 4) 1) "age"
    2) (integer) 27
 5) 1) "weight"
    2) "135.25"
 6) 1) "isAlive"
    2) true
 7) 1) "address"
    2) 1) {
       2) 1) "street"
          2) "21 2nd Street"
       3) 1) "city"
          2) "New York"
       4) 1) "state"
          2) "NY"
       5) 1) "zipcode"
          2) "10021-3100"
 8) 1) "phoneNumbers"
    2) 1) [
       2) 1) {
          2) 1) "type"
             2) "home"
          3) 1) "number"
             2) "212 555-1234"
       3) 1) {
          2) 1) "type"
             2) "office"
          3) 1) "number"
             2) "555 555-4567"
 9) 1) "children"
    2) 1) [
10) 1) "spouse"
    2) (nil)
```

# JSON.SET
<a name="json-set"></a>

在路径中设置 JSON 值。

如果路径调用对象成员：
+ 如果父元素不存在，该命令将返回 NONEXISTENT 错误。
+ 如果父元素存在但不是对象，该命令将返回 ERROR。
+ 如果父元素存在并且是对象：
  +  如果成员不存在，当且仅当父对象是路径中的最后一个子对象时，才会将新成员附加到父对象。否则，该命令返回 NONEXISTENT 错误。
  +  如果成员存在，则其值将替换为 JSON 值。

如果路径调用数组索引：
+ 如果父元素不存在，该命令将返回 NONEXISTENT 错误。
+ 如果父元素存在但不是数组，该命令将返回 ERROR。
+ 如果父元素存在但索引超出界限，该命令返回 OUTOFBOUNDARIES 错误。
+ 如果父元素存在且索引有效，该元素将被新的 JSON 值替换。

如果路径调用对象或数组，该值（对象或数组）将被新的 JSON 值替换。

语法

```
JSON.SET <key> <path> <json> [NX | XX] 
```

[NX \$1 XX]，其中您可以有 0 或 1 个 [NX \$1 XX] 标识符。
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（必需）– 一个 JSON 路径。对于新的键，JSON 路径必须是根目录“.”。
+ NX（可选）– 如果路径是根目录，仅在键不存在时设置该值。也就是插入新文档。如果路径不是根目录，仅在路径不存在时设置该值。也就是在文档中插入一个值。
+ XX（可选）– 如果路径是根目录，仅在键存在时设置该值。也就是替换现有文档。如果路径不是根目录，则仅在路径存在时设置该值。也就是更新现有值。

**Return**
+ 成功时使用简单字符串“OK”。
+ 如果未满足 NX 或 XX 条件，则为 Null。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.SET k1 $.a.* '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"a\":{\"a\":0,\"b\":0,\"c\":0}}"

127.0.0.1:6379> JSON.SET k2 . '{"a": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k2 $.a[*] '0'
OK
127.0.0.1:6379> JSON.GET k2
"{\"a\":[0,0,0,0,0]}"
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"c":{"a":1, "b":2}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k1 .c.a '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.SET k1 .e[-1] '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,0]}"
127.0.0.1:6379> JSON.SET k1 .e[5] '0'
(error) OUTOFBOUNDARIES Array index is out of bounds
```

# JSON.STRAPPEND
<a name="json-strappend"></a>

将字符串附加到路径的 JSON 字符串。

语法

```
JSON.STRAPPEND <key> [path] <json_string>
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。
+ json\$1string（必需）– 字符串的 JSON 表示。请注意，JSON 字符串必须用引号括起来。例如： '"string example"'。

**Return**

如果路径是增强的语法：
+ 表示每个路径字符串的新长度的整数数组。
+ 如果路径上的值不是字符串，其对应的返回值为 Null。
+ `SYNTAXERR` 如果输入 json 参数不是有效的 JSON 字符串，则为 错误。
+ `NONEXISTENT` 如果路径不存在，则为 错误。

如果路径是受限的语法：
+ 整数，该字符串的新长度。
+ 如果选择了多个字符串值，该命令将返回上次更新字符串的新长度。
+ 如果路径中的值不是字符串，则为 `WRONGTYPE` 错误。
+ 如果输入 json 参数不是有效的 JSON 字符串，则为 `WRONGTYPE` 错误。
+ `NONEXISTENT` 如果路径不存在，则为 错误。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.a '"a"'
1) (integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.* '"a"'
1) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.b.* '"a"'
1) (integer) 2
2) (nil)
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.* '"a"'
1) (integer) 2
2) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.b '"a"'
1) (integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 $.d.* '"a"'
1) (nil)
2) (integer) 2
3) (nil)
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 .a.a '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .a.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .b.* '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .c.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .c.b '"a"'
(integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 .d.* '"a"'
(integer) 2
```

# JSON.STRLEN
<a name="json-strlen"></a>

获取路径中 JSON 字符串值的长度。

语法

```
JSON.STRLEN <key> [path] 
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**

如果路径是增强的语法：
+ 表示每个路径的字符串值长度的整数数组。
+ 如果值不是字符串，其对应的返回值为 Null。
+ 如果文档键不存在，则为 Null。

如果路径是受限的语法：
+ 整数，该字符串的长度。
+ 如果选择了多个字符串值，该命令将返回第一个字符串的长度。
+ 如果路径中的值不是字符串，则为 `WRONGTYPE` 错误。
+ `NONEXISTENT`如果路径不存在，则为 错误。
+ 如果文档键不存在，则为 Null。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 $.a.a
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.a.*
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.c.*
1) (integer) 1
2) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.c.b
1) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.d.*
1) (nil)
2) (integer) 1
3) (nil)
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 .a.a
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .a.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.b
(integer) 2
127.0.0.1:6379> JSON.STRLEN k1 .d.*
(integer) 1
```

# JSON.TOGGLE
<a name="json-toggle"></a>

在路径的 true 和 false 之间切换布尔值。

语法

```
JSON.TOGGLE <key> [path] 
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**

如果路径是增强的语法：
+ 表示每个路径的结果布尔值的整数数组 (0 – false, 1 – true)。
+ 如果值不是布尔值，其对应的返回值为 Null。
+ 如果文档键不存在，则为 `NONEXISTENT`。

如果路径是受限的语法：
+ 表示结果布尔值的字符串 ("true"/"false")。
+ 如果文档键不存在，则为 `NONEXISTENT`。
+ 如果路径中的值不是布尔值，则为 `WRONGTYPE` 错误。

**示例**

 增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"a":true, "b":false, "c":1, "d":null, "e":"foo", "f":[], "g":{}}'
OK
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 0
2) (integer) 1
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 1
2) (integer) 0
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
```

 受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . true
OK
127.0.0.1:6379> JSON.TOGGLE k1
"false"
127.0.0.1:6379> JSON.TOGGLE k1
"true"

127.0.0.1:6379> JSON.SET k2 . '{"isAvailable": false}'
OK
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"true"
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"false"
```

# JSON.TYPE
<a name="json-type"></a>

报告给定路径的值类型。

语法

```
JSON.TYPE <key> [path]
```
+ key（必需）– JSON 文档类型的 Valkey 或 Redis OSS 键。
+ path（可选）– 一个 JSON 路径。如果未提供，则默认为根目录。

**Return**

如果路径是增强的语法：
+ 表示每个路径的值类型的字符串数组。类型为 \$1"null"、"boolean"、"string"、"number"、"integer"、"object" 和 "array"\$1 之一。
+ 如果路径不存在，则其相应的返回值为 Null。
+ 如果文档键不存在，则为空数组。

如果路径是受限的语法：
+ 字符串，值的类型
+ 如果文档键不存在，则为 Null。
+ 如果 JSON 路径无效或不存在，则为 Null。

**示例**

增强的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, []]'
OK
127.0.0.1:6379> JSON.TYPE k1 $[*]
1) integer
2) number
3) string
4) boolean
5) null
6) object
7) array
```

受限的路径语法：

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.TYPE k1
object
127.0.0.1:6379> JSON.TYPE k1 .children
array
127.0.0.1:6379> JSON.TYPE k1 .firstName
string
127.0.0.1:6379> JSON.TYPE k1 .age
integer
127.0.0.1:6379> JSON.TYPE k1 .weight
number
127.0.0.1:6379> JSON.TYPE k1 .isAlive
boolean
127.0.0.1:6379> JSON.TYPE k1 .spouse
null
```

# 为资源添加 ElastiCache 标签
<a name="Tagging-Resources"></a>

为了帮助您管理集群和其他 ElastiCache 资源，您可以以标签的形式为每个资源分配自己的元数据。标签使您能够以不同的方式对Amazon资源进行分类，例如按用途、所有者或环境进行分类。这在您具有相同类型的很多资源时会很有用 – 您可以根据分配给特定资源的标签快速识别该资源。本主题介绍标签并说明如何创建标签。

**警告**  
作为最佳实践，我们建议您不要在标签中包含敏感数据。

## 标签基本知识
<a name="Tagging-basics"></a>

标签是您分配给Amazon资源的标签。每个标签都包含定义的一个键和一个可选值。标签使您能够以不同的方式对Amazon资源进行分类，例如按用途或所有者进行分类。例如，您可以为账户的集 ElastiCache 群定义一组标签，以帮助您跟踪每个实例的所有者和用户组。

我们建议您针对每类资源设计一组标签，以满足您的需要。使用一组连续的标签键，管理 资源时会更加轻松。您可以根据添加的标签搜索和筛选资源。有关如何实施有效的资源标记策略的更多信息，请参阅 [Amazon白皮书标记最佳实践](https://d1.awsstatic.com/whitepapers/aws-tagging-best-practices.pdf)。

标签没有任何语义含义， ElastiCache 并且严格解释为字符串。同时，标签不会自动分配至您的资源。您可以修改标签的键和值，还可以随时删除资源的标签。您可以将标签的值设置为 `null`。如果添加的标签的键与该资源上现有标签的键相同，新值就会覆盖旧值。如果您删除资源，则该资源的所有标签也会被删除。此外，如果添加或删除复制组的标签，则也将向该复制组中的所有节点添加或删除其标签。

 您可以使用Amazon Web Services 管理控制台Amazon CLI、和 ElastiCache API 处理标签。

如果您使用的是 IAM，则可以控制Amazon账户中哪些用户有权创建、编辑或删除标签。有关更多信息，请参阅 [资源级权限](IAM.ResourceLevelPermissions.md)。

## 您可以为之添加标签的资源
<a name="Tagging-your-resources"></a>

您可以为账户中已存在的大多数 ElastiCache 资源添加标签。下表列出了支持标记的资源。如果您使用的是Amazon Web Services 管理控制台，则可以使用标签[编辑器对资源应用标签](https://docs.amazonaws.cn/ARG/latest/userguide/tag-editor.html)。在您创建资源时，某些资源屏幕支持为资源指定标签；例如，包含 Name 键和您指定的值的标签。在大多数情况下，控制台会在资源创建后 （而不是在资源创建期间）立即应用标签。控制台可以根据**名称**标签组织资源，但是此标签对 ElastiCache 服务没有任何语义意义。

 此外，某些资源创建操作让您可以在创建资源时为其指定标签。如果无法在资源创建期间应用标签，系统会回滚资源创建过程。这样可确保要么创建带有标签的资源，要么根本不创建资源，即任何时候都不会创建出未标记的资源。通过在创建时标记资源，您不需要在资源创建后运行自定义标记脚本。

 如果您使用的是亚马逊 ElastiCache API、Amazon CLI 或Amazon软件开发工具包，则可以使用相关 ElastiCache API 操作中的`Tags`参数来应用标签。它们是：
+ `CreateServerlessCache`
+ `CreateCacheCluster`
+ `CreateReplicationGroup`
+ `CopyServerlessCacheSnapshot`
+ `CopySnapshot`
+ `CreateCacheParameterGroup`
+ `CreateCacheSecurityGroup`
+ `CreateCacheSubnetGroup`
+ `CreateServerlessCacheSnapshot`
+ `CreateSnapshot`
+ `CreateUserGroup`
+ `CreateUser`
+ `PurchaseReservedCacheNodesOffering`

下表描述了可以标记的 ElastiCache 资源，以及可以使用 ElastiCache API、Amazon CLI 或Amazon SDK 在创建时标记的资源。


**为资源添加标签支持 ElastiCache**  

| 资源 | 支持标签 | 支持在创建时标记 | 
| --- | --- | --- | 
| serverlesscache | 支持 | 是 | 
| parametergroup | 支持 | 是 | 
| securitygroup | 支持 | 是 | 
| subnetgroup | 支持 | 是 | 
| replicationgroup | 支持 | 是 | 
| cluster | 支持 | 是 | 
| reserved-instance | 支持 | 是 | 
| serverlesscachesnapshot | 支持 | 是 | 
| 快照 | 支持 | 是 | 
| 用户 | 是 | 是 | 
| usergroup | 支持 | 是 | 

**注意**  
无法标记全局数据存储。

您可以将您的 IAM 策略中基于标签的资源级权限应用于支持在创建时添加标签的 ElastiCache API 操作，以实现对可以在创建时标记资源的用户和群组的精细控制。资源从创建开始就会受到适当的保护 – 标签会立即应用于资源。因此，控制资源使用的任何基于标签的资源级权限都会立即生效。可以更准确地对您的资源进行跟踪和报告。您可以强制对新资源使用标记，可以控制对资源设置哪些标签键和值。

有关更多信息，请参阅 [标记资源示例](#Tagging-your-resources-example)。

 有关标记资源以便于计费的更多信息，请参阅 [使用成本分配标签监控成本](Tagging.md)。

## 标记缓存和快照
<a name="Tagging-replication-groups-snapshots"></a>

以下规则适用于请求操作中的标记：
+ **CreateReplicationGroup**: 
  + 如果请求中包含 `--primary-cluster-id` 和 `--tags` 参数，则会向复制组添加请求标签且标签会传播到复制组中的所有集群。如果主集群具有现有标签，则这些标签将被请求标签覆盖，以便所有节点上的标签保持一直。

    如果没有请求标签，则主集群标记将添加到复制组并传播到所有集群。
  + 如果提供了 `--snapshot-name` 或 `--serverless-cache-snapshot-name`：

    如果请求中包含标签，则仅使用这些标签对复制组进行标记。如果请求中未包含任何标签，则快照标签将添加到复制组。
  + 如果提供了 `--global-replication-group-id`：

    如果请求中包含标签，则请求标签将添加到复制组并传播到所有集群。
+ **CreateCacheCluster** : 
  +  如果提供了 `--replication-group-id`：

    如果请求中包含标签，则仅使用这些标签对集群进行标记。如果请求中未包含任何标签，则集群将继承复制组标签，而不是主集群的标签。
  + 如果提供了 `--snapshot-name`：

    如果请求中包含标签，则仅使用这些标签对集群进行标记。如果请求中未包含任何标签，则将向集群添加快照标签。
+ **CreateServerlessCache** : 
  + 如果请求中包含标签，则仅将请求标签添加到无服务器缓存。
+ **CreateSnapshot** : 
  +  如果提供了 `--replication-group-id`：

    如果请求中包含标签，则仅将请求标签添加到快照。如果请求中未包含任何标签，则复制组标签将添加到快照。
  + 如果提供了 `--cache-cluster-id`：

    如果请求中包含标签，则仅将请求标签添加到快照。如果请求中未包含任何标签，则集群标签将添加到快照。
  + 自动快照：

    标签将传播自复制组标签。
+ **CreateServerlessCacheSnapshot** : 
  + 如果请求中包含标签，则仅将请求标签添加到无服务器缓存快照。
+ **CopySnapshot** : 
  + 如果请求中包含标签，则仅将请求标签添加到快照。如果请求中未包含任何标签，则源快照标签将添加到复制的快照。
+ **CopyServerlessCacheSnapshot** : 
  + 如果请求中包含标签，则仅将请求标签添加到无服务器缓存快照。
+ **AddTagsToResource**和 **RemoveTagsFromResource**：
  + 标签将 added/removed 来自复制组，操作将传播到复制组中的所有集群。
**注意**  
**AddTagsToResource**且**RemoveTagsFromResource**不能用于默认参数和安全组。
+ **IncreaseReplicaCount** 和 **ModifyReplicationGroupShardConfiguration**：
  + 对添加到复制组的所有新集群应用与复制组相同的标签。

## 标签限制
<a name="Tagging-restrictions"></a>

下面是适用于 标签的基本限制：
+ 每个资源的标签数上限：50
+ 对于每个资源，每个标签键必须是唯一的，并且每个标签键只能有一个值。
+ 最大键长度 – 128 个 Unicode 字符 （采用 UTF-8 格式)。
+ 最大值长度 – 256 个 Unicode 字符 （采用 UTF-8 格式)。
+ 尽管 ElastiCache 允许在其标签中使用任何字符，但其他服务可能会受到限制。允许在不同的服务中使用的字符包括：可以使用 UTF-8 表示的字母、数字和空格以及以下字符：\$1 - = . \$1 : / @
+ 标签键和值区分大小写。
+ 该`aws:`前缀已保留供Amazon使用。如果某个标签具有带有此标签键，则您无法编辑该标签的键或值。具有 `aws:` 前缀的标签不计入每个资源的标签数限制。

您不能仅依据标签终止或删除资源，而必须指定资源的标识符。例如，要删除您使用名为 `DeleteMe` 的标签键标记的快照，您必须将 `DeleteSnapshot` 操作与快照的资源标识符（如 `snap-1234567890abcdef0`）结合使用。

有关可以标记的 ElastiCache 资源的更多信息，请参阅[您可以为之添加标签的资源](#Tagging-your-resources)。

## 标记资源示例
<a name="Tagging-your-resources-example"></a>
+ 使用标签创建无服务器缓存。此示例使用 Memcached 作为引擎。

  ```
  aws elasticache create-serverless-cache \
      --serverless-cache-name CacheName \
      --engine memcached
      --tags Key="Cost Center", Value="1110001" Key="project",Value="XYZ"
  ```
+ 向无服务器缓存添加标签

  ```
  aws elasticache add-tags-to-resource \
  --resource-name arn:aws:elasticache:us-east-1:111111222233:serverlesscache:my-cache \
  --tags Key="project",Value="XYZ" Key="Elasticache",Value="Service"
  ```
+ 向复制组添加标签。

  ```
  aws elasticache add-tags-to-resource \
  --resource-name arn:aws:elasticache:us-east-1:111111222233:replicationgroup:my-rg \
  --tags Key="project",Value="XYZ" Key="Elasticache",Value="Service"
  ```
+ 使用标签创建缓存群集。

  ```
  aws elasticache create-cache-cluster \
  --cluster-id testing-tags \
  --cluster-description cluster-test \
  --cache-subnet-group-name test \
  --cache-node-type cache.t2.micro \
  --engine valkey \
  --tags Key="project",Value="XYZ" Key="Elasticache",Value="Service"
  ```
+ 使用标签创建缓存群集。此示例使用 Redis 作为引擎。

  ```
  aws elasticache create-cache-cluster \
  --cluster-id testing-tags \
  --cluster-description cluster-test \
  --cache-subnet-group-name test \
  --cache-node-type cache.t2.micro \
  --engine valkey \
  --tags Key="project",Value="XYZ" Key="Elasticache",Value="Service"
  ```
+ 创建具有标签的无服务器快照。此示例使用 Memcached 作为引擎。

  ```
  aws elasticache create-serverless-cache-snapshot \
  --serverless-cache-name testing-tags \
  --serverless-cache-snapshot-name bkp-testing-tags-scs \
  --tags Key="work",Value="foo"
  ```
+ 创建具有标签的快照。

  快照目前仅适用于 Redis。在此情况下，如果您根据请求添加标签，即使复制组包含标签，快照也将仅接收请求标签。

  ```
  aws elasticache create-snapshot \
  --replication-group-id testing-tags \
  --snapshot-name bkp-testing-tags-rg \
  --tags Key="work",Value="foo"
  ```

## 基于标签的访问控制策略示例
<a name="Tagging-access-control"></a>

1. 允许仅当集群具有 Project=XYZ 标签时才对该集群应用 `AddTagsToResource` 操作。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "elasticache:AddTagsToResource",
               "Resource": [
                   "arn:aws:elasticache:*:*:cluster:*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/Project": "XYZ"
                   }
               }
           }
       ]
   }
   ```

------

1. 当复制组包含 Project 和 Service 标签且密钥与 Project 和 Service 不同时，允许该复制组执行 `RemoveTagsFromResource` 操作。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "elasticache:RemoveTagsFromResource",
               "Resource": [
                   "arn:aws:elasticache:*:*:replicationgroup:*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/Service": "Elasticache",
                       "aws:ResourceTag/Project": "XYZ"
                   },                
                   "ForAnyValue:StringNotEqualsIgnoreCase": {
                       "aws:TagKeys": [
                           "Project",
                           "Service"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. 允许仅当标签与 Project 和 Service 不同时才能对任何资源应用 `AddTagsToResource`。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "elasticache:AddTagsToResource",
               "Resource": [
                   "arn:aws:elasticache:*:*:*:*"
               ],
               "Condition": {
                   "ForAnyValue:StringNotEqualsIgnoreCase": {
                       "aws:TagKeys": [ 
                           "Service", 
                           "Project" 
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. 在请求具有 `Tag Project=Foo` 时拒绝 `CreateReplicationGroup` 操作。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": "elasticache:CreateReplicationGroup",
               "Resource": [
                   "arn:aws:elasticache:*:*:replicationgroup:*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Project": "Foo"
                   }
               }
           }
       ]
   }
   ```

------

1. 在源快照具有 Project=XYZ 标签且请求标签为 Service=Elasticache 时拒绝 `CopySnapshot` 操作。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": "elasticache:CopySnapshot",
               "Resource": [
                   "arn:aws:elasticache:*:*:snapshot:*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceTag/Project": "XYZ",
                       "aws:RequestTag/Service": "Elasticache"
                   }
               }
           }
       ]
   }
   ```

------

1. 如果请求标签 `CreateCacheCluster` 丢失或不等于 `Project`、`Dev` 或 `QA`，则拒绝 `Prod` 操作。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
             {
               "Effect": "Allow",
               "Action": [
                   "elasticache:CreateCacheCluster"
               ],
               "Resource": [
                   "arn:aws:elasticache:*:*:parametergroup:*",
                   "arn:aws:elasticache:*:*:subnetgroup:*",
                   "arn:aws:elasticache:*:*:securitygroup:*",
                   "arn:aws:elasticache:*:*:replicationgroup:*"
               ]
           },
           {
               "Effect": "Deny",
               "Action": [
                   "elasticache:CreateCacheCluster"
               ],
               "Resource": [
                   "arn:aws:elasticache:*:*:cluster:*"
               ],
               "Condition": {
                   "Null": {
                       "aws:RequestTag/Project": "true"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": [
                   "elasticache:CreateCacheCluster",
                   "elasticache:AddTagsToResource"
               ],
               "Resource": "arn:aws:elasticache:*:*:cluster:*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Project": [
                           "Dev",
                           "Prod",
                           "QA"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

有关条件键的相关信息，请参阅[使用条件键](IAM.ConditionKeys.md)。

# 使用成本分配标签监控成本
<a name="Tagging"></a>

当您在 Amazon 中为资源添加成本分配标签时 ElastiCache，您可以通过按资源标签值对发票上的费用进行分组来跟踪成本。

 ElastiCache 成本分配标签是您定义并与资源关联的键值对。 ElastiCache 键和值区分大小写。您可以使用标签键定义类别，而标签值作为该类别中的项目。例如，通过定义标签键 `CostCenter` 和标签值 `10010`，可以表示将资源分配给 10010 成本中心。再如，通过为标签使用 `Environment` 键和 `test` 或 `production` 值，可以将资源指定为测试或生产用途。我们建议您使用一组一致的标签键，从而方便跟踪与资源相关联的成本。

使用成本分配标签来整理Amazon账单，以反映您自己的成本结构。为此，请注册以获取包含标签键值的Amazon账户账单。然后，如需查看组合资源的成本，请按有同样标签键值的资源组织您的账单信息。例如，您可以将特定的应用程序名称用作几个资源的标签，然后组织账单信息，以查看在数个服务中的使用该应用程序的总成本。

您也可以合并标签以采用更高详细信息级别跟踪成本。例如，要按区域跟踪服务成本，可以使用标签键 `Service` 和 `Region`。这样，一个资源的值可以有 `ElastiCache` 和 `Asia Pacific (Singapore)` 值，另一个资源可以有 `ElastiCache` 和 `Europe (Frankfurt)` 值。然后，您可以看到按地区细分的总 ElastiCache 成本。有关更多信息，请参阅《Amazon Billing用户指南》**中的[使用成本分配标签](https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。

您可以向 ElastiCache 基于节点的集群添加 ElastiCache 成本分配标签。在您添加、列出、修改、复制或删除标签时，操作仅应用到指定的集群。

**ElastiCache 成本分配标签的特征**
+ 成本分配标签适用于在 CLI 和 API 操作中指定为 ARN 的 ElastiCache 资源。资源类型将是“cluster”。

  示例 ARN：`arn:aws:elasticache:<region>:<customer-id>:<resource-type>:<resource-name>`

  示例 arn：`arn:aws:elasticache:us-west-2:1234567890:cluster:my-cluster`
+ 标签键是标签的名称，属于必填内容。键的字符串值的长度可以在 1 到 128 个 Unicode 字符之间，并且不能带有前缀 `aws:`。字符串只能包含一组 Unicode 字母、数字、空格、下划线（\$1）、句点（.）、冒号（:）、斜杠（\$1）、等号（=）、加号（\$1）、连字符（-）或 @ 符号。

   
+ 标签值是标签的可选值。值的字符串值的长度可以在 1 到 256 个 Unicode 字符之间，并且不能带有前缀 `aws:`。字符串只能包含一组 Unicode 字母、数字、空格、下划线（\$1）、句点（.）、冒号（:）、斜杠（\$1）、等号（=）、加号（\$1）、连字符（-）或 @ 符号。

   
+ 一个 ElastiCache 资源最多可以有 50 个标签。

   
+ 在标签集中，值不必具有唯一性。例如，在您的标签集内，键 `Service` 和 `Application` 可同时具有值 `ElastiCache`。

Amazon不会对您的标签应用任何语义含义。标签被严格解释为字符串。Amazon不会自动为任何 ElastiCache 资源设置任何标签。

# 使用 Amazon CLI 管理成本分配标签
<a name="Tagging.Managing.CLI"></a>

您可以使用 Amazon CLI 添加、修改或删除成本分配标签。

成本分配标签应用于 ElastiCache 集群。要添加标签的集群是使用 ARN（Amazon 资源名称）指定的。

示例 arn：`arn:aws:elasticache:us-west-2:1234567890:cluster:my-cluster`

**Topics**
+ [

## 使用 Amazon CLI 列出标签
](#Tagging.Managing.CLI.List)
+ [

## 使用 Amazon CLI 添加标签
](#Tagging.Managing.CLI.Add)
+ [

## 使用 Amazon CLI 修改标签
](#Tagging.Managing.CLI.Modify)
+ [

## 使用 Amazon CLI 删除标签
](#Tagging.Managing.CLI.Remove)

## 使用 Amazon CLI 列出标签
<a name="Tagging.Managing.CLI.List"></a>

您可以使用 Amazon CLI 通过 [list-tags-for-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-tags-for-resource.html) 操作列出现有 ElastiCache 资源上的标签。

以下代码使用 Amazon CLI 列出 us-west-2 区域中的 Memcached 集群 `my-cluster` 上的标签。

对于 Linux、macOS 或 Unix：

```
aws elasticache list-tags-for-resource \
  --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster
```

对于 Windows：

```
aws elasticache list-tags-for-resource ^
  --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster
```

以下代码使用 Amazon CLI 列出 us-west-2 区域中 `my-cluster-001` 集群中的 Valkey 或 Redis OSS 节点上的标签。

对于 Linux、macOS 或 Unix：

```
aws elasticache list-tags-for-resource \
  --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001
```

对于 Windows：

```
aws elasticache list-tags-for-resource ^
  --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001
```

此操作的输出类似于下文，即列出资源上的所有标签。

```
{
   "TagList": [
      {
         "Value": "10110",
         "Key": "CostCenter"
      },
      {
         "Value": "EC2",
         "Key": "Service"
      }
   ]
}
```

如果资源上没有任何标签，则输出空标签列表。

```
{
   "TagList": []
}
```

有关更多信息，请参阅适用于 ElastiCache 的 Amazon CLI ([list-tags-for-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/list-tags-for-resource.html))。

## 使用 Amazon CLI 添加标签
<a name="Tagging.Managing.CLI.Add"></a>

您可以使用 Amazon CLI 通过 [add-tags-to-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/add-tags-to-resource.html) CLI 操作向现有 ElastiCache 资源添加标签。如果资源上不存在标签键，则键和值将添加到资源。如果资源上已存在该键，则与该键关联的值将更新为新值。

下面的代码使用 Amazon CLI 向 us-west-2 区域中集群 `my-cluster` 的节点 `my-cluster-001` 添加键 `Service` 和 `Region`，这两个键的值分别为 `elasticache` 和 `us-west-2`。

**Memcached**

对于 Linux、macOS 或 Unix：

```
aws elasticache add-tags-to-resource \
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster \
 --tags Key=Service,Value=elasticache \
        Key=Region,Value=us-west-2
```

对于 Windows：

```
aws elasticache add-tags-to-resource ^
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster ^
 --tags Key=Service,Value=elasticache ^
        Key=Region,Value=us-west-2
```

** Redis**

对于 Linux、macOS 或 Unix：

```
aws elasticache add-tags-to-resource \
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001 \
 --tags Key=Service,Value=elasticache \
        Key=Region,Value=us-west-2
```

对于 Windows：

```
aws elasticache add-tags-to-resource ^
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001 ^
 --tags Key=Service,Value=elasticache ^
        Key=Region,Value=us-west-2
```

此操作的输出将类似于下文，先列出资源上的所有标签，后面跟随操作。

```
{
   "TagList": [
      {
         "Value": "elasticache",
         "Key": "Service"
      },
      {
         "Value": "us-west-2",
         "Key": "Region"
      }
   ]
}
```

有关更多信息，请参阅适用于 ElastiCache 的 Amazon CLI ([add-tags-to-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/add-tags-to-resource.html))。

还可以在创建新集群时使用 Amazon CLI 向集群添加标签，方法是使用操作 [create-cache-cluster](https://docs.amazonaws.cn/cli/latest/reference/elasticache/create-cache-cluster.html)。使用 ElastiCache 管理控制台创建集群时，您不能添加标签。创建集群之后，随后可以使用控制台向集群添加标签。

## 使用 Amazon CLI 修改标签
<a name="Tagging.Managing.CLI.Modify"></a>

您可以使用 Amazon CLI 修改 ElastiCache 集群上的标签。

修改标签：
+ 使用 [add-tags-to-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/add-tags-to-resource.html) 可添加新标签和值，或更改与现有标签关联的值。
+ 使用 [remove-tags-from-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/remove-tags-from-resource.html) 删除资源的指定标签。

以上任意操作的输出将是指定集群上标签及其值的列表。

## 使用 Amazon CLI 删除标签
<a name="Tagging.Managing.CLI.Remove"></a>

您可以使用 Amazon CLI 通过 [remove-tags-from-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/remove-tags-from-resource.html) 操作删除现有 ElastiCache for Memcached 集群的标签。

对于 Memcached，下面的代码使用 Amazon CLI 移除了 us-west-2 区域中集群 `my-cluster` 的节点 `my-cluster-001` 包含的键 `Service` 和 `Region` 的标签。

对于 Linux、macOS 或 Unix：

```
aws elasticache remove-tags-from-resource \
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster \
 --tag-keys PM Service
```

对于 Windows：

```
aws elasticache remove-tags-from-resource ^
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster ^
 --tag-keys PM Service
```

对于 Redis OSS，下面的代码使用 Amazon CLI 移除了 us-west-2 区域中集群 `my-cluster` 的节点 `my-cluster-001` 包含的键 `Service` 和 `Region` 的标签。

对于 Linux、macOS 或 Unix：

```
aws elasticache remove-tags-from-resource \
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001 \
 --tag-keys PM Service
```

对于 Windows：

```
aws elasticache remove-tags-from-resource ^
 --resource-name arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001 ^
 --tag-keys PM Service
```

此操作的输出将类似于下文，先列出资源上的所有标签，后面跟随操作。

```
{
   "TagList": []
}
```

有关更多信息，请参阅适用于 ElastiCache 的 Amazon CLI ([remove-tags-from-resource](https://docs.amazonaws.cn/cli/latest/reference/elasticache/remove-tags-from-resource.html))。

# 使用 ElastiCache API 管理成本分配标签
<a name="Tagging.Managing.API"></a>

您可以使用 ElastiCache API 添加、修改或删除成本分配标签。

成本分配标签应用到 ElastiCache for Memcached 集群。要添加标签的集群是使用 ARN（Amazon 资源名称）指定的。

示例 arn：`arn:aws:elasticache:us-west-2:1234567890:cluster:my-cluster`

**Topics**
+ [

## 使用 ElastiCache API 列出标签
](#Tagging.Managing.API.List)
+ [

## 使用 ElastiCache API 添加标签
](#Tagging.Managing.API.Add)
+ [

## 使用 ElastiCache API 修改标签
](#Tagging.Managing.API.Modify)
+ [

## 使用 ElastiCache API 删除标签
](#Tagging.Managing.API.Remove)

## 使用 ElastiCache API 列出标签
<a name="Tagging.Managing.API.List"></a>

您可以使用 ElastiCache API 通过 [ListTagsForResource](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_ListTagsForResource.html) 操作列出现有资源上的标签。

对于 Memcached，以下代码使用 ElastiCache API 列出 us-west-2 区域中 `my-cluster` 资源上的标签。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=ListTagsForResource
   &ResourceName=arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Version=2015-02-02
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

对于 Redis OSS，以下代码使用 ElastiCache API 列出 us-west-2 区域中 `my-cluster-001` 资源上的标签。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=ListTagsForResource
   &ResourceName=arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Version=2015-02-02
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

## 使用 ElastiCache API 添加标签
<a name="Tagging.Managing.API.Add"></a>

您可以使用 ElastiCache API 通过 [AddTagsToResource](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_AddTagsToResource.html) 操作向现有 ElastiCache 集群添加标签。如果资源上不存在标签键，则键和值将添加到资源。如果资源上已存在该键，则与该键关联的值将更新为新值。

以下代码使用 ElastiCache API 添加键 `Service` 和 `Region`，其值分别为 `elasticache` 和 `us-west-2`。对于 Memcached，这将应用于资源 `my-cluster`。对于 Redis OSS，这将应用于 us-west-2 区域中的资源 `my-cluster-001`。

**Memcached**

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=AddTagsToResource
   &ResourceName=arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Tags.member.1.Key=Service 
   &Tags.member.1.Value=elasticache
   &Tags.member.2.Key=Region
   &Tags.member.2.Value=us-west-2
   &Version=2015-02-02
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

** Redis**

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=AddTagsToResource
   &ResourceName=arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &Tags.member.1.Key=Service 
   &Tags.member.1.Value=elasticache
   &Tags.member.2.Key=Region
   &Tags.member.2.Value=us-west-2
   &Version=2015-02-02
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

有关更多信息，请参阅 *Amazon ElastiCache API 参考*中的 [AddTagsToResource](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_AddTagsToResource.html)。

## 使用 ElastiCache API 修改标签
<a name="Tagging.Managing.API.Modify"></a>

您可以使用 ElastiCache API 修改 ElastiCache 集群上的标签。

修改标签的值：
+ 使用 [AddTagsToResource](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_AddTagsToResource.html) 操作可添加新标签和值，或更改现有标签的值。
+ 使用 [RemoveTagsFromResource](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_RemoveTagsFromResource.html) 可删除资源的标签。

以上任意操作的输出将是指定资源上标签及其值的列表。

使用 [RemoveTagsFromResource](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_RemoveTagsFromResource.html) 可删除资源的标签。

## 使用 ElastiCache API 删除标签
<a name="Tagging.Managing.API.Remove"></a>

您可以使用 ElastiCache API 通过 [RemoveTagsFromResource](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_RemoveTagsFromResource.html) 操作删除现有 ElastiCache for Memcached 集群的标签。

以下代码使用 ElastiCache API 从 us-west-2 区域中集群 `my-cluster` 中的节点 `my-cluster-001` 上删除具有键 `Service` 和 `Region` 的标签。

```
https://elasticache.us-west-2.amazonaws.com/
   ?Action=RemoveTagsFromResource
   &ResourceName=arn:aws:elasticache:us-west-2:0123456789:cluster:my-cluster-001
   &SignatureVersion=4
   &SignatureMethod=HmacSHA256
   &TagKeys.member.1=Service
   &TagKeys.member.2=Region
   &Version=2015-02-02
   &Timestamp=20150202T192317Z
   &X-Amz-Credential=<credential>
```

# 使用 Amazon ElastiCache Well-Architected Lens
<a name="WellArchitechtedLens"></a>

本节介绍了 Amazon ElastiCache Well-Architected Lens，这是一组用于设计架构完善的 ElastiCache 工作负载的设计原则和指南。
+ ElastiCache Lens 是对 [Amazon Well-Architected Framework](https://docs.amazonaws.cn/wellarchitected/latest/framework/welcome.html) 的补充。
+ 每个支柱都有一组问题，有助于围绕 ElastiCache 架构展开讨论。
  + 每个问题都有一些领先的做法及其报告分数。
    + *必需* - 在进入生产环境之前是必需的（如果没有，会导致高风险）
    + *最佳* - 客户可能所处的最佳状态
    + *良好* - 我们建议客户具备的条件（如果没有，会导致中度风险）
+ Well-Architected 术语
  + [组件](https://docs.amazonaws.cn/wellarchitected/latest/framework/definitions.html) – 共同满足某项要求的代码、配置和 Amazon 资源。组件与其他组件交互，通常等同于微服务架构中的服务。
  + [工作负载](https://docs.amazonaws.cn/wellarchitected/latest/framework/definitions.html) – 共同提供业务价值的一组组件。这样的工作负载有营销网站、电子商务网站、移动应用程序的后端、分析平台等。

**注意**  
本指南尚未更新，未包含有关 ElastiCache 无服务器缓存和新 Valkey 引擎的信息。

**Topics**
+ [

# Amazon ElastiCache Well-Architected Lens 卓越运营支柱
](OperationalExcellencePillar.md)
+ [

# Amazon ElastiCache Well-Architected Lens 安全支柱
](SecurityPillar.md)
+ [

# Amazon ElastiCache Well-Architected Lens 可靠性支柱
](ReliabilityPillar.md)
+ [

# 亚马逊 Well-A ElastiCache rchitected 镜头性能效率支柱
](PerformanceEfficiencyPillar.md)
+ [

# Amazon ElastiCache Well-Architected Lens 成本优化支柱
](CostOptimizationPillar.md)

# Amazon ElastiCache Well-Architected Lens 卓越运营支柱
<a name="OperationalExcellencePillar"></a>

卓越运营支柱侧重于运行和监控系统以提供商业价值，并不断改进流程和程序。关键主题包括自动变更、响应事件和定义管理日常运营的标准。

**Topics**
+ [

## OE 1：您如何理解和响应 ElastiCache 集群触发的提示和事件？
](#OperationalExcellencePillarOE1)
+ [

## OE 2：您何时以及如何扩展现有的 ElastiCache 集群？
](#OperationalExcellencePillarOE2)
+ [

## OE 3：如何管理您的 ElastiCache 集群资源并使集群保持最新状态？
](#OperationalExcellencePillarOE3)
+ [

## OE 4：如何管理客户端与 ElastiCache 集群的连接？
](#OperationalExcellencePillarOE4)
+ [

## OE 5：如何为工作负载部署 ElastiCache 组件？
](#OperationalExcellencePillarOE5)
+ [

## OE 6：如何针对故障进行规划和缓解故障？
](#OperationalExcellencePillarOE6)
+ [

## OE 7：如何排查 Valkey 或 Redis OSS 引擎事件的问题？
](#OperationalExcellencePillarOE7)

## OE 1：您如何理解和响应 ElastiCache 集群触发的提示和事件？
<a name="OperationalExcellencePillarOE1"></a>

**问题级简介：**当您运营 ElastiCache 集群时，您可以选择在发生特定事件时接收通知和提示。原定设置情况下，ElastiCache 会记录与您的资源相关的[事件](ECEvents.md)，例如失效转移、节点更换、扩展操作、定期维护等。每个事件都包括日期和时间、来源名称和来源类型以及描述。

**问题级优势：**能够理解和管理事件（即触发由集群生成的提示）背后的根本原因，将使您能够更有效地运营并对事件做出适当的响应。
+ **[必需]** [在 ElastiCache 控制台（选择您的区域后）上或使用 [Amazon 命令行界面](https://www.amazonaws.cn/cli)（Amazon CLI）[describe-events](https://docs.amazonaws.cn/cli/latest/reference/elasticache/describe-events.html) 命令和 ElastiCache API](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_DescribeEvents.html) 查看由 ElastiCache 生成的事件。配置 ElastiCache 以使用 Amazon Simple Notification Service（Amazon SNS）发送重要集群事件的通知。将 Amazon SNS 与集群结合使用允许您以编程方式对 ElastiCache 事件采取措施。
  + 事件分为两大类：当前事件和计划的事件。当前事件列表包括：资源创建和删除、扩展操作、失效转移、节点重启、创建的快照、集群的参数修改、CA 证书续订、故障事件（集群预调配失败 - VPC 或 ENI-、扩展失败 -ENI- 和快照故障）。计划的事件列表包括：计划在维护时段更换的节点和重新安排的节点更换。
  + 尽管您可能不需要立即对其中一些事件做出反应，但首先查看所有故障事件至关重要：
    + ElastiCache:AddCacheNodeFailed
    + ElastiCache:CacheClusterProvisioningFailed
    + ElastiCache:CacheClusterScalingFailed
    + ElastiCache:CacheNodesRebooted
    + ElastiCache:SnapshotFailed（仅限 Valkey 或 Redis OSS）
  + **[资源]：**
    + [管理 ElastiCache 亚马逊 SNS 通知](ECEvents.SNS.md)
    + [事件通知和 Amazon SNS](ElastiCacheSNS.md)
+ **[最佳]** 要自动响应事件，请利用 SNS 和 Lambda 函数等 Amazon 产品和服务功能。遵循最佳实践，进行小的、频繁的、可逆的更改，作为代码来随着时间推移发展您的运营。您应该使用 Amazon CloudWatch 指标来监控您的集群。

  **[资源]：**[使用 Amazon Lambda、Amazon Route 53 和 Amazon SNS 监控 ElastiCache（已禁用集群模式）只读副本端点](https://www.amazonaws.cn/blogs/database/monitor-amazon-elasticache-for-redis-cluster-mode-disabled-read-replica-endpoints-using-aws-lambda-amazon-route-53-and-amazon-sns/)，了解使用 Lambda 和 SNS 的使用案例。

## OE 2：您何时以及如何扩展现有的 ElastiCache 集群？
<a name="OperationalExcellencePillarOE2"></a>

**问题级简介：**合理调整您的 ElastiCache 集群规模是一种平衡行为，每次底层工作负载类型发生变化时都需要进行评估。您的目标是在适合您的工作负载的规模合适的环境中运行。

**问题级优势：**资源过度利用可能会导致延迟时间增加和整体性能下降。另一方面，利用率不足可能导致资源预调配过多，成本优化不够理想。通过适当地调整环境规模，您可以在性能效率与成本优化之间取得平衡。为了修正资源利用率过高或不足的情况，ElastiCache 可以在两个维度上进行扩展。您可以通过增加或减少节点容量来纵向扩展。您也可以通过添加和移除节点来横向扩展。
+ **[必需]** 应通过分流读取操作并将读取操作重定向到副本节点，来解决主节点上的 CPU 和网络过度利用问题。使用副本节点进行读取操作以降低主节点利用率。这可以在您的 Valkey 或 Redis OSS 客户端库中进行配置，方法是在禁用集群模式时连接到 ElastiCache 读取器端点，或者在启用集群模式时使用 READONLY 命令。

  **[资源]：**
  + [查找 ElastiCache 中的缓存连接端点](Endpoints.md)
  + [合理调整集群规模](https://www.amazonaws.cn/blogs/database/five-workload-characteristics-to-consider-when-right-sizing-amazon-elasticache-redis-clusters/)
  + [READONLY 命令](https://valkey.io/commands/readonly)
+ **[必需]** 监控 CPU、内存和网络等关键集群资源的利用率。需要跟踪这些特定集群资源的利用率，以便为您的扩展决定和扩展操作的类型提供信息。如果禁用了 ElastiCache 集群模式，则主节点和副本节点可以垂直扩缩。副本节点也可以从 0 个节点横向扩展到 5 个节点。如果启用了集群模式，则这同样适用于集群的每个分片。此外，您可以增加或减少分片的数量。

  **[资源]：**
  + [使用 Amazon CloudWatch 监控 ElastiCache 的最佳实践](https://www.amazonaws.cn/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/)
  + [扩缩适用于 Valkey 或 Redis OSS 的 ElastiCache 集群](Scaling.md)
  + [扩缩适用于 Memcached 的 ElastiCache 集群](Scaling.md)
+ **[最佳]** 监控随时间推移的趋势可以帮助您检测工作负载变化，如果在特定时间点进行监控，这些变化将不会被注意到。要检测长期趋势，请使用 CloudWatch 指标扫描更长的时间范围。从长时间观察 CloudWatch 指标中获得的经验应为您预测集群资源利用率提供信息。CloudWatch 数据点和指标的可用时间长达 455 天。

  **[资源]：**
  + [使用 CloudWatch 指标监控 ElastiCache](CacheMetrics.md)
  + [使用 CloudWatch 指标监控 Memcached](CacheMetrics.md)
  + [使用 Amazon CloudWatch 监控 ElastiCache 的最佳实践](https://www.amazonaws.cn/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/)
+ **[最佳]** 如果您的 ElastiCache 资源是使用 CloudFormation 创建的，则最佳实践是使用 CloudFormation 模板执行更改，以保持操作一致性并避免非托管式配置更改和堆栈偏移。

  **[资源]：**
  + [CloudFormation 的 ElastiCache 资源类型参考](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/AWS_ElastiCache.html)
+ **[最佳]** 使用集群运营数据自动执行扩展操作，并在 CloudWatch 中定义阈值以设置警报。使用 CloudWatch Events 和 Simple Notification Service（SNS）触发 Lambda 函数并执行 ElastiCache API 以自动扩展您的集群。例如，当 `EngineCPUUtilization` 指标在很长一段时间内达到 80% 时，向您的集群添加分片。另一种选择是使用 `DatabaseMemoryUsedPercentages` 来设置基于内存的阈值。

  **[资源]：**
  + [使用 Amazon CloudWatch 警报](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)
  + [什么是 Amazon CloudWatch Events？](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html)
  + [将 Amazon Lambda 与 Amazon Simple Notification Service 结合使用](https://docs.amazonaws.cn/lambda/latest/dg/with-sns.html)
  + [ElastiCache API 参考](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/Welcome.html)

## OE 3：如何管理您的 ElastiCache 集群资源并使集群保持最新状态？
<a name="OperationalExcellencePillarOE3"></a>

**问题级简介：**大规模运营时，必须能够查明和识别所有 ElastiCache 资源。在推出新的应用程序功能时，您需要跨所有 ElastiCache 环境类型（开发、测试和生产）创建集群版本对称性。资源属性允许您针对不同的运营目标（例如，在推出新功能和启用新的安全机制时）将环境分开。

**问题级优势：**将开发、测试和生产环境分开是最佳运营实践。以下方法也是最佳实践：跨环境的集群和节点使用众所周知和有据可查的流程应用最新的软件补丁。利用原生 ElastiCache 功能，可以让您的工程团队专注于实现业务目标，而不是 ElastiCache 的维护。
+ **[最佳]** 在可用的最新引擎版本上运行，并在自助服务更新可用时尽快应用这些更新。ElastiCache 会在您指定的集群维护时段内自动更新其底层基础设施。但是，集群中运行的节点会通过自助更新进行更新。这些更新可以分为两种类型：安全补丁或次要软件更新。确保您了解补丁类型之间的区别及其应用时间。

  **[资源]：**
  + [Amazon ElastiCache 中的自助更新](Self-Service-Updates.md)
  + [Amazon ElastiCache 托管式维护和服务更新帮助页面](https://www.amazonaws.cn/elasticache/elasticache-maintenance/)
+ **[最佳]** 使用标签整理 ElastiCache 资源。在复制组上使用标签，而不是在单个节点上使用标签。您可以配置要在查询资源时显示的标签，也可以使用标签来执行搜索和应用筛选条件。您应该使用资源组来轻松创建和维护共享通用标签集的资源集合。

  **[资源]：**
  + [标记最佳实践](https://d1.awsstatic.com/whitepapers/aws-tagging-best-practices.pdf)
  + [CloudFormation 的 ElastiCache 资源类型参考](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/AWS_ElastiCache.html)
  + [参数组](ParameterGroups.Engine.md#ParameterGroups.Redis)

## OE 4：如何管理客户端与 ElastiCache 集群的连接？
<a name="OperationalExcellencePillarOE4"></a>

**问题级简介：**大规模运营时，您需要了解您的客户端如何与 ElastiCache 集群连接，以管理应用程序的运营环节（如响应时间）。

**问题级优势：**选择最合适的连接机制，可确保您的应用程序不会因连接错误（如超时）而断开连接。
+ **[必需]** 将读取操作与写入操作分开，并连接到副本节点以执行读取操作。但请注意，当您将写入与读取分开时，由于 Valkey 和 Redis OSS 复制的异步性质，您将失去在写入密钥后立即读取密钥的能力。可以利用 WAIT 命令来提高现实世界的数据安全性，并强制副本在响应客户端之前确认写入，但代价是总体性能降低。使用禁用集群模式的 ElastiCache 读取器端点，可以在 ElastiCache 客户端库中配置使用副本节点进行读取操作。如果启用了集群模式，请使用 READONLY 命令。对于许多 ElastiCache 客户端库，READONLY 是原定设置情况下或通过配置设置实现的。

  **[资源]：**
  + [查找 ElastiCache 中的缓存连接端点](Endpoints.md)
  + [READONLY](https://valkey.io/commands/readonly)
+ **[必需] **使用连接池。建立 TCP 连接在客户端和服务器端都会消耗 CPU 时间，而池化允许您重用 TCP 连接。

  为了减少连接开销，您应该使用连接池。有了连接池，您的应用程序可以“随意”重用和释放连接，而无需支付建立连接的成本。您可以通过 ElastiCache 客户端库（如果支持），使用适用于您的应用程序环境的框架实现连接池，也可以从头开始构建连接池。
+ **[最佳]** 确保将客户端的套接字超时设置为至少一秒（相比之下，多个客户端的典型原定设置值为“无”）。
  + 当服务器负载较高时，将超时值设置得过低可能会导致超时。如果将其设置得过高，则可能会导致您的应用程序花费很长时间才能检测到连接问题。
  + 通过在客户端应用程序中实现连接池来控制新连接的量。这样可以减少打开和关闭连接所需的延迟和 CPU 利用率，并且如果在集群上启用了 TLS，则执行 TLS 握手。

  **[资源]：**[配置 ElastiCache 以提高可用性](https://www.amazonaws.cn/blogs/database/configuring-amazon-elasticache-for-redis-for-higher-availability/)
+ **[良好]** 使用管道传输（在您的使用案例允许的情况下）可以显著提高性能。
  + 通过管道传输，可以减少应用程序客户端和集群之间的往返时间（RTT），即使客户端尚未读取之前的响应，也可以处理新的请求。
  + 使用管道传输，您可以向服务器发送多个命令，而无需等待回复/确认。管道传输的缺点是，当您最终批量获取所有响应时，可能出现了一个直到最后您才会发现的错误。
  + 实现在返回遗漏错误请求的错误时重试请求的方法。

  **[资源]：**[管道传输](https://valkey.io/topics/pipelining/)

## OE 5：如何为工作负载部署 ElastiCache 组件？
<a name="OperationalExcellencePillarOE5"></a>

**问题级简介：**ElastiCache 环境可以通过 Amazon 控制台手动部署，也可以通过 API、CLI、工具包等以编程方式部署。卓越运营最佳实践建议尽可能通过代码自动部署。此外，ElastiCache 集群可以按工作负载进行隔离，也可以组合起来进行成本优化。

**问题级优势：**为您的 ElastiCache 环境选择最合适的部署机制，可以随着时间的推移改善卓越运营。建议尽可能以代码形式执行操作，以最大限度地减少人为错误并改善可重复性、灵活性以及对事件的响应时间。

通过了解工作负载隔离要求，您可以选择为每个工作负载提供专用 ElastiCache 环境，或者将多个工作负载合并为单个集群，或者将它们组合在一起。了解权衡利弊有助于在卓越运营和成本优化之间取得平衡
+ **[必需]** 了解 ElastiCache 可用的部署选项，并尽可能自动执行这些过程。可能的自动化途径包括 CloudFormation、Amazon CLI/SDK 和 API。

  **[资源]：**
  + [Amazon ElastiCache 资源类型参考](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/AWS_ElastiCache.html)
  + [elasticache](https://docs.amazonaws.cn/cli/latest/reference/elasticache/index.html)
  + [Amazon ElastiCache API 参考](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/Welcome.html)
+ **[必需]** 对于所有工作负载，确定所需的集群隔离级别。
  + **[最佳]：**高度隔离 – 工作负载与集群的映射为 1:1。允许在每个工作负载的基础上对 ElastiCache 资源的访问、大小、扩展和管理进行最精细的控制。
  + **[更佳]：**中等隔离 – M:1 按目的隔离，但可能在多个工作负载之间共享（例如，一个集群专门用于缓存工作负载，另一个集群专门用于消息传递）。
  + **[良好]：**低度隔离 – M:1 全用途，完全共享。建议用于可接受共享访问的工作负载。

## OE 6：如何针对故障进行规划和缓解故障？
<a name="OperationalExcellencePillarOE6"></a>

**问题级简介：**卓越运营包括通过定期进行“崩溃前”练习来预测故障，以确定潜在的故障来源，从而消除或缓解故障。ElastiCache 提供失效转移 API，允许模拟节点故障事件，用于测试目的。

**问题级优势：**通过提前测试故障情景，您可以了解它们如何影响您的工作负载。这样可以安全地测试响应过程及其有效性，并让您的团队熟悉其执行情况。

**[必需]** 定期在开发/测试账户中执行失效转移测试。[TestFailover](https://docs.amazonaws.cn/AmazonElastiCache/latest/APIReference/API_TestFailover.html)

## OE 7：如何排查 Valkey 或 Redis OSS 引擎事件的问题？
<a name="OperationalExcellencePillarOE7"></a>

**问题级简介：**卓越运营要求能够调查服务级和引擎级信息，以分析集群的运行状况和状态。ElastiCache 可以向 Amazon CloudWatch 和 Amazon Kinesis Data Firehose 发送 Valkey 或 Redis OSS 引擎日志。

**问题级优势：**在 ElastiCache 集群上启用 Valkey 或 Redis OSS 引擎日志后，可以深入了解影响集群运行状况和性能的事件。Valkey 或 Redis OSS 引擎日志直接提供来自引擎的数据，而这些数据无法通过 ElastiCache 事件机制获得。通过仔细观察 ElastiCache 事件（请参阅前面的 OE-1）和引擎日志，可以从 ElastiCache 服务的角度和引擎的角度确定排查问题时的事件顺序。
+ **[必需]** 确保已启用 Redis OSS 引擎日志记录功能，该功能在 ElastiCache for Redis OSS 版本 6.2 及更高版本中可用。这可以在集群创建期间执行，也可以在创建后通过修改集群来执行。
  + 确定是 Amazon CloudWatch Logs 还是 Amazon Kinesis Data Firehose 是 Redis OSS 引擎日志的合适目标。
  + 在 CloudWatch 或 Kinesis Data Firehose 中选择相应的目标日志来保存日志。如果您有多个集群，请考虑为每个集群使用不同的目标日志，因为这将有助于在进行故障排除时隔离数据。

  **[资源]：**
  + 日志传输：[日志传输](Log_Delivery.md)
  + 日志记录目标：[Amazon CloudWatch Logs](Logging-destinations.md#Destination_Specs_CloudWatch_Logs)
  + Amazon CloudWatch Logs 简介：[什么是 Amazon CloudWatch Logs？](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)
  + Amazon Kinesis Data Firehose 简介：[什么是 Amazon Kinesis Data Firehose？](https://docs.amazonaws.cn/firehose/latest/dev/what-is-this-service.html)
+ **[最佳]** 如果使用 Amazon CloudWatch Logs，可以考虑利用 Amazon CloudWatch Logs Insights 查询 Valkey 或 Redis OSS 引擎日志以获取重要信息。

  例如，针对包含 Valkey 或 Redis OSS 引擎日志的 CloudWatch 日志组创建查询，这将返回日志级别为“警告”的事件，例如：

  ```
  fields @timestamp, LogLevel, Message
  | sort @timestamp desc
  | filter LogLevel = "WARNING"
  ```

  **[资源]：**[使用 CloudWatch Logs Insights 分析日志数据](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)

# Amazon ElastiCache Well-Architected Lens 安全支柱
<a name="SecurityPillar"></a>

安全支柱侧重于保护信息和系统。关键主题包括数据的机密性和完整性、识别和管理谁能通过基于权限的管理做什么、保护系统以及建立用以检测安全事件的控制措施。

**Topics**
+ [

## SEC 1：您在控制对 ElastiCache 数据的授权访问方面采取了哪些举措？
](#SecurityPillarSEC1)
+ [

## SEC 2：除了基于网络的控制之外，您的应用程序是否需要对于 ElastiCache 的额外授权？
](#SecurityPillarSEC2)
+ [

## SEC 3：是否存在无意中执行命令从而导致数据丢失或故障的风险？
](#SecurityPillarSEC3)
+ [

## SEC 4：如何使用 ElastiCache 确保静态数据加密
](#SecurityPillarSEC4)
+ [

## SEC 5：如何使用 ElastiCache 加密传输中的数据？
](#SecurityPillarSEC5)
+ [

## SEC 6：如何限制对控制面板资源的访问？
](#SecurityPillarSEC6)
+ [

## SEC 7：如何检测和响应安全事件？
](#SecurityPillarSEC7)

## SEC 1：您在控制对 ElastiCache 数据的授权访问方面采取了哪些举措？
<a name="SecurityPillarSEC1"></a>

**问题级简介：**所有 ElastiCache 集群均设计为从 VPC 中的 Amazon Elastic Compute Cloud 实例、无服务器函数（Amazon Lambda）或容器（Amazon Elastic Container Service）进行访问。最常遇到的情况是从同一个 Amazon Virtual Private Cloud（Amazon VPC）内的 Amazon Elastic Compute Cloud 实例访问 ElastiCache 集群。必须先授权 Amazon EC2 实例对集群的访问权限，然后您才能从 Amazon EC2 实例连接到集群。要访问在 VPC 中运行的 ElastiCache 集群，需要授予进入该集群的网络入口。

**问题级优势：**通过 VPC 安全组控制进入集群的网络入口。安全组充当 Amazon EC2 实例的虚拟防火墙，用于控制传入和传出流量。入站规则控制传入到实例的流量，出站规则控制从实例传出的流量。就 ElastiCache 而言，启动集群时，需要关联安全组。这样可以确保组成集群的所有节点都有入站和出站流量规则。此外，ElastiCache 配置为仅在私有子网上部署，因此只能通过 VPC 的私有网络进行访问。
+ **[必需] **与您的集群关联的安全组控制进入集群的网络入口以及对集群的访问权限。原定设置情况下，安全组将不会定义任何入站规则，因此不会有指向 ElastiCache 的入口路径。要启用此功能，请在安全组上配置入站规则，指定源 IP 地址/范围、TCP 类型流量和 ElastiCache 集群的端口（例如 ElastiCache for Valkey 和 ElastiCache for Redis OSS 的原定设置端口 6379）。尽管允许非常广泛的入口来源，例如 VPC 中的所有资源（0.0.0.0/0），但建议尽可能详细地定义入站规则，例如，仅授权入站访问在与特定安全组关联的 Amazon EC2 实例上运行的 Valkey 或 Redis OSS 客户端。

  **[资源]：**
  + [子网和子网组](SubnetGroups.md)
  + [访问您的集群或复制组](accessing-elasticache.md)
  + [使用安全组控制到资源的流量](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-security-groups.html#DefaultSecurityGroupdefault%20security%20group)
  + [适用于 Linux 实例的 Amazon Elastic Compute Cloud 安全组](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-security-groups.html#creating-your-own-security-groups)
+ **[必需] **可以为 Amazon Lambda 函数分配 Amazon Identity and Access Management 策略，允许其访问 ElastiCache 数据。要启用此功能，请创建具有 `AWSLambdaVPCAccessExecutionRole` 权限的 IAM 执行角色，然后将该角色分配给 Amazon Lambda 函数。

  **[资源]：**配置 Lambda 函数以访问 Amazon VPC 中的 Amazon ElastiCache：[教程：配置 Lambda 函数以访问 Amazon VPC 中的 Amazon ElastiCache](https://docs.amazonaws.cn/lambda/latest/dg/services-elasticache-tutorial.html)

## SEC 2：除了基于网络的控制之外，您的应用程序是否需要对于 ElastiCache 的额外授权？
<a name="SecurityPillarSEC2"></a>

**问题级简介：**对于需要在单个客户端级别限制或控制对集群的访问权限的场景中，建议通过 AUTH 命令进行身份验证。ElastiCache 身份验证令牌以及可选的用户和用户组管理，让 ElastiCache 在允许客户端运行命令和访问密钥之前需要密码，进而提高数据面板的安全性。

**问题级优势：**为了保护您的数据安全，ElastiCache 提供了旨在防止未经授权访问您数据的机制。这些机制包括强制实施基于角色的访问控制（RBAC）AUTH 或 AUTH 令牌（密码），供客户端在执行授权命令之前连接到 ElastiCache。
+ **[最佳] **对于 ElastiCache for Redis OSS 版本 6.x 及更高版本，以及 ElastiCache for Valkey 版本 7.2 及更高版本，通过定义用户组、用户和访问字符串来定义身份验证和授权控制。将用户分配给用户组，然后将用户组分配给集群。要使用 RBAC，必须在创建集群时将其选中，并且必须启用传输中加密。确保您使用的是支持 TLS 的 Valkey 或 Redis OSS 客户端，以便能够利用 RBAC。

  **[资源]：**
  + [将 RBAC 应用于 ElastiCache 的复制组](Clusters.RBAC.md#rbac-using)
  + [使用访问字符串指定权限](Clusters.RBAC.md#Access-string)
  + [ ACL](https://valkey.io/topics/acl/)
  + [支持的 ElastiCache 版本](VersionManagement.md#supported-engine-versions)
+ **[最佳]** 对于 ElastiCache for Redis OSS 6.x 之前的版本，除了为 AUTH 设置强令牌/密码和维持严格的密码策略外，最佳实践是轮换密码/令牌。在任何给定时间，ElastiCache 最多可管理两（2）个身份验证令牌。您也可以修改集群以明确要求使用身份验证令牌。

  **[资源]：**[修改现有 ElastiCache 集群上的 AUTH 令牌](auth.md#auth-modifyng-token)

## SEC 3：是否存在无意中执行命令从而导致数据丢失或故障的风险？
<a name="SecurityPillarSEC3"></a>

**问题级简介：**许多 Valkey 或 Redis OSS 命令一旦错误执行或由恶意行为者执行，就可能会对运营产生不利影响。从性能和数据安全的角度来看，这些命令可能会产生意想不到的后果。例如，开发人员可能会在开发环境中定期调用 FLUSHALL 命令，并且由于错误，可能会无意中尝试在生产系统上调用此命令，从而导致数据意外丢失。

**问题级优势：**从 ElastiCache for Redis OSS 5.0.3 版本开始，您可以重命名某些可能会中断工作负载的命令。重命名命令有助于防止无意中在集群上执行这些命令。
+ **[必需]**

  **[资源]：**
  + [ElastiCache for Redis OSS 5.0.3 版本（已弃用，使用 5.0.6 版本）](engine-versions.md#redis-version-5-0.3)
  + [ElastiCache for Redis OSS 版本 5.0.3 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.5-0-3)
  + [Redis OSS 安全](https://redis.io/docs/management/security/)

## SEC 4：如何使用 ElastiCache 确保静态数据加密
<a name="SecurityPillarSEC4"></a>

**问题级简介：**虽然 ElastiCache 是一种内存数据存储，但可以加密任何在集群标准操作中保留（在存储上）的数据。这包括写入 Amazon S3 的计划备份和手动备份，以及在执行同步和交换操作后保存到磁盘存储中的数据。m6g 和 R6g 系列中的实例类型还会始终开启内存加密。

**问题级优势：**ElastiCache 提供可选的静态加密，以提高数据安全性。
+ **[必需] **只有在创建 ElastiCache 集群（复制组）时，才能在该集群上启用静态加密。无法修改现有集群以开始加密静态数据。原定设置情况下，ElastiCache 将提供和管理静态加密中使用的密钥。

  **[资源]：**
  + [静态加密限制](at-rest-encryption.md#at-rest-encryption-constraints)
  + [启用静态加密](at-rest-encryption.md#at-rest-encryption-enable)
+ **[最佳]** 利用当数据在内存中时对数据进行加密的 Amazon EC2 实例类型（例如 m6g 或 R6g）。如果可能，请考虑管理自己的静态加密密钥。对于更严格的数据安全环境，可以使用 Amazon Key Management Service（KMS）来自行管理客户主密钥（CMK）。通过 ElastiCache 与 Amazon Key Management Service 集成，您可以创建、拥有和管理用于为 ElastiCache 集群加密静态数据的密钥。

  **[资源]：**
  + [使用 Amazon Key Management Service 中的客户托管密钥](at-rest-encryption.md#using-customer-managed-keys-for-elasticache-security)
  + [Amazon Key Management Service](https://docs.amazonaws.cn/kms/latest/developerguide/overview.html)
  + [Amazon KMS 概念](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#master_keys)

## SEC 5：如何使用 ElastiCache 加密传输中的数据？
<a name="SecurityPillarSEC5"></a>

**问题级简介：**防止数据在传输过程中被泄露是常见的要求。这些数据指分布式系统的组件内以及应用程序客户端和集群节点之间的数据。ElastiCache 通过允许对客户端和集群之间以及集群节点自身之间的传输中数据进行加密，从而支持这一要求。m6g 和 R6g 系列中的实例类型还会始终开启内存加密。

**问题级简介：**Amazon ElastiCache 传输中加密是一项可选功能，您可以通过该功能在数据最脆弱的时候（从一个位置传输到另一个位置时）提高数据的安全性。
+ **[必需] **只有在创建集群（复制组）时才能在该集群上启用传输中加密。请注意，由于加密/解密数据需要额外的处理，因此，实施传输中加密将会对性能有一些影响。要了解具体会有什么影响，建议在启用传输中加密之前和之后分别对您的工作负载进行基准测试。

  **[资源]：**
  + [传输中加密概览](in-transit-encryption.md#in-transit-encryption-overview)

## SEC 6：如何限制对控制面板资源的访问？
<a name="SecurityPillarSEC6"></a>

**问题级简介：**IAM 策略和 ARN 为 ElastiCache for Valkey 和 ElastiCache for Redis OSS 提供了精细的访问控制，允许通过更严格的控制来管理群的创建、修改和删除。

**问题级优势：**可以将 Amazon ElastiCache 资源（例如复制组、节点等）的管理限制为根据 IAM policy 拥有特定权限的 Amazon 账户，从而提高资源的安全性和可靠性。
+ **[必需] **通过为 Amazon 用户分配特定 Amazon Identity and Access Management 策略来管理对 Amazon ElastiCache 资源的访问权限，从而可以更精细地控制哪些账户可以对集群执行哪些操作。

  **[资源]：**
  + [管理对 ElastiCache 资源的访问权限的概览](IAM.Overview.md)
  + [将基于身份的策略（IAM policy）用于 Amazon ElastiCache](IAM.IdentityBasedPolicies.md)

## SEC 7：如何检测和响应安全事件？
<a name="SecurityPillarSEC7"></a>

**问题级简介：**ElastiCache 在启用 RBAC 的情况下部署时，会导出 CloudWatch 指标以向用户通知安全事件。这些指标有助于识别连接的 RBAC 用户未获授权进行身份验证、访问密钥或运行命令的失败尝试。

此外，Amazon 产品和服务资源通过自动执行部署和记录所有操作及修改以供日后审查/审计，帮助保护您的整体工作负载。

**问题级优势：**通过监控事件，可以让您的组织能够根据您的要求、策略和过程做出响应。自动监控和响应这些安全事件可增强您的整体安全态势。
+ **[必需] **自行熟悉已发布的与 RBAC 身份验证和授权失败有关的 CloudWatch 指标。
  + AuthenticationFailures = 尝试向 Valkey 或 Redis OSS 进行身份验证失败
  + KeyAuthorizationFailures = 用户未经许可尝试访问密钥失败
  + CommandAuthorizationFailures = 用户未经许可尝试运行命令失败

  **[资源]：**
  + [Valkey 或 Redis OSS 的指标](CacheMetrics.Redis.md)
+ **[最佳] **建议针对这些指标设置提示和通知，并在必要时做出响应。

  **[资源]：**
  + [使用 Amazon CloudWatch 警报](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)
+ **[最佳] **使用 Valkey 或 Redis OSS ACL LOG 命令收集进一步的详细信息

  **[资源]：**
  + [ACL LOG](https://valkey.io/commands/acl-log/)
+ **[最佳] **自行熟悉与监控、记录和分析 ElastiCache 部署和事件相关的 Amazon 产品和服务功能

  **[资源]：**
  + [使用 Amazon CloudTrail 记录 Amazon ElastiCache API 调用](logging-using-cloudtrail.md)
  + [elasticache-redis-cluster-automatic-backup-check](https://docs.amazonaws.cn/config/latest/developerguide/elasticache-redis-cluster-automatic-backup-check.html)
  + [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)

# Amazon ElastiCache Well-Architected Lens 可靠性支柱
<a name="ReliabilityPillar"></a>

可靠性支柱的侧重点是执行预期功能的工作负载以及如何从故障中快速恢复以满足需求。关键主题包括分布式系统设计、恢复规划和适应不断变化的需求。

**Topics**
+ [

## REL 1：您如何支持高可用性（HA）架构部署？
](#ReliabilityPillarREL1)
+ [

## REL 2：您如何使用 ElastiCache 实现恢复点目标（RPO）？
](#ReliabilityPillarREL2)
+ [

## REL 3：您如何支持灾难恢复（DR）要求？
](#ReliabilityPillarREL3)
+ [

## REL 4：如何有效地规划失效转移？
](#ReliabilityPillarREL4)
+ [

## REL 5：您的 ElastiCache 组件是否设计为可扩展？
](#ReliabilityPillarREL5)

## REL 1：您如何支持高可用性（HA）架构部署？
<a name="ReliabilityPillarREL1"></a>

**问题级简介：**了解 Amazon ElastiCache 的高可用性架构，将使您能够在可用性事件期间以弹性状态运行。

**问题级优势：**设计您的 ElastiCache 集群的架构，使之具有故障恢复能力，可确保您的 ElastiCache 部署具有更高的可用性。
+ **[必需] **确定您的 ElastiCache 集群所需的可靠性级别。不同的工作负载具有不同的弹性标准，从完全的临时工作负载到任务关键型工作负载。定义您运行的每种环境类型（例如开发、测试和生产）的需求。

  缓存引擎：ElastiCache for Memcached 与 ElastiCache for Valkey 和 ElastiCache for Redis OSS

  1. ElastiCache for Memcached 不提供任何复制机制，主要用于临时工作负载。

  1. ElastiCache for Valkey 和 ElastiCache for Redis OSS 提供了下面所讨论的 HA 功能
+ **[最佳] **对于需要 HA 的工作负载，请在集群模式下使用 ElastiCache，每个分片至少有两个副本，即使对于吞吐量要求较小且只需要一个分片的工作负载也是如此。

  1. 如果启用了集群模式，将自动启用多可用区。

     在发生任何计划内或计划外维护以及缓解可用区故障时，多可用区通过执行从主节点到副本的自动失效转移来最大限度地减少停机时间。

  1. 对于分片工作负载，由于 Valkey 或 Redis OSS 集群协议要求大多数主节点可用才能实现仲裁，因此至少有三个分片可以在失效转移事件期间提供更快的恢复。

  1. 跨可用性设置两个或更多副本。

     拥有两个副本可以提高读取可扩展性，也可以在一个副本处于维护状态的场景中提供读取可用性。

  1. 使用基于 Graviton2 的节点类型（大多数区域中的原定设置节点）。

     ElastiCache 在这些节点上添加了优化的性能。因此，您可以获得更佳的复制和同步性能，从而提高整体可用性。

  1. 监控并适当调整规模以应对预期的流量高峰：在高负载下，引擎可能会变得无响应，从而影响可用性。`BytesUsedForCache` 和 `DatabaseMemoryUsagePercentage` 是衡量内存使用情况的良好指标，而 `ReplicationLag` 是基于写入速率衡量复制运行状况的指标。您可以使用这些指标来触发集群扩展。

  1. 通过[在生产失效转移事件之前使用失效转移 API](https://docs.amazonaws.cn/en_us/AmazonElastiCache/latest/APIReference/API_TestFailover.html) 进行测试，确保客户端恢复能力。

  **[资源]：**
  + [配置 ElastiCache for Redis OSS 以提高可用性](https://www.amazonaws.cn/blogs/database/configuring-amazon-elasticache-for-redis-for-higher-availability/)
  + [使用复制组时的高可用性](Replication.md)

## REL 2：您如何使用 ElastiCache 实现恢复点目标（RPO）？
<a name="ReliabilityPillarREL2"></a>

**问题级简介：**了解工作负载 RPO，为有关 ElastiCache 备份和恢复策略的决策提供依据。

**问题级优势：**制定适当的 RPO 策略，可以提高灾难恢复情景下的业务连续性。设计备份和还原策略有助于您实现 ElastiCache 数据的恢复点目标（RPO）。ElastiCache 提供存储在 Amazon S3 中的快照功能以及可配置的保留策略。这些快照是在定义的备份时段内拍摄的，并由服务自动处理。如果您的工作负载需要额外的备份粒度，则可以选择每天创建多达 20 个手动备份。手动创建的备份没有服务保留策略，可以无限期保留。
+ **[必需] **了解并记录您的 ElastiCache 部署的 RPO。
  + 请注意，Memcached 不提供任何备份流程。
  + 查看 ElastiCache 备份和还原特性的功能。
+ **[最佳] **制定一个沟通良好的集群备份流程。
  + 根据需要启动手动备份。
  + 查看自动备份的保留策略。
  + 请注意，手动备份将会无限期保留。
  + 将自动备份安排在使用率比较低的时段内进行。
  + 对只读副本执行备份操作，以确保将对集群性能的影响降至最低。
+ **[良好]** 利用 ElastiCache 的计划备份功能，在规定的时段内定期备份数据。
  + 定期测试从备份中执行的还原。
+ **[资源]：**
  + [Redis OSS](https://www.amazonaws.cn/elasticache/faqs/#Redis)
  + [ElastiCache 的备份与恢复](backups.md)
  + [进行手动备份](backups-manual.md)
  + [计划自动备份](backups-automatic.md)
  + [备份和还原 ElastiCache 集群](https://www.amazonaws.cn/blogs/aws/backup-and-restore-elasticache-redis-nodes/)

## REL 3：您如何支持灾难恢复（DR）要求？
<a name="ReliabilityPillarREL3"></a>

**问题级简介：**灾难恢复对于任何工作负载规划都是一个重要的方面。ElastiCache 提供了多种选择，可根据工作负载弹性要求实施相应的灾难恢复。使用 Amazon ElastiCache 全局数据存储，您可以在一个区域中写入您的集群，并让数据可供从另外两个跨区域副本集群读取，从而实现跨区域的低延迟读取和灾难恢复。

**问题级优势：**了解各种灾难情景并相应进行规划可以确保业务连续性。灾难恢复策略必须在成本、性能影响和数据丢失可能性之间达到平衡。
+ **[必需] **根据工作负载要求，为所有 ElastiCache 组件制定和记录灾难恢复策略。ElastiCache 的独特之处在于，有些使用案例是完全是临时的，不需要任何灾难恢复策略；而另一些使用案例则截然相反，需要极其稳健的灾难恢复策略。所有选项都必须针对成本优化进行权衡 – 恢复能力越高，则需要的基础设施就越多。

  了解区域级别和多区域级别上可用的灾难恢复选项。
  + 建议进行多可用区部署以防出现可用区故障。确保在多可用区架构中启用集群模式进行部署，且至少提供 3 个可用区。
  + 建议使用全局数据存储以防出现区域故障。
+ **[最佳] **为需要区域级恢复能力的工作负载启用全局数据存储。
  + 制定计划，以便在主区域出现性能下降时失效转移到辅助区域。
  + 在生产环境中进行失效转移之前，测试多区域失效转移过程。
  + 监控 `ReplicationLag` 指标，以了解失效转移事件期间数据丢失带来的潜在影响。
+ **[资源]：**
  + [缓解故障](disaster-recovery-resiliency.md#FaultTolerance)
  + [使用全局数据存储跨 Amazon 区域进行复制](Redis-Global-Datastore.md)
  + [从备份还原（可选择调整集群大小](backups-restoring.md)
  + [利用多可用区最大限度减少 ElastiCache for Valkey 和 ElastiCache for Redis OSS 中的停机时间](AutoFailover.md)

## REL 4：如何有效地规划失效转移？
<a name="ReliabilityPillarREL4"></a>

**问题级简介：**启用具有自动失效转移功能的多可用区是 ElastiCache 最佳实践。某些情况下，在服务操作过程中，ElastiCache for Valkey 和 ElastiCache for Redis OSS 会取代主节点。这些情况包括计划维护事件，以及节点故障或可用区出现问题等此类不太可能发生的情况。失效转移的成功与否依赖于 ElastiCache 和您的客户端库配置。

**问题级优势：**将 ElastiCache 失效转移的最佳实践与特定的 ElastiCache 客户端库相结合，有助于您最大限度地减少失效转移事件期间的潜在停机时间。
+ **[必需] **如果禁用集群模式，请使用超时，以便客户端检测是否需要断开与旧的主节点的连接，然后使用更新后的主端点 IP 地址重新连接到新的主节点。如果启用了集群模式，则客户端库负责检测底层集群拓扑的变化。此操作通常是通过 ElastiCache 客户端库中的配置设置来实现的，该操作还允许您配置刷新的频率和方法。每个客户端库都提供自己的设置，更多详细信息可在相应的文档中找到。

  **[资源]：**
  + [利用多可用区最大限度减少 ElastiCache for Valkey 和 ElastiCache for Redis OSS 中的停机时间](AutoFailover.md)
  + 查看 ElastiCache 客户端库的最佳实践。
+ **[必需] **失效转移的成功取决于主节点和副本节点之间运行状况正常的复制环境。查看并了解 Valkey 和 Redis OSS 复制的异步性质，以及可用的 CloudWatch 指标，以便报告主节点和副本节点之间的复制延迟。对于需要更高数据安全性的使用案例，请利用 WAIT 命令强制副本在响应连接的客户端之前确认写入。

  **[资源]：**
  + [Valkey 或 Redis OSS 的指标](CacheMetrics.Redis.md)
  +  [使用 Amazon CloudWatch 监控 ElastiCache 的最佳实践](https://www.amazonaws.cn/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/)
+ **[最佳] **在失效转移期间，使用 ElastiCache 测试失效转移 API 定期验证应用程序的响应能力。

  **[资源]：**
  + [在 ElastiCache 上测试到只读副本的自动失效转移](https://www.amazonaws.cn/blogs/database/testing-automatic-failover-to-a-read-replica-on-amazon-elasticache-for-redis/)
  + [测试自动失效转移](AutoFailover.md#auto-failover-test)

## REL 5：您的 ElastiCache 组件是否设计为可扩展？
<a name="ReliabilityPillarREL5"></a>

**问题级简介：**通过了解扩展能力和可用的部署拓扑，您的 ElastiCache 组件可以不断进行调整，以满足不断变化的工作负载要求。ElastiCache 提供 4 种扩展方式：横向缩减/横向扩展（横向）和纵向扩展/缩减（纵向）。

**问题级优势：**遵循 ElastiCache 部署的最佳实践可提供最大的扩展灵活性，同时还符合 Well Architected 原则，即横向扩展以最大限度地减少故障的影响。
+ **[必需] **了解启用集群模式的拓扑与禁用集群模式的拓扑之间的区别。在几乎所有情况下，均建议在启用集群模式的情况下进行部署，因为这可以不断提高可扩展性。禁用集群模式的组件通过添加只读副本进行水平扩展的能力受到限制。
+ **[必需] **了解何时以及如何扩展。
  + 要获得更多 READIOPS：添加副本
  + 要获得更多 WRITEOPS：添加分片（横向扩展）
  + 要获得更多网络 IO：使用网络优化型实例，纵向扩展
+ **[最佳] **在启用集群模式的情况下部署 ElastiCache 组件，偏向于更多、更小的节点，而不是更少、更大的节点。这可有效地限制节点故障的影响范围。
+ **[最佳] **在集群中加入副本，以增强扩展事件期间的响应能力
+ **[良好] **如果禁用了集群模式，请利用只读副本增加总体读取容量。ElastiCache 在禁用集群模式的情况下最多支持 5 个只读副本，还支持纵向扩展。
+ **[资源]：**
  + [扩缩 ElastiCache 集群](Scaling.md)
  + [在线纵向扩展](redis-cluster-vertical-scaling.md#redis-cluster-vertical-scaling-scaling-up)

# 亚马逊 Well-A ElastiCache rchitected 镜头性能效率支柱
<a name="PerformanceEfficiencyPillar"></a>

性能效率支柱侧重于高效率地使用 IT 和计算资源。关键主题包括：根据工作负载要求选择合适的资源类型和大小、监控性能以及做出明智的决策以跟随业务需求的变化保持效率。

**Topics**
+ [

## PE 1：如何监控您的亚马逊 ElastiCache 集群的性能？
](#PerformanceEfficiencyPillarPE1)
+ [

## PE 2：您如何在 ElastiCache 群集节点之间分配工作？
](#PerformanceEfficiencyPillarPE2)
+ [

## PE 3：对于缓存工作负载，如何跟踪和报告缓存的有效性和性能？
](#PerformanceEfficiencyPillarPE3)
+ [

## PE 4：您的工作负载如何优化网络资源和连接的使用？
](#PerformanceEfficiencyPillarPE4)
+ [

## PE 5：如何管理密钥删除 and/or 驱逐？
](#PerformanceEfficiencyPillarPE5)
+ [

## PE 6：你如何对中的数据进行建模和交互 ElastiCache？
](#PerformanceEfficiencyPillarPE6)
+ [

## PE 7：如何在您的 Amazon ElastiCache 集群中记录运行缓慢的命令？
](#PerformanceEfficiencyPillarPE7)
+ [

## PE8: Auto Scaling 如何帮助提高ElastiCache 集群的性能？
](#PerformanceEfficiencyPillarPE8)

## PE 1：如何监控您的亚马逊 ElastiCache 集群的性能？
<a name="PerformanceEfficiencyPillarPE1"></a>

**问题级简介：**通过了解现有的监控指标，您可以确定当前的利用率。适当的监控有助于识别影响集群性能的潜在瓶颈。

**问题级优势：**了解与您的集群关联的指标有助于指导优化技术，从而减少延迟和增加吞吐量。
+ **[必需] **使用一部分工作负载进行基准性能测试。
  + 您应该使用负载测试等机制监控实际工作负载的性能。
  + 在运行这些测试时监控 CloudWatch 指标，以了解可用指标并建立性能基准。
+ **[最佳]** 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，请重命名计算成本高昂的命令，例如`KEYS`，以限制用户在生产集群上运行阻塞命令的能力。
  + ElastiCache 运行适用于 Redis OSS 的引擎 6.x 的工作负载可以利用基于角色的访问控制来限制某些命令。可以通过使用控制Amazon台或 CLI 创建用户和用户组，并将用户组与集群关联来控制对命令的访问。在 Redis OSS 6 中，启用 RBAC 后，我们可以使用“-@dangerous”，它将禁止该用户使用诸如 KEYS、MONITOR、SORT 等昂贵的命令。
  + 对于引擎版本 5.x，使用集群参数组上的 `rename-commands` 参数重命名命令。
+ **[更佳]** 分析慢速查询并寻找优化技巧。
  + 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，请通过分析慢日志来详细了解您的查询。例如，您可以使用以下命令 `valkey-cli slowlog get 10` 来显示最近 10 条超过延迟阈值（原定设置为 10 毫秒）的命令。
  + 使用复杂ElastiCache 的 Valkey 和 Redis OSS 数据结构可以更有效地执行某些查询。例如，对于数字样式范围查找，应用程序可以使用排序集来实现简单的数字索引。管理这些索引可以减少对数据集执行的扫描，并以更高的性能效率返回数据。
  + 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，`redis-benchmark`提供了一个简单的接口，用于使用用户定义的输入（例如客户端数量和数据大小）来测试不同命令的性能。
  + 由于 Memcached 仅支持简单的键级命令，因此可以考虑构建其他键作为索引，以避免遍历键空间来服务于客户端查询。
+ **[资源]：**
  + [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)
  + [使用亚马逊 CloudWatch 警报](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)
  + [Valkey 和 Redis OSS 特定参数](ParameterGroups.Engine.md#ParameterGroups.Redis)
  + [SLOWLOG](https://valkey.io/commands/slowlog/)
  + [基准](https://valkey.io/topics/benchmark/)

## PE 2：您如何在 ElastiCache 群集节点之间分配工作？
<a name="PerformanceEfficiencyPillarPE2"></a>

**问题级简介：**您的应用程序连接到 Amazon ElastiCache 节点的方式可能会影响集群的性能和可扩展性。

**问题级优势：**正确使用集群中的可用节点将确保在可用的资源中分配工作。以下技巧也有助于避免闲置资源。
+ **[必需]** 让客户端连接到正确的 ElastiCache 端点。
  + ElastiCache 对于 Valkey 和 Redis，OSS 会根据所使用的集群模式实现不同的终端节点。对于已启用集群模式， ElastiCache 将提供配置终端节点。如果禁用了集群模式，则ElastiCache 提供一个主终端节点（通常用于写入）和一个用于平衡副本间读取的读取器终端节点。正确实现这些端点将会提高性能并让扩展操作更轻松。除非有特定要求，否则请避免连接到各个节点端点。
  + 对于多节点 Memcached 集群， ElastiCache 提供启用自动发现的配置终端节点。建议使用哈希算法在缓存节点之间均匀分配工作。许多 Memcached 客户端库可实现一致性哈希。请参阅您要使用的库的文档，了解其是否支持一致性哈希以及如何实现一致性哈希。您可以[在此处](BestPractices.LoadBalancing.md)找到有关实现这些功能的更多信息。
+ **[更好]** 利用支持 Valkey 和 Redis 的 OSS 集群模式的集群来提高可扩展性。 ElastiCache 
  + ElastiCache 对于 Valkey 和 Redis OSS（已启用集群模式），集群支持[在线扩展操作](scaling-redis-cluster-mode-enabled.md#redis-cluster-resharding-online)（out/in and up/down），以帮助在分片之间动态分配数据。使用配置端点将确保您的集群感知客户端能够适应集群拓扑的变化。
  + 您也可以通过在 for Valkey 和 Redis OSS（已启用集群模式）集群中的 ElastiCache 可用分片之间移动哈希槽来重新平衡集群。此举有助于在可用分片之间更高效地分配工作。
+ **[更佳]** 实施用于识别和修复工作负载中热键的策略。
  + 考虑多维 Valkey 或 Redis OSS 数据结构（例如列表、流、集合等）的影响。这些数据结构存储在单个键中，而这些键位于单个节点上。与其他数据类型相比，非常大的多维键有可能占用更多的网络容量和内存，因此可能导致过度使用该节点。如果可能，请将您的工作负载设计为将数据访问分散到许多离散的键上。
  + 工作负载中的热键可能会影响正在使用的节点的性能。对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，你可以使用 LFU 最大内存策略`valkey-cli --hotkeys`是否到位来检测热键。
  + 考虑在多个节点上复制热键，以便更均匀地分配对它们的访问。这种方法要求客户端写入多个主节点（Valkey 或 Redis OSS 节点本身不提供此功能），除原始键名称外，还需要维护一个可供读取的键名称列表。
  + ElastiCache [适用于 Valkey 及更高 ElastiCache 版本的引擎 7.2 和 Redis OSS 及更高版本的版本 6 都支持服务器辅助的客户端缓存。](https://valkey.io/topics/client-side-caching/)这样，应用程序就可以等待密钥的更改，然后再进行网络呼叫ElastiCache。
+ **[资源]：**
  + [为 Valkey 和 Redis OSS 进行配置 ElastiCache 以获得更高的可用性](https://www.amazonaws.cn/blogs/database/configuring-amazon-elasticache-for-redis-for-higher-availability/)
  + [查找 ElastiCache 中的缓存连接端点](Endpoints.md)
  + [负载均衡最佳实践](https://docs.amazonaws.cn/AmazonElastiCache/latest/dg/BestPractices.LoadBalancing.html)
  + [Valkey 或 Redis OSS（已启用集群模式）的离线重新分片](scaling-redis-cluster-mode-enabled.md#redis-cluster-resharding-online)
  + [Valkey 和 Redis OSS 中的客户端缓存](https://valkey.io/topics/client-side-caching/)

## PE 3：对于缓存工作负载，如何跟踪和报告缓存的有效性和性能？
<a name="PerformanceEfficiencyPillarPE3"></a>

**问题级简介：**缓存是经常遇到的工作负载，了解如何管理缓存的有效性和性能非常重要。 ElastiCache 

**问题级优势：**您的应用程序可能显示出性能不佳的迹象。您能够使用特定于缓存的指标来决定如何提高应用程序性能，这对您的缓存工作负载至关重要。
+ **[必需] **测量并跟踪一段时间内的缓存命中率。缓存的效率由其“缓存命中率”决定。缓存命中率由键命中总数除以命中和未命中总数来定义。比率越接近 1，您的缓存就越有效。缓存命中率低是由缓存未命中数量造成的。当在缓存中找不到请求的键时，就会出现缓存未命中。键不在缓存中，因为它要么已被驱逐或删除，要么已过期，要么从未存在。了解为什么键不在缓存中，并制定适当的策略将其放入缓存。

  **[资源]：**
  + [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)
+ **[必需]** 测量和收集应用程序缓存性能以及延迟和 CPU 利用率值，以了解是否需要调整应用程序组件 time-to-live或其他应用程序组件。 ElastiCache 为每种数据结构的聚合延迟提供了一组 CloudWatch 指标。这些延迟指标是使用 INFO 命令中的命令统计数据计算得出的，不包括网络和 I/O 时间。这只是处理操作所 ElastiCache 消耗的时间。

  **[资源]：**
  + [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)
  + [监控 ElastiCache 使用 Amazon 的最佳实践 CloudWatch](https://www.amazonaws.cn/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/)
+ **[最佳] **根据您的需求选择合适的缓存策略。缓存命中率低是由缓存未命中数量造成的。如果您的工作负载设计为缓存未命中数量较低（例如实时通信），则最好对缓存策略进行审查，并为您的工作负载应用最合适的解决方案，例如用于测量内存和性能的查询检测。您用于为填充并维护缓存而实施的实际策略取决于客户端需要缓存的数据以及针对这些数据的访问模式。例如，您不太可能对流媒体应用程序的个性化推荐和热门新闻报道使用相同的策略。

  **[资源]：**
  + [Memcached 缓存策略](Strategies.md)
  + [缓存最佳实践](https://www.amazonaws.cn/caching/best-practices/)
  + [借助 Amazon 实现大规模绩效 ElastiCache 白皮书](https://d0.awsstatic.com/whitepapers/performance-at-scale-with-amazon-elasticache.pdf)

## PE 4：您的工作负载如何优化网络资源和连接的使用？
<a name="PerformanceEfficiencyPillarPE4"></a>

**问题级简介：**ElastiCache 对于 Valkey，许多应用程序客户端都支持 Memcached 和 Redis OSS，实现方式可能会有所不同。您需要了解现有的网络和连接管理，以分析潜在的性能影响。

**问题级优势：**高效地使用网络资源可以提高集群的性能效率。以下建议可以减少网络需求，并改善集群延迟和吞吐量。
+ **[必需]** 主动管理与 ElastiCache 集群的连接。
  + 应用程序中的连接池减少了通过打开和关闭连接在集群上产生的开销量。 CloudWatch 使用`CurrConnections`和监控 Amazon 中的连接行为`NewConnections`。
  + 通过在适当的位置正确关闭客户端连接来避免连接泄露。连接管理策略包括正确关闭未使用的连接，以及设置连接超时。
  + 对于 Memcached 工作负载，为处理连接预留了可配置的内存量，称为 `memcached_connections_overhead`。
+ **[更佳] **压缩大型对象以减少内存并提高网络吞吐量。
  + 数据压缩可以减少所需的网络吞吐量（Gbps），但会增加应用程序压缩和解压缩数据的工作量。
  + 压缩还会减少键所消耗的内存量
  + 根据您的应用程序需求，考虑压缩比与压缩速度之间的权衡。
+ **[资源]：**
  + [ElastiCache -全球数据存储](https://www.amazonaws.cn/elasticache/redis/global-datastore/)
  + [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)
  + [ElastiCache 适用于 Redis OSS 的 5.0.3 版本增强了 I/O 处理能力以提高性能](https://www.amazonaws.cn/about-aws/whats-new/2019/03/amazon-elasticache-for-redis-503-enhances-io-handling-to-boost-performance/)
  + [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)
  + [配置 ElastiCache 以获得更高的可用性](https://www.amazonaws.cn/blogs/database/configuring-amazon-elasticache-for-redis-for-higher-availability/)

## PE 5：如何管理密钥删除 and/or 驱逐？
<a name="PerformanceEfficiencyPillarPE5"></a>

**问题级简介：**当群集节点接近内存消耗限制时，工作负载有不同的要求和预期行为。 ElastiCache 有不同的策略来处理这些情况。

**问题级优势：**适当管理可用内存和了解驱逐策略，将有助于确保了解在超过实例内存限制时的集群行为。
+ **[必需] **检测数据访问权限以评估要应用的策略。确定适当的最大内存策略，以控制是否以及如何对集群执行驱逐。
  + 当集群上的最大内存消耗完毕并且制定了允许驱逐的策略时，就会发生驱逐。在这种情况下，集群的行为取决于指定的驱逐策略。此策略可以使用集群参数组上的 `maxmemory-policy` 进行管理。
  + 原定设置策略 `volatile-lru` 通过驱逐设置了过期时间（TTL 值）的键来释放内存。最少使用（LFU）和最近最少使用（LRU）策略会根据使用情况删除键。
  + 对于 Memcached 工作负载，有一个原定设置 LRU 策略来控制每个节点上的驱逐。您可以使用亚马逊上的驱逐指标来监控您的 Amazon ElastiCache 集群上的驱逐次数。 CloudWatch
+ **[更佳]** 对删除行为进行标准化来控制对集群的性能影响，从而避免意外的性能瓶颈。
  + 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，当从集群中显式删除密钥时，`UNLINK`就像`DEL`：它会删除指定的密钥。但是，该命令在不同的线程中执行实际内存回收，因此它不会阻止，而 `DEL` 会阻止。实际的删除将在稍后异步进行。
  + 对于适用于 Redis OSS 工作负载的 6.x ElastiCache 版本，可以使用参数在参数组中修改`DEL`命令的行为。`lazyfree-lazy-user-del`
+ **[资源]：**
  + [使用 ElastiCache 参数组配置引擎参数](ParameterGroups.md)
  + [UNLINK](https://valkey.io/commands/unlink/)
  + [云财务管理与Amazon](https://www.amazonaws.cn/aws-cost-management/)

## PE 6：你如何对中的数据进行建模和交互 ElastiCache？
<a name="PerformanceEfficiencyPillarPE6"></a>

**问题级简介：**ElastiCache 在很大程度上取决于所使用的数据结构和数据模型，但它还需要考虑底层数据存储（如果存在）。了解可用的数据结构，并确保使用最适合您需求的数据结构。

**问题层面的好处：**中的数据建模ElastiCache 有多个层次，包括应用程序用例、数据类型和数据元素之间的关系。此外，每个数据类型和命令都有自己有据可查的性能签名。
+ **[最佳] **最佳实践是减少无意中覆盖数据的情况。使用可最大限度地减少重叠键名称的命名约定。数据结构的传统命名使用分层方法，例如：`APPNAME:CONTEXT:ID`（如 `ORDER-APP:CUSTOMER:123`）。

  **[资源]：**
  + [键命名](https://docs.gitlab.com/ee/development/redis.html#key-naming)
+ **[最佳]** ElastiCache 对于 Valkey 和 Redis 来说，OSS 命令的时间复杂度由 Big O 表示法定义。这次，命令的复杂性 algorithmic/mathematical 代表了其影响。在应用程序中引入新的数据类型时，需要仔细检查相关命令的时间复杂度。时间复杂度为 O(1) 的命令在时间上是恒定的，不依赖于输入的大小，但时间复杂度为 O(N) 的命令在时间上是线性的，受输入大小影响。由于 Valkey 和 Redis OSS 的单线程设计，大量的高时间复杂度操作将导致性能降低和潜在的操作超时。ElastiCache 

  **[资源]：**
  + [命令](https://valkey.io/commands/)
+ **[最佳]** APIs 用于获取 GUI 对集群中数据模型的可见性。

  **[资源]：**
  + [Redis OSS Commander](https://www.npmjs.com/package/ElastiCache for Redis-commander)
  + [Redis OSS 浏览器](https://github.com/humante/redis-browser)
  + [Redsmin](https://www.redsmin.com/)

## PE 7：如何在您的 Amazon ElastiCache 集群中记录运行缓慢的命令？
<a name="PerformanceEfficiencyPillarPE7"></a>

**问题级简介：**通过捕获、聚合和通知长时间运行的命令，可以改善性能调优效果。通过了解命令执行需要多长时间，您可以确定哪些命令会导致性能不佳，以及哪些命令会阻碍引擎以最佳状态运行。 ElastiCache 还可以将这些信息转发给亚马逊 CloudWatch 或亚马逊 Kinesis Data Firehose。

**问题级优势：**记录到专用的永久位置并为慢速命令提供通知事件，有助于进行详细的性能分析，并可用于触发自动事件。
+ **[必需]** ElastiCache 运行 Valkey 引擎 7.2 或更高版本，或者运行 Redis OSS 引擎 6.0 或更高版本，正确配置参数组并在集群上启用 SLOWLOG 日志记录。
  + 仅当引擎版本兼容性设置为 Valkey 7.2 及更高版本或 Redis OSS 6.0 或更高版本时，必需的参数才可用。
  + 当命令的服务器执行时间超过指定的值时，就会发生 SLOWLOG 日志记录。集群的行为取决于关联的参数组参数，即 `slowlog-log-slower-than` 和 `slowlog-max-len`。
  + 更改将立即生效。
+ **[最佳]** 利用我们的 Kinesis Data Firehose 功能。 CloudWatch 
  + 使用 L CloudWatch ogs Insights 和 Amazon Simple Notification Services 的筛选和警报功能，实现性能监控和事件通知。 CloudWatch
  + 使用 Kinesis Data Firehose 的流式传输功能，将 SLOWLOG 日志归档到永久存储空间或触发自动集群参数调优。
  + 确定 JSON 还是纯文本格式最适合您的需求。
  + 提供发布到 CloudWatch 或 Kinesis Data Firehose 的 IAM 权限。
+ **[更佳] **将 `slowlog-log-slower-than` 配置为原定设置值以外的值。
  + 此参数确定命令在 Valkey 或 Redis OSS 引擎中执行多长时间后会被记录为慢速运行命令。原定设置值为 10000 微秒（10 毫秒）。对于某些工作负载，原定设置值可能过高。
  + 根据应用程序需求和测试结果确定更适合您工作负载的值；但是，值过低可能会生成过多的数据。
+ **[更佳] **将 `slowlog-max-len` 保留为原定设置值。
  + 此参数决定了任何给定时间在 Valkey 或 Redis OSS 内存中捕获的慢速运行命令数上限。值为 0 会有效地禁用捕获。该值越高，存储在内存中的条目就越多，从而减少了重要信息在查看之前被驱逐的可能性。原定设置值为 128。
  + 原定设置值适用于大多数工作负载。如果需要通过 SLOWLOG 命令在 valkey-cli 的扩展时段内分析数据，请考虑增加此值。这允许在 Valkey 或 Redis OSS 内存中保留更多命令。

    如果您将 SLOWLOG 数据发送到 Logs 或 Kinesis Data Firehose，则这些数据将被保存，并且可以在系统之外进行分析，从而减少 ElastiCache 在 Valkey 或 Redis OSS 内存中存储大量运行缓慢的命令的需求。 CloudWatch 
+ **[资源]：**
  + [如何在集群中开启慢速日志？](https://repost.aws/knowledge-center/elasticache-turn-on-slow-log)
  + [日志传输](Log_Delivery.md)
  + [Redis OSS 特定参数](ParameterGroups.Engine.md#ParameterGroups.Redis)
  + [https://www.amazonaws.cn/cloudwatch/](https://www.amazonaws.cn/cloudwatch/)Amazon CloudWatch
  + [Amazon Kinesis Data Firehose](https://www.amazonaws.cn/kinesis/data-firehose/)

## PE8: Auto Scaling 如何帮助提高ElastiCache 集群的性能？
<a name="PerformanceEfficiencyPillarPE8"></a>

**问题级简介：**通过实现 Valkey 或 Redis OSS 自动缩放功能，您的 ElastiCache 组件可以随着时间的推移进行调整以自动增加或减少所需的分片或副本。这可以通过实施目标跟踪或计划的扩展策略来实现。

**问题层面的好处：**了解和规划工作负载的峰值可以确保增强缓存性能和业务连续性。 ElastiCache Auto Scaling 会持续监控您的 CPU/内存利用率，以确保您的集群以所需的性能水平运行。
+ **[必需]** 在为 Valkey 或 Redis OSS 启动集群时：ElastiCache 

  1. 确保已启用集群模式

  1. 确保该实例属于支持自动扩缩的特定类型和大小的系列

  1. 确保集群未在全局数据存储、Outposts 或本地区域中运行

  **[资源]：**
  + [扩展 Valkey 和 Redis OSS 中的集群（启用集群模式）](scaling-redis-cluster-mode-enabled.md)
  + [将自动扩缩与分片结合使用](AutoScaling-Using-Shards.md)
  + [将自动扩缩与副本结合使用](AutoScaling-Using-Replicas.md)
+ **[最佳] **确定您的工作负载是读取密集型还是写入密集型，以定义扩展策略。要想获得最佳性能，请仅使用一个跟踪指标。建议避免针对每个维度使用多个策略，因为自动扩缩策略会在达到目标时横向扩展，但只有在所有目标跟踪策略都准备好横向缩减时才会进行横向缩减。

  **[资源]：**
  + [自动扩缩策略](AutoScaling-Policies.md)
  + [定义扩展策略](AutoScaling-Scaling-Defining-Policy-API.md)
+ **[最佳] **在一段时间内持续监控性能有助于您检测工作负载变化，如果在特定时间点进行监控，将不会注意到这些变化。您可以分析四周内集群利用率的相应CloudWatch 指标，以确定目标值阈值。如果您仍然不确定要选择哪个值，我们建议您从支持的最小预定义指标值开始。

  **[资源]：**
  + [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)
+ **[更好]** 我们建议使用预期的最小和最大工作负载测试您的应用程序，以确定集群制定扩展策略和缓解可用性问题 shards/replicas 所需的确切数量。

  **[资源]：**
  + [注册可扩展目标](AutoScaling-Register-Policy.md)
  + [使用注册可扩展目标Amazon CLI](AutoScaling-Scaling-Registering-Policy-CLI.md)

# Amazon ElastiCache Well-Architected Lens 成本优化支柱
<a name="CostOptimizationPillar"></a>

成本优化支柱侧重于避免不必要的成本。关键主题包括了解和控制资金花在哪里、选择最合适的节点类型（使用支持基于工作负载需求进行数据分层的实例）、相应数量的资源类型（有多少只读副本）、分析一段时间内的支出，以及在不超支的情况下进行扩展以满足业务需求。

**Topics**
+ [

## 成本 1：如何识别和跟踪与 ElastiCache 资源相关的成本？ 您如何建立让用户能够创建、管理和处置已创建资源的机制？
](#CostOptimizationPillarCOST1)
+ [

## 成本 2：如何使用持续监控工具来优化与 ElastiCache 资源关联的成本？
](#CostOptimizationPillarCOST2)
+ [

## 成本 3：您是否应该使用支持数据分层的实例类型？ 数据分层有哪些优点？ 何时不使用数据分层实例？
](#CostOptimizationPillarCOST3)

## 成本 1：如何识别和跟踪与 ElastiCache 资源相关的成本？ 您如何建立让用户能够创建、管理和处置已创建资源的机制？
<a name="CostOptimizationPillarCOST1"></a>

**问题级简介：**要了解成本指标，需要多个团队参与和协作：软件工程、数据管理、产品负责人、财务和领导层。要确定关键成本驱动因素，则要求所有相关方了解服务使用控制杠杆和成本管理的利弊，这通常是成功与不太成功的成本优化工作之间的关键区别。确保您有适当的流程和工具来跟踪从开发到生产和停用期间创建的资源，这有助于您管理与 ElastiCache 关联的成本。

**问题级优势：**要持续跟踪与您工作负载关联的所有成本，需要深入了解将 ElastiCache 作为其组件之一的架构。此外，您应该制定成本管理计划，以收集使用情况并将其与预算进行比较。
+ **[必需] **建立一个云卓越中心（CCoE），作为其创始章程之一，负责定义、跟踪组织的 ElastiCache 使用情况，并根据相关指标采取措施。如果 CCoE 存在且正常运行，请确保其知道如何读取和跟踪与 ElastiCache 关联的成本。创建资源时，使用 IAM 角色和 IAM policy 来验证只有特定的团队和组才能实例化资源。这确保了成本与业务成果相关联，并从成本角度建立了明确的问责制。

  1. CCoE 应基于分类数据识别、定义和发布与关键 ElastiCache 使用情况相关的成本指标（每月定期更新这），例如：

     1. 使用的节点类型及其属性：标准与内存优化型、按需实例与预留实例、区域和可用区

     1. 环境类型：免费环境、开发环境、测试环境和生产环境

     1. 备份存储和保留策略

     1. 区域内和跨区域的数据传输

     1. 在 Amazon Outposts 上运行的实例 

  1. CCoE 由一个跨职能团队组成，其代表来自组织中软件工程、数据管理、产品团队、财务团队和领导团队的非专属代表。

  **[资源]：**
  + [创建云卓越中心](https://docs.amazonaws.cn/whitepapers/latest/cost-optimization-laying-the-foundation/cloud-center-of-excellence.html)
  + [Amazon ElastiCache 定价](https://www.amazonaws.cn/elasticache/pricing/)
+ **[必需] **使用成本分配标签以较低的粒度跟踪成本。使用 Amazon 成本管理来可视化、了解和管理一段时间内的 Amazon 成本和使用情况。

  1. 使用标签来整理资源，并可以使用成本分配标签来细致地跟踪 Amazon 成本。在您激活成本分配标签后，Amazon 将使用成本分配标签来整理您的资源分配报告中的资源成本，以方便您对 Amazon 成本进行分类和跟踪。Amazon 提供了两种类型的成本分配标签：Amazon 生成的标签和用户定义的标签。Amazon 将为您定义、创建和应用 Amazon 生成的标签，而您将定义、创建和应用用户定义的标签。您必须先分别激活这两种类型的标签，然后这些标签才能显示在成本管理中或成本分配报告上。

  1. 使用成本分配标签整理 Amazon 账单，以反映您自己的成本结构。在 Amazon ElastiCache 中向资源添加成本分配标签时，将可以根据资源标签值对发票上的费用进行分组，从而跟踪您的成本。您应该考虑合并标签，以采用更高详细信息级别跟踪成本。

  **[资源]：**
  + [使用 Amazon 成本分配标签](https://docs.amazonaws.cn/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)
  + [使用成本分配标签监控成本](Tagging.md)
  + [Amazon Cost Explorer](https://www.amazonaws.cn/aws-cost-management/aws-cost-explorer/)
+ **[最佳] **将 ElastiCache 成本与涵盖整个组织的指标联系起来。

  1. 考虑业务指标以及延迟等运营指标 - 您业务模式中有哪些概念可以被不同角色理解？ 这些指标需要让组织中尽可能多的角色能够理解。

  1. 示例 - 同时服务的用户数、每个操作和用户的最大和平均延迟、用户参与度分数、用户每周返回率、会话长度/用户、放弃率、缓存命中率以及跟踪的键

  **[资源]：**
  + [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)
+ **[良好] **在使用 ElastiCache 的整个工作负载中，保持最新的架构和运营指标和成本可见性。

  1. 了解您的整个解决方案生态系统，ElastiCache 往往是其技术组合中完整 Amazon 服务生态系统的一部分，例如，从客户端到 API Gateway、Redshift 和 QuickSight（用于报告工具）。

  1. 在架构图上映射解决方案的各个组成部分，包括客户端、连接、安全性、内存操作、存储、资源自动化、数据访问和管理。每层都连接到整个解决方案且具有其自身的需求和功能，可以助力和/或帮助您管理总体成本。

  1. 您的图表应包括计算、网络、存储、生命周期策略、指标收集的使用情况以及应用程序的操作和功能 ElastiCache 元素

  1. 工作负载的要求可能会不断变化，为了在工作负载成本管理中保持主动性，您必须继续维护和记录您对基本组件以及主要功能目标的理解。

  1. 管理层在可见性、问责制、优先级划分和资源方面的支持对于您为 ElastiCache 制定有效的成本管理策略至关重要。

## 成本 2：如何使用持续监控工具来优化与 ElastiCache 资源关联的成本？
<a name="CostOptimizationPillarCOST2"></a>

**问题级简介：**您需要在您的 ElastiCache 成本和应用程序性能指标之间取得适当的平衡。Amazon CloudWatch 提供关键运营指标的可见性，可以帮助您评测，相对于您的需求，您的 ElastiCache 资源是过度使用还是未得到充分利用。从成本优化的角度来看，您需要了解何时过度预调配，并能够开发适当的机制来调整您的 ElastiCache 资源的规模，同时保持运营、可用性、弹性和性能需求。

**问题级优势：**在理想状态下，您将预调配足够的资源来满足工作负载的运维需求，并且不会出现未充分利用的资源，从而导致成本状态欠佳。您需要能够识别和避免长时间运行规模过大的 ElastiCache 资源。
+ **[必需] **使用 CloudWatch 监控您的 ElastiCache 集群，并分析这些指标与您 Amazon Cost Explorer 成本管理服务控制面板的相关性。

  1. ElastiCache 提供主机层面级指标（例如 CPU 使用率）和特定于缓存引擎软件的指标（例如缓存获取次数和缓存未命中数）。这些指标每隔 60 秒对每个缓存节点进行测量并发布结果。

  1. ElastiCache 性能指标（CPUUtilization、EngineUtilization、SwapUsage、CurrConnections 和 Evictions）可能表明您需要纵向扩展/缩减（使用更大/更小的缓存节点类型）或横向缩减/横向扩展（添加更多/更少的分片）。通过创建 PlayBook 矩阵来了解扩展决策的成本影响，该矩阵可估算满足应用程序性能阈值所需的额外成本以及最小和最大时间长度。

  **[资源]：**
  + [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)
  + [应监控哪些指标？](CacheMetrics.WhichShouldIMonitor.md)
  + [Amazon ElastiCache 定价](https://www.amazonaws.cn/elasticache/pricing/)
+ **[必需] **了解并记录您的备份策略和成本影响。

  1. 使用 ElastiCache，备份存储在 Amazon S3 中，而 Amazon S3 可提供持久存储。您需要了解与故障恢复能力有关的成本影响。

  1. 启用自动备份，这将删除超过保留期限的备份文件。

  **[资源]：**
  + [计划自动备份](backups-automatic.md)
  + [Amazon Simple Storage Service 定价](https://www.amazonaws.cn/s3/pricing/)
+ **[最佳] **作为一种深思熟虑的策略，应对实例使用预留节点，以管理已充分了解和记录的工作负载的成本。预留节点需支付预付费用，此费用取决于节点类型和预留时间长短（一年或三年）。此费用远低于按需节点产生的每小时使用费。

  1. 在收集到足够的数据来评估预留实例需求之前，您可能需要使用按需节点运行您的 ElastiCache 集群。规划和记录满足需求所需的资源，并比较不同实例类型（按需型与预留）的预期成本

  1. 定期评测新的可用缓存节点类型，并从成本和运营指标的角度评测将您的实例集迁移到新的缓存节点类型是否合理

## 成本 3：您是否应该使用支持数据分层的实例类型？ 数据分层有哪些优点？ 何时不使用数据分层实例？
<a name="CostOptimizationPillarCOST3"></a>

**问题级简介：**选择适当的实例类型不仅会对性能和服务级别产生影响，还会对财务状况产生影响。实例类型具有不同的关联成本。选择一种或几种可以满足内存中所有存储需求的大型实例类型可能是一个自然而然的决定。但是，随着项目日趋成熟，这可能会对成本产生重大影响。要确保选择正确的实例类型，需要定期检查 ElastiCache 对象的空闲时间。

**问题级优势：**您应该清楚地了解各种实例类型对您当前和未来的成本有何影响。边际或定期的工作负载变化不应导致过多的成本变化。如果工作负载允许，支持数据分层的实例类型提供的每可用存储的价格将更优惠。这是因为每实例可用的 SSD 存储数据分层实例所支持的每实例的总数据容量要高得多。
+ **[必需]** 了解数据分层实例的局限性

  1. 仅适用于 ElastiCache for Valkey 或 ElastiCache for Redis OSS 集群。

  1. 支持数据分层的实例类型非常有限。

  1. 仅支持 ElastiCache for Redis OSS v6.2 及更高版本

  1. 大型项目不会交换到 SSD。超过 128MiB 的对象保留在内存中。

  **[资源]：**
  + [数据分层](data-tiering.md)
  + [Amazon ElastiCache 定价](https://www.amazonaws.cn/elasticache/pricing/)
+ **[必需] **了解您的工作负载定期访问数据库的百分比。

  1. 数据分层实例非常适合经常访问整个数据集的一小部分但仍需要快速访问其余数据的工作负载。换句话说，热数据与温数据的比例约为 20:80。

  1. 制定对象空闲时间的集群级跟踪。

  1. 超过 500Gb 数据的大型实现是不错的选择
+ **[必需] **了解数据分层实例对于某些工作负载不是可选的。

  1. 访问不常用的对象会产生少许性能成本，因为这些对象会被交换到本地 SSD。如果您的应用程序对响应时间敏感，请测试对工作负载的影响。

  1. 不适合主要存储大小超过 128MiB 的大型对象的缓存。

  **[资源]：**
  + [限制](data-tiering.md#data-tiering-prerequisites)
+ **[最佳] **预留实例类型支持数据分层。这可确保在每个实例的数据存储量方面实现最低的成本。

  1. 在更好地了解您的需求之前，您可能需要使用非数据分层实例运行 ElastiCache 集群。

  1. 分析您的 ElastiCache 集群的数据使用模式。

  1. 创建定期收集对象空闲时间的自动作业。

  1. 如果您发现很大一部分对象（大约 80%）在认为适合您工作负载的时间段内处于空闲状态，请记录调查发现，并建议将集群迁移到支持数据分层的实例。

  1. 定期评测新的可用缓存节点类型，并从成本和运营指标的角度评测将您的实例集迁移到新的缓存节点类型是否合理。

  **[资源]：**
  + [对象空闲时间](https://valkey.io/commands/object-idletime/)
  + [Amazon ElastiCache 定价](https://www.amazonaws.cn/elasticache/pricing/)

# 常见故障排除步骤和最佳实践 ElastiCache
<a name="wwe-troubleshooting"></a>

以下主题针对您在使用时可能遇到的错误和问题提供了疑难解答建议 ElastiCache。如果您发现某个问题未在此处列出，可以使用此页上的反馈按钮来报告。

有关更多故障排除建议和常见支持问题的答案，请访问 [Amazon知识中心](https://www.amazonaws.cn/premiumsupport/knowledge-center/)

**Topics**
+ [

## 连接问题
](#wwe-troubleshooting.connection)
+ [

## Valkey 或 Redis OSS 客户端错误
](#wwe-troubleshooting.clienterrors)
+ [

## 对 ElastiCache 无服务器中的高延迟进行故障排除
](#wwe-troubleshooting.latency)
+ [

## 对无服务器中的限制问题进行故障排除 ElastiCache
](#wwe-troubleshooting.throttling)
+ [

# 持续连接问题
](TroubleshootingConnections.md)
+ [

## 相关主题
](#wwe-troubleshooting.related)

## 连接问题
<a name="wwe-troubleshooting.connection"></a>

如果您无法连接到 ElastiCache 缓存，请考虑以下方法之一：

1. **使用 TLS：**如果您在尝试连接到 ElastiCache 终端节点时遇到连接挂起的情况，则可能没有在客户端中使用 TLS。如果您使用的是 ElastiCache 无服务器，则传输中的加密始终处于启用状态。请确保您的客户端使用 TLS 连接到缓存。[了解有关连接到启用了 TLS 的缓存的更多信息](connect-tls.md)。

1. **VP ElastiCache C：**只能从 VPC 内部访问缓存。确保您访问缓存的 EC2 实例和缓存是在同一 VPC 中创建的。 ElastiCache 或者，您必须在您的 EC2 实例所在的 [V](https://docs.amazonaws.cn/vpc/latest/peering/what-is-vpc-peering.html) PC 和创建缓存的 VPC 之间启用 VPC 对等关系。

1. **安全组：**ElastiCache 使用安全组来控制对缓存的访问权限。请考虑以下事项：

   1. 确保您的 ElastiCache 缓存使用的安全组允许从您的 EC2 实例对其进行入站访问。请参阅[此处](https://docs.amazonaws.cn/vpc/latest/userguide/security-group-rules.html)，了解如何在安全组中正确设置入站规则。

   1. 确保缓存使用的安全组允许访问 ElastiCache 缓存的端口（无服务器端口 6379 和 6380，基于节点的集群默认为 6379 和 6379）。 ElastiCache 使用这些端口接受 Valkey 或 Redis OSS 命令。点击[此处](set-up.md#elasticache-install-grant-access-VPN)详细了解如何设置端口访问权限。

如果连接仍然有问题，请参阅[持续连接问题](TroubleshootingConnections.md)了解其他步骤。

## Valkey 或 Redis OSS 客户端错误
<a name="wwe-troubleshooting.clienterrors"></a>

ElastiCache 只有使用支持 Valkey 或 Redis OSS 集群模式协议的客户端才能访问无服务器。基于节点的集群可通过客户端以任一模式访问，具体取决于集群配置。

如果您在客户端中遇到错误，请考虑以下事项：

1. **集群模式：**如果您在使用 SE [LE](https://valkey.io/commands/select/) CT 命令时遇到 CROSSLOT 错误或错误，则可能正在尝试使用不支持集群协议的 Valkey 或 Redis OSS 客户端访问启用集群模式的缓存。 ElastiCache Serverless 仅支持支持 Valkey 或 Redis OSS 集群协议的客户端。如果您想使用“已禁用集群模式”（CMD）的 Valkey 或 Redis OSS，则必须创建基于节点的集群。

1. **CROSSLOT 错误：**如果遇到 `ERR CROSSLOT Keys in request don't hash to the same slot` 错误，可能是因为您正在尝试访问不属于集群模式缓存中同一槽的键。提醒一下， ElastiCache Serverless 始终在集群模式下运行。仅当涉及的所有键都在同一个哈希槽中时，才允许使用涉及多个键的多键操作、事务或 Lua 脚本。

有关配置 Valkey 或 Redis OSS 客户端的其他最佳实践，请查看本[博客文章](https://www.amazonaws.cn/blogs/database/best-practices-redis-clients-and-amazon-elasticache-for-redis/)。

## 对 ElastiCache 无服务器中的高延迟进行故障排除
<a name="wwe-troubleshooting.latency"></a>

如果您的工作负载出现高延迟，则可以分析 CloudWatch `SuccessfulReadRequestLatency`和`SuccessfulWriteRequestLatency`指标，以检查延迟是否与 ElastiCache 无服务器有关。这些指标衡量的是 ElastiCache 无服务器内部的延迟，不包括客户端延迟以及您的客户端和 ElastiCache 无服务器端点之间的网络访问时间。

**对客户端延迟进行故障排除**

如果您注意到客户端的延迟时间有所增加，但没有相应的增加``CloudWatch `SuccessfulReadRequestLatency`以及衡量服务器端延迟的`SuccessfulWriteRequestLatency`指标，请考虑以下几点：
+ **确保安全组允许访问端口 6379 和 6380：** ElastiCache Serverless 使用 6379 端口作为主端点，6380 端口作为读取器端点。某些客户端会为每个新连接建立与这两个端口的连接，即使您的应用程序没有使用“从副本读取”功能也是如此。如果您的安全组不允许对这两个端口进行入站访问，那么建立连接可能需要更长的时间。点击[此处](set-up.md#elasticache-install-grant-access-VPN)详细了解如何设置端口访问权限。

**对服务器端延迟进行故障排除**

一些变化和偶尔的峰值不用担心 但是，如果`Average`统计数据显示急剧增长并持续存在，则应查看和您的 Personal Health Dashboard 以获取更多信息。Amazon Health Dashboard如有必要，可以考虑向提出支持案例Amazon Web Services 支持。

考虑采用以下最佳实践和策略来减少延迟：
+ **启用从副本读取：**如果您的应用程序允许，我们建议您在 Valkey 或 Redis OSS 客户端中启用“从副本读取”功能，以扩展读取并降低延迟。启用后， ElastiCache Serverless 会尝试将您的读取请求路由到与您的客户端位于同一可用区 (AZ) 的副本缓存节点，从而避免跨可用区网络延迟。请注意，在客户端启用“从副本读取”功能意味着您的应用程序接受数据的最终一致性。如果在写入键后尝试读取，您的应用程序可能会在一段时间内收到较旧的数据。
+ **确保您的应用程序部署在与缓存 AZs 相同的环境中：如果您的**应用程序部署在与缓存 AZs 相同的环境中，您可能会观察到更高的客户端延迟。创建无服务器缓存时，您可以提供您的应用程序将从中访问缓存的子网， ElastiCache Serverless 将在这些子网中创建 VPC 终端节点。确保您的应用程序部署在同一位置 AZs。否则，您的应用程序在访问缓存时可能会产生跨可用区跳转，导致客户端延迟增加。
+ **重用连接：**ElastiCache 无服务器请求是使用 RESP 协议通过启用 TLS 的 TCP 连接发出的。启动连接（包括验证连接，如果已配置）需要时间，因此第一个请求的延迟会高于一般延迟。通过已初始化的连接发出的请求可提供始终如一 ElastiCache的低延迟。因此，您应该考虑使用连接池或重复使用现有的 Valkey 或 Redis OSS 连接。
+ **扩展速度：**ElastiCache Serverless 会随着请求速率的增长而自动扩展。请求速率的突然大幅增加（快 ElastiCache 于 Serverless 的扩展速度）可能会在一段时间内导致延迟升高。 ElastiCache Serverless 通常可以快速提高其支持的请求速率，最多需要 10-12 分钟才能将请求速率提高一倍。
+ **检查长时间运行的命令：**某些 Valkey 或 Redis OSS 命令（包括 Lua 脚本或大型数据结构上的命令）可能会运行很长时间。要识别这些命令，请 ElastiCache 发布命令级指标。借助[ElastiCache 无服务器](serverless-metrics-events-redis.md#serverless-metrics)，您可以使用这些`BasedECPUs`指标。
+ 受@@ **限制的请求：**在 ElastiCache Serverless 中限制请求时，您的应用程序中的客户端延迟可能会增加。[当请求在 ElastiCache Serverless 中受到限制时，您应该会看到无服务器指标有所增加。`ThrottledRequests` ElastiCache ](serverless-metrics-events-redis.md#serverless-metrics)请查看以下部分，了解如何对节流的请求进行故障排除。
+ **密钥和请求的均匀分布：** ElastiCache 对于 Valkey 和 Redis OSS，每个插槽的密钥或请求分布不均会导致热槽，从而导致延迟增加。 ElastiCache 在执行简单命令的工作负载中，Serverless 在单个插槽上最多支持 30,000 ECPUs/second （使用从副本读取 ECPUs/second 时为 90,000）。 SET/GET 建议您评估键和请求在槽中的分布情况，并确保在您的请求速率超过此限制时实现均匀分配。

## 对无服务器中的限制问题进行故障排除 ElastiCache
<a name="wwe-troubleshooting.throttling"></a>

在服务导向型架构和分布式系统中，限制各种服务组件处理 API 调用的速率称为“限制”。这可以平滑峰值，控制组件吞吐量中的不匹配情况，并在出现意外操作事件时实现更可预测的恢复。 ElastiCache Serverless 专为这些类型的架构而设计，大多数 Valkey 或 Redis OSS 客户端都内置了针对受限请求的重试功能。一定程度上的限制对应用程序而言不一定是问题，但是持续限制数据工作流中对延迟敏感的部分可能会对用户体验产生负面影响，并会降低系统的整体效率。

[当请求在 ElastiCache Serverless 中受到限制时，您应该会看到无服务器指标有所增加。`ThrottledRequests` ElastiCache ](serverless-metrics-events-redis.md#serverless-metrics)如果您发现被节流的请求数量较多，请考虑以下事项：
+ **扩展速度：**ElastiCache Serverless会随着您摄取更多数据或请求速率的增长而自动扩展。如果您的应用程序的扩展速度快于Serverless的扩展速度，则您的请求可能会受到限制，而 ElastiCache ElastiCache Serverless可以扩展以适应您的工作负载。 ElastiCache Serverless 通常可以快速增加存储大小，最多需要 10-12 分钟才能将缓存中的存储大小增加一倍。
+ **密钥和请求的均匀分布：** ElastiCache 对于 Valkey 和 Redis OSS，每个插槽的密钥或请求分布不均可能会导致出现热槽。如果单个插槽的请求速率超过 30,000， ECPUs/second 并且处于执行简单命令的工作负载中，则热插槽可能会导致请求受限。 SET/GET 同样， ElastiCache 对于 Memcached，如果请求速率超过 30,000 /秒，热键可能会导致请求受限。 ECPUs
+ **从副本读取：**如果您的应用程序允许，可以考虑“从副本读取”功能。大多数 Valkey 或 Redis OSS 客户端都可以配置为“扩展读取”，将读取定向到副本节点。通过该功能，您可以扩展读取流量。此外， ElastiCache Serverless 会自动将副本请求中的读取路由到与您的应用程序位于同一可用区的节点，从而降低延迟。启用从副本读取后，对于使用简单 SET/GET 命令的工作负载，您可以在单个插槽 ECPUs/second 上实现多达 90,000 个。

# 持续连接问题
<a name="TroubleshootingConnections"></a>

在排除 ElastiCache 的持续连接问题时，必须核查以下项目：

**Topics**
+ [

## 安全组
](#Security_groups)
+ [

## 网络 ACL
](#Network_ACLs)
+ [

## 路由表
](#Route_tables)
+ [

## DNS 解析
](#DNS_Resolution)
+ [

## 通过服务器端诊断识别问题
](#Diagnostics)
+ [

## 网络连接验证
](#Connectivity)
+ [

## 网络相关限制
](#Network-limits)
+ [

## CPU 使用率
](#CPU-Usage)
+ [

## 从服务器端终止的连接
](#Connections-server)
+ [

## Amazon EC2 实例的客户端问题排除
](#Connections-client)
+ [

## 解剖完成单个请求所花费的时间
](#Dissecting-time)

## 安全组
<a name="Security_groups"></a>

安全组是虚拟防火墙，保护您的 ElastiCache 客户端（EC2 实例、Amazon Lambda 函数、Amazon ECS 容器等）和 ElastiCache 缓存。安全组是有状态的，也就是说在允许传入或传出流量后，对该流量所做的响应将在该特定安全组的上下文中自动获得授权。

有状态功能要求安全组跟踪所有已授权的连接，而且对跟踪的连接有限制。如果达到该限制，新连接将会失败。有关如何识别是否在客户端或 ElastiCache 侧已达到该限制的帮助，请参阅故障排除部分。

您可以将单个安全组同时分配给客户端和 ElastiCache 集群，也可以为每个安全组分配单个安全组。

对于这两种情况，您都需要允许 ElastiCache 端口上来自源的 TCP 出站流量，并允许同一端口上到 ElastiCache 的入站流量。Memcached 的默认端口为 11211，Valkey 或 Redis OSS 的默认端口为 6379。默认情况下，安全组允许所有出站流量。在这种情况下，只需要目标安全组中的入站规则。

有关更多信息，请参阅[用于访问 Amazon VPC 中 ElastiCache 集群的访问模式](elasticache-vpc-accessing.md)。

## 网络 ACL
<a name="Network_ACLs"></a>

网络访问控制列表 (ACL) 是无状态规则。必须在入站和出站两个方向上都允许流量，才能成功。网络 ACL 将分配给子网，而不是特定资源。相同的 ACL 可以同时分配给 ElastiCache 和客户端资源，尤其是当它们位于同一子网中时。

默认情况下，网络 ACL 允许所有流量。但可对它们自定义，以拒绝或允许流量。此外，ACL 规则的评估是按顺序进行的，也就是说，匹配流量的编号最小的规则将允许或拒绝该流量。允许 Valkey 或 Redis OSS 流量的最低配置为：

客户端网络 ACL：
+ **入站规则：**
+ 规则编号：最好低于所有拒绝规则；
+ 类型：自定义 TCP 规则；
+ 协议：TCP
+ 端口范围：1024 – 65535
+ 来源：0.0.0.0/0（或为 ElastiCache 集群子网创建单独的规则）
+ 允许/拒绝：允许
+ **出站规则：**
+ 规则编号：最好低于所有拒绝规则；
+ 类型：自定义 TCP 规则；
+ 协议：TCP
+ 端口范围：6379
+ 来源：0.0.0.0/0（或 ElastiCache 集群子网。请记住，在发生故障转移或扩缩集群时，使用特定 IP 可能会产生问题）
+ 允许/拒绝：允许

ElastiCache 网络 ACL：
+ **入站规则：**
+ 规则编号：最好低于所有拒绝规则；
+ 类型：自定义 TCP 规则；
+ 协议：TCP
+ 端口范围：6379
+ 来源：0.0.0.0/0（或为 ElastiCache 集群子网创建单独的规则）
+ 允许/拒绝：允许
+ **出站规则：**
+ 规则编号：最好低于所有拒绝规则；
+ 类型：自定义 TCP 规则；
+ 协议：TCP
+ 端口范围：1024 – 65535
+ 来源：0.0.0.0/0（或 ElastiCache 集群子网。请记住，在发生故障转移或扩缩集群时，使用特定 IP 可能会产生问题）
+ 允许/拒绝：允许

有关更多信息，请参阅[网络 ACL](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-network-acls.html)。

## 路由表
<a name="Route_tables"></a>

与网络 ACL 类似，每个子网可以具有不同的路由表。如果客户端和 ElastiCache 集群位于不同的子网中，请确保它们的路由表允许它们相互访问。

环境越复杂（涉及多个 VPC、动态路由或网络防火墙），排除问题可能会变得越难。请参阅 [网络连接验证](#Connectivity) 以确认您的网络设置是否合适。

## DNS 解析
<a name="DNS_Resolution"></a>

ElastiCache 提供基于 DNS 名称的服务终端节点。可用的端点包括 `Configuration`、`Primary`、`Reader` 和 `Node` 端点。有关更多信息，请参阅[查找连接终端节点](Endpoints.md)。

在故障转移或集群修改的情况下，与端点名称关联的地址可能会发生变化，并将自动更新。

自定义 DNS 设置（即不使用 VPC DNS 服务）可能不知道 ElastiCache 提供的 DNS 名称。确保您的系统可以使用类似 `dig`（如下所示）或 `nslookup` 的工具来解析 ElastiCache 端点。

```
$ dig +short example.xxxxxx.ng.0001.use1.cache.amazonaws.com
example-001.xxxxxx.0001.use1.cache.amazonaws.com.
1.2.3.4
```

您还可以通过 VPC DNS 服务强制进行名称解析：

```
$ dig +short example.xxxxxx.ng.0001.use1.cache.amazonaws.com @169.254.169.253
example-001.tihewd.0001.use1.cache.amazonaws.com.
1.2.3.4
```

## 通过服务器端诊断识别问题
<a name="Diagnostics"></a>

ElastiCache 引擎中的 CloudWatch 指标和运行时信息是识别连接问题潜在来源的常见来源或信息。良好的分析通常从以下项目开始：
+ CPU 使用率：Valkey 和 Redis OSS 是多线程应用程序。但是，每个命令的执行都发生在一个（主）线程中。为此，ElastiCache 提供了指标 `CPUUtilization` 和 `EngineCPUUtilization`。`EngineCPUUtilization` 提供专用于 Valkey 或 Redis OSS 进程的 CPU 使用率，而 `CPUUtilization` 提供所有 vCPU 的使用率。具有多个 vCPU 的节点通常具有不同的 `CPUUtilization` 和 `EngineCPUUtilization` 值，第二个值通常更高。高 `EngineCPUUtilization` 可能是由于请求数量增加或需要大量 CPU 时间才能完成的复杂操作引起的。您可以通过以下方式标识两者：
  + 增加的请求数：检查与 `EngineCPUUtilization` 模式匹配的其他指标的增加。有用的指标包括：
    + `CacheHits` 和 `CacheMisses`：成功的请求数量或在缓存中找不到有效项目的请求的数量。如果未命中与命中之比较高，则应用程序会因无效的请求浪费时间和资源。
    + `SetTypeCmds` 和 `GetTypeCmds`：这些与 `EngineCPUUtilization` 相关的指标可以帮助理解写入请求（由 `SetTypeCmds` 衡量）还是读取请求（由 `GetTypeCmds` 衡量）的负载明显更高。如果负载主要是读取，则使用多个只读副本可以在多个节点之间平衡请求，并将主节点留出用于写入。在已禁用集群模式的集群中，使用只读副本可以通过使用 ElastiCache 读取器终端节点在应用程序中创建额外连接配置来完成。有关更多信息，请参阅[查找连接终端节点](Endpoints.md)。读取操作必须提交到此额外连接。写入操作将通过常规主端点完成。在已启用集群模式的情况下，建议使用支持本机只读副本的库。使用正确的标记，库将能够自动发现集群拓扑、副本节点，通过 [READONLY](https://valkey.io/commands/readonly) Valkey 或 Redis OSS 命令启用读取操作，然后将读取请求提交到副本。
  + 增加的连接数：
    + `CurrConnections` 和 `NewConnections`：`CurrConnection` 是数据点集合时已建立的连接数，而 `NewConnections` 显示的是在期间内创建的连接数。

      创建和处理连接意味着大量的 CPU 开销。此外，创建新连接所需的 TCP 三向握手会对整体响应时间产生负面影响。

      每分钟有数千个 `NewConnections` 的 ElastiCache 节点表明连接仅由几个命令创建和使用，这不是最佳做法。最佳做法是保持已建立连接并将其重复用于新操作。当客户端应用程序支持并正确实现连接池或持久连接时，可采用此最佳做法。使用连接池时，`currConnections` 数量没有很大的变化，`NewConnections` 应该尽可能的低。Valkey 和 Redis OSS 通过少量的当前连接提供最佳性能。将当前连接保持为数十或数百个的顺序，可最大限度地减少支持单独连接（如客户端缓冲区和 CPU 周期）的资源使用，以便为连接提供服务。
  + 网络吞吐量：
    + 确定带宽：ElastiCache 节点的网络带宽与节点大小是成比例的。由于应用程序具有不同的特征，因此结果可能会因工作负载而异。例如，小请求比率较高的应用程序对 CPU 使用率的影响往往大于网络吞吐量，而较大的密钥则会导致更高的网络利用率。因此，建议使用实际工作负载测试节点，以便更好地了解限制。

      模拟应用程序的负载可以提供更准确的结果。但是，通过基准工具可以很好地了解限制。
    + 对于主要是读取请求的情况，使用副本进行读取操作将减轻主节点上的负载。如果使用场景主要是写入，则使用许多副本将增加网络使用率。对于写入主节点的所有字节，有 N 个字节将被发送到副本，N 为副本数。对于写入密集型工作负载，最佳做法是在启用了集群模式的情况下使用 ElastiCache for Redis OSS，这样写入可以跨多个分片得到平衡，或者纵向扩展到具有更多网络功能的节点类型。
    + CloudWatch 指标 `NetworkBytesIn` 和 `NetworkBytesOut` 分别提供进入或离开节点的数据量。`ReplicationBytes` 是专用于数据复制的流量。

    有关更多信息，请参阅 [网络相关限制](#Network-limits)。
  + 复杂命令：Redis OSS 命令在单个线程上提供，这意味着按顺序处理请求。单个慢速命令可能会影响其他请求和连接，最终导致超时。对多个值、密钥或数据类型进行操作的命令的使用必须仔细完成。根据参数数量或其输入或输出值的大小，可以阻止或终止连接。

    一个显著例子就是 `KEYS` 命令。此命令扫描整个密钥空间来搜索给定模式，并在其执行过程中阻止其他命令的执行。Redis OSS 使用“Big O”符号来描述其命令的复杂性。

    密钥命令具有 O (N) 时间复杂性，N 表示数据库中的密钥数。因此，密钥数越大，命令的速度就越慢。`KEYS` 可能会以不同的方式制造麻烦：如果未使用搜索模式，则该命令会返回所有可用的密钥名称。在含有数千或百万个项目的数据库中，这将会创建大量输出并充满网络缓冲区。

    如果使用了搜索模式，则只有匹配该模式的密钥才会返回到客户端。但是，引擎仍然会扫描整个密钥空间来搜索它，并且完成命令的时间将是相同的。

    `KEYS` 命令的一个替代选择是 `SCAN` 命令。此命令会遍历密钥空间并限制特定数量项目中的迭代，避免引擎上的长时间阻塞。

    扫描具有 `COUNT` 参数，用于设置迭代块的大小。默认值为 10（每次迭代 10 个项目）。

    取决于数据库中的项目数，较小的 `COUNT` 值数据块将需要更多的迭代才能完成全面扫描，而且较大的值将使引擎在每次迭代中处于繁忙状态。虽然小计数值将使 `SCAN` 在大数据库变慢，较大的值可能会导致出现 `KEYS` 中提及的相同问题。

    例如，运行 `SCAN` 命令（计数值为 10）将需要在具有 100 万个密钥的数据库上进行 10 万次重复操作。如果平均网络往返时间为 0.5 毫秒，则传输请求将耗时大约 5 万毫秒（50 秒）。

    另一方面，如果计数值为 100,0000，则需要一次迭代，并且传输它只需要 0.5 毫秒。但是，在命令完成扫描所有密钥空间之前，该引擎将完全阻止其他操作。

    除了 `KEYS` 之外，其他几个命令如果使用不当也可能会有害。要查看所有命令及其各自的时间复杂度的列表，请转到 [Valkey 和 Redis OSS 命令](https://valkey.io/commands)。

    潜在问题的示例：
    + Lua 脚本：Valkey 和 Redis OSS 提供了嵌入式 Lua 解释器，允许在服务器端执行脚本。Valkey 和 Redis OSS 上的 Lua 脚本在引擎级别执行，而且根据定义，其具有原子性，这意味着在脚本执行过程中不允许运行其他命令或脚本。Lua 脚本提供了直接在引擎上运行多个命令、决策算法、数据解析和其他操作的可能性。虽然脚本的原子性和分载应用程序的可能性很诱人，但必须小心使用脚本，并且仅用于小型操作。在 ElastiCache 上，Lua 脚本的执行时间限制为 5 秒。未写入密钥空间的脚本将在 5 秒后自动终止。为了避免数据损坏和不一致，如果脚本执行在 5 秒内未完成并且在执行过程中有任何写入，则节点将进行故障转移。[事务](https://valkey.io/topics/transactions)是保证 Redis OSS 中多个相关密钥修改的一致性的替代方案。事务允许执行一个命令块，监视现有密钥以进行修改。如果任何受监视的密钥在事务完成之前发生了更改，则会放弃所有修改。
    + 批量删除项目：`DEL` 命令接受多个参数，这些参数是要删除的密钥名称。删除操作是同步的，如果参数列表很大，或者包含大列表、集合、排序集或哈希（包含多个子项的数据结构），则需要大量 CPU 时间。换句话说，如果具有许多元素，那么即使删除单个密钥也可能需要相当长的时间。`DEL` 的替代项选择为 `UNLINK`，这是自 Redis OSS 4 以来可用的异步命令。`UNLINK` 必须尽可能优先于 `DEL`。从 ElastiCache for Redis OSS 6x 开始，`lazyfree-lazy-user-del` 参数使 `DEL` 命令在启用时的行为类似于 `UNLINK`。有关更多信息，请参阅 [Redis OSS 6.0 参数更改](ParameterGroups.Engine.md#ParameterGroups.Redis.6-x)。
    + 对多个密钥进行操作的命令：`DEL` 在先前是作为接受多个实际参数的命令提起，其执行时间直接与之成正比。但是，Redis OSS 提供了更多工作原理类似的命令。例如，`MSET` 和 `MGET` 允许一次插入或检索多个字符串键。使用它们可能有助于降低多个单独的 `SET` 或 `GET` 命令固有的网络延迟。但是，参数列表过大会影响 CPU 使用率。

       虽然仅仅 CPU 使用率并不是导致连接问题的原因，但是通过多个密钥花费过多时间处理单个或少量命令可能会导致其他请求失败，并增加总体 CPU 使用率。

      密钥的数量及其大小将影响命令的复杂性，从而影响完成时间。

      其他可对多个密钥进行操作的命令示例：`HMGET`、`HMSET`、`MSETNX`、`PFCOUNT`、`PFMERGE`、`SDIFF`、`SDIFFSTORE`、`SINTER`、`SINTERSTORE`、`SUNION`、`SUNIONSTORE`、`TOUCH`、`ZDIFF`、`ZDIFFSTORE`、`ZINTER` 或 `ZINTERSTORE`。
    + 对多种数据类型进行操作的命令：Redis OSS 还提供针对一个或多个密钥执行操作的命令，无论其数据类型如何。ElastiCache for Redis OSS 提供了指标 `KeyBasedCmds` 来监控此类命令。此指标汇总了以下命令在所选时间段内的执行情况：
      + O(N) 复杂性：
        + `KEYS`
      + O(1)
        + `EXISTS`
        + `OBJECT`
        + `PTTL`
        + `RANDOMKEY`
        + `TTL`
        + `TYPE`
        + `EXPIRE`
        + `EXPIREAT`
        + `MOVE`
        + `PERSIST`
        + `PEXPIRE`
        + `PEXPIREAT`
        + `UNLINK (O(N)` 来回收内存。但是，内存回收任务发生在一个单独的线程中，并且不会阻塞引擎
      + 根据数据类型不同的复杂性时间：
        + `DEL`
        + `DUMP`
        + `RENAME` 被认为是一个具有 O(1) 复杂性的命令，但在内部执行 `DEL`。执行时间将根据重命名密钥的大小而变。
        + `RENAMENX`
        + `RESTORE`
        + `SORT`
      + 大哈希：哈希是一种数据类型，允许单个密钥和多个键值子项目。每个哈希可以存储 4,294,967,295 个项目，并且对大哈希执行的操作可能会变得昂贵。类似于 `KEYS`，哈希具有 `HKEYS` 命令，该命令具有 O(N) 时间复杂度，N 表示哈希中的项目数。`HSCAN` 必须优先于 `HKEYS` 来避免长时间运行的命令。`HDEL`、`HGETALL`、`HMGET`、`HMSET` 和 `HVALS` 是应谨慎用于大哈希的命令。
    + 其他大数据结构：除了哈希之外，其他数据结构可能是 CPU 密集型的。集、列表、排序集和 Hyperloglog 也可能需要相当长的时间来处理，具体取决于它们的大小和使用的命令。有关这些命令的更多信息，请参阅 [Valkey 和 Redis OSS 命令](https://valkey.io/commands)。

## 网络连接验证
<a name="Connectivity"></a>

查看与 DNS 解析、安全组、网络 ACL 和路由表相关的网络配置后，可以使用 VPC Reachability Analyzer 和系统工具验证连接性。

Reachability Analyzer 将测试网络连接并确认是否满足所有要求和权限。对于以下测试，您需要 VPC 中可用的 ElastiCache 节点之一的 ENI ID（弹性网络接口标识）。您可以执行以下操作来查找：

1. 转到 [https://console.aws.amazon.com/ec2/v2/home?\$1NIC:](https://console.amazonaws.cn/ec2/v2/home?#NIC)

1. 按照您的 ElastiCache 集群名称或之前从 DNS 验证获得的 IP 地址筛选接口列表。

1. 记下或以其他方式保存 ENI ID。如果显示了多个接口，请查看说明以确认它们属于正确的 ElastiCache 集群，然后选择其中一个接口。

1. 继续执行下一步骤。

1. 访问网址 [https://console.aws.amazon.com/vpc/home?\$1ReachabilityAnalyzer](https://console.amazonaws.cn/vpc/home?#ReachabilityAnalyzer) 创建分析路径，然后选择以下选项：
   + **Source Type（源类型）**：如果您的 ElastiCache 客户端在 Amazon EC2 实例上运行，选择 **instance（实例）**；如果使用的是其他服务（例如具有 awsvpc 网络的 Amazon Fargate Amazon ECS、Amazon Lambda 等），以及相应的资源 ID（EC2 实例或 ENI ID），选择 **Network Interface（网络接口）**；
   + **Destination Type（目的地类型）**：选择 **Network Interface（网络接口）**，然后在列表中选择 **ElastiCache ENI**。
   + **目的地端口**：为 ElastiCache for Redis OSS 指定 6379，或为 ElastiCache for Memcached 指定 11211。这些端口是使用默认配置定义的端口，本示例假定它们未更改。
   + **协议**：TCP

创建分析路径并等待结果。如果状态为无法访问，请打开分析详细信息并查看 **Analysis Explorer**，了解请求被阻止的详细信息。

如果可到达性测试通过，请继续进行系统级别的验证操作。

要验证 ElastiCache 服务端口上的 TCP 连接，请执行以下操作：在 Amazon Linux 上，`Nping` 在软件包 `nmap` 中可用，并可以测试 ElastiCache 端口上的 TCP 连接，以及提供网络往返时间来建立连接。以此来验证 ElastiCache 集群的网络连接和当前延迟，如下所示：

```
$ sudo nping --tcp -p 6379 example.xxxxxx.ng.0001.use1.cache.amazonaws.com

Starting Nping 0.6.40 ( http://nmap.org/nping ) at 2020-12-30 16:48 UTC
SENT (0.0495s) TCP ...
(Output suppressed )

Max rtt: 0.937ms | Min rtt: 0.318ms | Avg rtt: 0.449ms
Raw packets sent: 5 (200B) | Rcvd: 5 (220B) | Lost: 0 (0.00%)
Nping done: 1 IP address pinged in 4.08 seconds
```

默认情况下，`nping` 会发送 5 个探测器，探测器之间的延迟为 1 秒。您可以使用选项“-c”来增加探测器的数量，并使用“--delay”来更改发送新测试的时间。

如果带有 `nping` 的测试失败而 *VPC Reachability Analyzer* 测试通过，请您的系统管理员查看可能基于主机的防火墙规则、非对称路由规则或操作系统级别的任何其他可能的限制。

在 ElastiCache 控制台上，在 ElastiCache 集群详细信息中检查是否已启用 **Encryption in-transit（传输中加密）**。如果传输中加密已启用，请使用以下命令确认是否可以建立 TLS 会话：

```
openssl s_client -connect example.xxxxxx.use1.cache.amazonaws.com:6379
```

如果连接和 TLS 协商成功，则预计会有大量输出。检查最后一行中可用的返回代码，该值必须为 `0 (ok)`。如果 openssl 返回不同的内容，请在 [https://www.openssl.org/docs/man1.0.2/man1/verify.html\$1DIAGNOSTICS](https://www.openssl.org/docs/man1.0.2/man1/verify.html#DIAGNOSTICS) 中检查错误原因。

如果所有基础设施和操作系统测试都通过，但您的应用程序仍然无法连接到 ElastiCache，请检查应用程序配置是否符合 ElastiCache 设置。常见的错误有：
+ 您的应用程序不支持 ElastiCache 集群模式，而 ElastiCache 启用了集群模式；
+ 您的应用程序不支持 TLS/SSL，而 ElastiCache 启用了传输中加密功能；
+ 应用程序支持 TLS/SSL，但没有正确的配置标记或受信任的证书颁发机构；

## 网络相关限制
<a name="Network-limits"></a>
+ 最大连接数：同时连接的数量有硬限制。每个 ElastiCache 节点允许跨所有客户端同时进行 65000 个连接。可以通过 CloudWatch 上的 `CurrConnections` 指标监控此限制。但是，客户端也有出站连接限制。在 Linux 上，使用以下命令检查允许的临时端口范围：

  ```
  # sysctl net.ipv4.ip_local_port_range
  net.ipv4.ip_local_port_range = 32768 60999
  ```

  在前面的示例中，将允许 28231 个从同一个源连接到同一目的地 IP（ElastiCache 节点）和端口的连接。以下命令展示了特定 ElastiCache 节点（IP 1.2.3.4）具有的连接数量：

  ```
  ss --numeric --tcp state connected "dst 1.2.3.4 and dport == 6379" | grep -vE '^State' | wc -l
  ```

  如果数量过高，您的系统可能会因尝试处理连接请求而变得过载。建议考虑实施连接池或持久连接等技术，以更好地处理连接。尽可能配置连接池以将最大连接数限制为几百个。此外，建议采用退避逻辑来处理超时或其他连接异常，以避免在出现问题时出现连接损失。
+ 网络流量限制：检查以下[适用于 Redis OSS 的 CloudWatch 指标](CacheMetrics.Redis.md)来确定 ElastiCache 节点上可能达到的网络限制：
  + `NetworkBandwidthInAllowanceExceeded`/`NetworkBandwidthOutAllowanceExceeded`：由于吞吐量超过了聚合带宽限制而形成的网络数据包。

    请注意，写入主节点的每个字节都将被复制到 N 个副本，N 代表副本的数量。具有小节点类型、多个副本和密集型写入请求的集群可能无法应对复制积压。对于这种情况，最佳做法是纵向扩展（更改节点类型）、横向扩展（在已启用集群模式的集群中添加分区）、减少副本数量或最大程度减少写入次数。
  + `NetworkConntrackAllowanceExceeded`：由于超过了分配给节点的、跨所有安全组跟踪的连接最大数量而形成的数据包。在此期间，新连接可能会失败。
  + `NetworkPackets PerSecondAllowanceExceeded`：超过每秒最大数据包数。基于高比率小请求的工作负载可能会在达到最大带宽之前达到此限制。

  以上指标是确认节点达到网络限制的理想方法。但是，通过网络指标的高原也可以确认限制。

  如果平稳状态持续了很长时间，则它们之后可能会出现复制滞后、用于缓存的字节增加、可用内存减少、高交换和 CPU 使用率。Amazon EC2 实例同样具有网络限制，这些限制可通过 [ENA 驱动程序指标](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html)跟踪。具有增强联网支持和 ENA 驱动程序 2.2.10 或更高版本的 Linux 实例可以使用以下命令查看限制计数器：

  ```
  # ethtool -S eth0 | grep "allowance_exceeded"
  ```

## CPU 使用率
<a name="CPU-Usage"></a>

CPU 使用率指标是调查的起点，以下项目可以帮助缩小 ElastiCache 端可能出现的问题的范围：
+ Redis OSS SlowLogs：ElastiCache 默认配置保留最近 128 个需要超过 10 毫秒才能完成的命令。慢速命令的历史记录会在引擎运行时保留，如果发生故障或重启，则会丢失。如果列表达到 128 个条目，旧事件将被删除来为新事件预留空间。慢速事件列表的大小和被视为慢的执行时间可以通过[自定义参数组](ParameterGroups.md)中的参数 `slowlog-max-len` 和 `slowlog-log-slower-than` 进行修改。慢速日志列表可以通过在引擎上运行 `SLOWLOG GET 128` 来进行检索，128 代表报告的最近 128 个慢速命令。每个条目都包含以下字段：

  ```
  1) 1) (integer) 1 -----------> Sequential ID
     2) (integer) 1609010767 --> Timestamp (Unix epoch time)of the Event
     3) (integer) 4823378 -----> Time in microseconds to complete the command.
     4) 1) "keys" -------------> Command
        2) "*" ----------------> Arguments 
     5) "1.2.3.4:57004"-> Source
  ```

  上述事件发生在 12 月 26 日，UTC 19:26:07，耗时 4.8 秒（4823 毫秒）完成，该事件由从客户端 1.2.3.4 请求的 `KEYS` 命令导致。

  在 Linux 上，时间戳可以使用命令日期进行转换：

  ```
  $ date --date='@1609010767'
  Sat Dec 26 19:26:07 UTC 2020
  ```

  使用 Python：

  ```
  >>> from datetime import datetime
  >>> datetime.fromtimestamp(1609010767)
  datetime.datetime(2020, 12, 26, 19, 26, 7)
  ```

  或者在 Windows 上使用 PowerShell：

  ```
  PS D:\Users\user> [datetimeoffset]::FromUnixTimeSeconds('1609010767')
  DateTime      : 12/26/2020 7:26:07 PM
  UtcDateTime  
                  : 12/26/2020 7:26:07 PM
  LocalDateTime : 12/26/2020 2:26:07 PM
  Date          : 12/26/2020 12:00:00 AM
  Day           : 26
  DayOfWeek    
                  : Saturday
  DayOfYear     : 361
  Hour          : 19
  Millisecond   : 0
  Minute        : 26
  Month        
                  : 12
  Offset        : 00:00:00Ticks         : 637446075670000000
  UtcTicks     
                  : 637446075670000000
  TimeOfDay     : 19:26:07
  Year          : 2020
  ```

  如果短时间内（一分钟内或更短时间）有许多慢速命令，则需要引起关注。查看命令的性质以及如何对其进行优化（请参阅前面的示例）。如果经常报告 O(1) 时间复杂度的命令，请检查前面提到的 CPU 使用率高的其他因素。
+ 延迟指标：ElastiCache for Redis OSS 提供了 CloudWatch 指标来监控不同类别命令的平均延迟。数据点的计算方法是将类别中命令的执行总数除以期间内的总执行时间。了解延迟指标结果是多个命令的聚合，这一点非常重要。单个命令可能会导致意外结果（如超时），不会对指标产生重大影响。对于这种情况，慢日志事件将是一个更准确的信息来源。以下列表包含可用的延迟指标以及影响它们的相应命令。
  + EvalBasedCmdsLatency：与 Lua 脚本相关的命令、`eval`、`evalsha`；
  + GeoSpatialBasedCmdsLatency：`geodist`、`geohash`、`geopos`、`georadius`、`georadiusbymember`、`geoadd`；
  + GetTypeCmdsLatency：读取命令（无论数据类型如何）；
  + HashBasedCmdsLatency：`hexists`、`hget`、`hgetall`、`hkeys`、`hlen`、`hmget`、`hvals`、`hstrlen`、`hdel`、`hincrby`、`hincrbyfloat`、`hmset`、`hset`、`hsetnx`；
  + HyperLogLogBasedCmdsLatency：`pfselftest`、`pfcount`、`pfdebug`、`pfadd`、`pfmerge`；
  + KeyBasedCmdsLatency：可以对不同数据类型进行操作的命令：`dump`、`exists`、`keys`、`object`、`pttl`、`randomkey`、`ttl`、`type`、`del`、`expire`、`expireat`、`move`、`persist`、`pexpire`、`pexpireat`、`rename`、`renamenx`、`restoreK`、`sort`、`unlink`；
  + ListBasedCmdsLatency：lindex、llen、lrange、blpop、brpop、brpoplpush、linsert、lpop、lpush、lpushx、lrem、lset、ltrim、rpop、rpoplpush、rpush、rpushx；
  + PubSubBasedCmdsLatency：psubscribe、publish、pubsub、punsubscribe、subscribe、unsubscribe；
  + SetBasedCmdsLatency：`scard`、`sdiff`、`sinter`、`sismember`、`smembers`、`srandmember`、`sunion`、`sadd`、`sdiffstore`、`sinterstore`、`smove`、`spop`、`srem`、`sunionstore`；
  + SetTypeCmdsLatency：写入命令（无论数据类型如何）；
  + SortedSetBasedCmdsLatency：`zcard`、`zcount`、`zrange`、`zrangebyscore`、`zrank`、`zrevrange`、`zrevrangebyscore`、`zrevrank`、`zscore`、`zrangebylex`、`zrevrangebylex`、`zlexcount`、`zadd`、`zincrby`、`zinterstore`、`zrem`、`zremrangebyrank`、`zremrangebyscore`、`zunionstore`、`zremrangebylex`、`zpopmax`、`zpopmin`、`bzpopmin`、`bzpopmax`；
  + StringBasedCmdsLatency：`bitcount`、`get`、`getbit`、`getrange`、`mget`、`strlen`、`substr`、`bitpos`、`append`、`bitop`、`bitfield`、`decr`、`decrby`、`getset`、`incr`、`incrby`、`incrbyfloat`、`mset`、`msetnx`、`psetex`、`set`、`setbit`、`setex`、`setnx`、`setrange`；
  + StreamBasedCmdsLatency：`xrange`、`xrevrange`、`xlen`、`xread`、`xpending`、`xinfo`、`xadd`、`xgroup`、`readgroup`、`xack`、`xclaim`、`xdel`、`xtrim`、`xsetid`；
+ Redis OSS 运行时命令：
  + info commandstats：提供自引擎启动以来执行的命令列表、其累积执行数、总执行时间以及每个命令的平均执行时间；
  + 客户端列表：提供当前已连接的客户端列表以及相关信息，如缓冲区使用情况、最后执行的命令等；
+ 备份和复制：版本 2.8.22 之前的 ElastiCache for Redis OSS 使用分支过程来创建备份并处理与副本的完全同步。对于写入密集型使用案例，此方法可能会产生大量内存开销。

  从 ElastiCache Redis OSS 2.8.22 开始，Amazon 推出了一种无分支备份和复制方法。新方法可能会延迟写入，以防止出现故障。这两种方法都可能产生较高的 CPU 使用率，导致更长的响应时间，从而导致客户端在执行过程中出现超时。始终检查客户端故障是否发生在备份窗口或在该期间内 `SaveInProgress` 指标是否为 1。建议将备份窗口安排在使用率低的时间段，以最大限度地减少客户端出现问题或备份失败的可能性。

## 从服务器端终止的连接
<a name="Connections-server"></a>

ElastiCache for Redis OSS 的默认配置会无限期将客户端连接保持为已建立状态。但是，在某些情况下，可能需要终止连接。例如：
+ 客户端应用程序中的漏洞可能会导致连接被遗忘并在空闲状态仍保持为已建立状态。这被称为“连接泄漏”，其结果是在 `CurrConnections` 指标上观察到的已建立连接数量的稳步上升。此行为可能会导致客户端或 ElastiCache 端出现饱和。当客户端无法立即进行修复时，某些管理员会在其 ElastiCache 参数组中设置“超时”值。超时是允许空闲连接保留的时间（以秒为单位）。如果客户端在此期间内未提交任何请求，则引擎将在连接达到超时值后立即终止连接。较小的超时值可能会导致不必要的断开连接，客户端需要正确处理它们并重新连接，因此会导致延迟。
+ 用于存储密钥的内存与客户端缓冲区共享。具有较大请求或响应的速度较慢的客户端可能需要大量内存来处理其缓冲区。ElastiCache for Redis OSS 的默认配置不会限制常规客户端输出缓冲区的大小。如果达到 `maxmemory` 限制，引擎将尝试移出项目以满足缓冲区使用情况。在内存极低的情况下，ElastiCache for Redis OSS 可能会选择断开消耗大量客户端输出缓冲区的客户端，以释放内存并保持集群的运行状况。

  可以通过自定义配置来限制客户端缓冲区的大小，达到限制的客户端将断开连接。但客户端应能够处理意外断开的连接。用于处理常规客户端缓冲区大小的参数如下：
  + client-query-buffer-limit：单个输入请求的最大大小；
  + client-output-buffer-limit-normal-soft-limit：针对客户端连接的软限制。如果保持在软限制以上的时间超过 client-output-buffer-limit-normal-soft-seconds 定义的时间（以秒为单位），或者如果达到硬限制，则连接将终止；
  + client-output-buffer-limit-normal-soft-seconds：超出 client-output-buffer-limit-normal-soft-limit 的连接允许的时间；
  + client-output-buffer-limit-normal-hard-limit：达到此限制的连接将立即终止。

  除了常规客户端缓冲区之外，以下选项控制副本节点和 Pub/Sub（发布/订阅）客户端的缓冲区：
  + client-output-buffer-limit-replica-hard-limit；
  + client-output-buffer-limit-replica-soft-seconds；
  + client-output-buffer-limit-replica-hard-limit；
  + client-output-buffer-limit-pubsub-soft-limit；
  + client-output-buffer-limit-pubsub-soft-seconds；
  + client-output-buffer-limit-pubsub-hard-limit；

## Amazon EC2 实例的客户端问题排除
<a name="Connections-client"></a>

客户端的负载和响应能力也会影响对 ElastiCache 的请求。在排除间歇性连接或超时问题时，需要仔细检查 EC2 实例和操作系统限制。需要注意的一些关键点：
+ CPU：
  + EC2 实例 CPU 使用率：确保 CPU 未饱和或接近 100%。历史分析可以通过 CloudWatch 完成，但请记住，数据点粒度为 1 分钟（启用详细监控）或 5 分钟；
  + 使用[可突增 EC2 实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/burstable-performance-instances.html)时，请确保他们的 CPU 积分余额没有被耗尽。该信息在 `CPUCreditBalance` CloudWatch 指标上可用。
  + 短期的 CPU 使用率可能导致超时，而不会影响 CloudWatch 上的 100% 使用率。这种情况需要使用操作系统工具（如 `top`、`ps` 和 `mpstat`）进行实时监控。
+ 网络
  + 根据实例功能，检查网络吞吐量是否在可接受的值之内。有关更多信息，请参阅 [Amazon EC2 实例类型](https://www.amazonaws.cn/ec2/instance-types/)。
  + 在具有 `ena` 增强型网络驱动程序的实例上，请检查 [ENA 统计数据](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/troubleshooting-ena.html#statistics-ena)查看超时或超出限制情况。以下统计数据对于确认网络限制饱和度很有用：
    + `bw_in_allowance_exceeded`/`bw_out_allowance_exceeded`：由于入站或出站吞吐量过高而形成的数据包数量；
    + `conntrack_allowance_exceeded`：由于安全组[连接跟踪限制](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-throttling)而丢弃的数据包数。当此限制饱和时，新连接将失败；
    + `linklocal_allowance_exceeded`：由于通过 VPC DNS 对实例元数据的请求过多而丢弃的数据包数。对所有服务的限制是每秒 1024 个数据包；
    + `pps_allowance_exceeded`：由于每秒数据包过多而丢弃的数据包数。当网络流量由每秒数千个或数百万个非常小的请求组成时，可能会达到 PPS 限制。ElastiCache 流量可以进行优化，以便通过管道或命令（一次性执行多个操作，如 `MGET` 而不是 `GET`）更好地利用网络数据包。

## 解剖完成单个请求所花费的时间
<a name="Dissecting-time"></a>
+ 在网络上：`Tcpdump` 和 `Wireshark`（命令行上的 tshark）是方便的工具，用于了解请求在网络上传输、到达 ElastiCache 引擎并获得返回所花费的时间。以下示例突出显示使用以下命令创建的单个请求：

  ```
  $ echo ping | nc example.xxxxxx.ng.0001.use1.cache.amazonaws.com 6379
  +PONG
  ```

  与上面的命令并行，tcpdump 经过执行并返回：

  ```
  $ sudo tcpdump -i any -nn port 6379 -tt
  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
  listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
  1609428918.917869 IP 172.31.11.142.40966
      > 172.31.11.247.6379: Flags [S], seq 177032944, win 26883, options [mss 8961,sackOK,TS val 27819440 ecr 0,nop,wscale 7], length 0
  1609428918.918071 IP 172.31.11.247.6379 > 172.31.11.142.40966: Flags [S.], seq 53962565, ack 177032945, win
      28960, options [mss 1460,sackOK,TS val 3788576332 ecr 27819440,nop,wscale 7], length 0
  1609428918.918091 IP 172.31.11.142.40966 > 172.31.11.247.6379: Flags [.], ack 1, win 211, options [nop,nop,TS val 27819440 ecr 3788576332], length 0
  1609428918.918122
      IP 172.31.11.142.40966 > 172.31.11.247.6379: Flags [P.], seq 1:6, ack 1, win 211, options [nop,nop,TS val 27819440 ecr 3788576332], length 5: RESP "ping"
  1609428918.918132 IP 172.31.11.142.40966 > 172.31.11.247.6379: Flags [F.], seq 6, ack
      1, win 211, options [nop,nop,TS val 27819440 ecr 3788576332], length 0
  1609428918.918240 IP 172.31.11.247.6379 > 172.31.11.142.40966: Flags [.], ack 6, win 227, options [nop,nop,TS val 3788576332 ecr 27819440], length 0
  1609428918.918295
      IP 172.31.11.247.6379 > 172.31.11.142.40966: Flags [P.], seq 1:8, ack 7, win 227, options [nop,nop,TS val 3788576332 ecr 27819440], length 7: RESP "PONG"
  1609428918.918300 IP 172.31.11.142.40966 > 172.31.11.247.6379: Flags [.], ack 8, win
      211, options [nop,nop,TS val 27819441 ecr 3788576332], length 0
  1609428918.918302 IP 172.31.11.247.6379 > 172.31.11.142.40966: Flags [F.], seq 8, ack 7, win 227, options [nop,nop,TS val 3788576332 ecr 27819440], length 0
  1609428918.918307
      IP 172.31.11.142.40966 > 172.31.11.247.6379: Flags [.], ack 9, win 211, options [nop,nop,TS val 27819441 ecr 3788576332], length 0
  ^C
  10 packets captured
  10 packets received by filter
  0 packets dropped by kernel
  ```

  从上面的输出中，我们可以确认 TCP 三向握手是在 222 微秒（918091 – 917869）内完成的，并且在 173 微秒（918295 – 918122）内提交并返回了 ping 命令。

   请求关闭连接耗费了 438 微秒（918307 – 917869）。这些结果将确认网络和引擎响应时间良好，调查可以集中在其他组件上。
+ 在操作系统上：`Strace` 可以帮助识别操作系统级别的时间差。对实际应用程序的分析将更加广泛，建议使用专门的应用程序分析器或调试器。以下示例仅显示操作系统基本组件是否按预期工作，其他内容可能需要进一步调查。通过 `strace` 使用相同的 Redis OSS `PING` 命令，我们得到：

  ```
  $ echo ping | strace -f -tttt -r -e trace=execve,socket,open,recvfrom,sendto nc example.xxxxxx.ng.0001.use1.cache.amazonaws.com (http://example.xxxxxx.ng.0001.use1.cache.amazonaws.com/)
      6379
  1609430221.697712 (+ 0.000000) execve("/usr/bin/nc", ["nc", "example.xxxxxx.ng.0001.use"..., "6379"], 0x7fffede7cc38 /* 22 vars */) = 0
  1609430221.708955 (+ 0.011231) socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
  1609430221.709084
      (+ 0.000124) socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
  1609430221.709258 (+ 0.000173) open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
  1609430221.709637 (+ 0.000378) open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 3
  1609430221.709923
      (+ 0.000286) open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
  1609430221.711365 (+ 0.001443) open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
  1609430221.713293 (+ 0.001928) socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 3
  1609430221.717419
      (+ 0.004126) recvfrom(3, "\362|\201\200\0\1\0\2\0\0\0\0\rnotls20201224\6tihew"..., 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("172.31.0.2")}, [28->16]) = 155
  1609430221.717890 (+ 0.000469) recvfrom(3, "\204\207\201\200\0\1\0\1\0\0\0\0\rnotls20201224\6tihew"...,
      65536, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("172.31.0.2")}, [28->16]) = 139
  1609430221.745659 (+ 0.027772) socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
  1609430221.747548 (+ 0.001887) recvfrom(0, 0x7ffcf2f2ca50, 8192,
      0, 0x7ffcf2f2c9d0, [128]) = -1 ENOTSOCK (Socket operation on non-socket)
  1609430221.747858 (+ 0.000308) sendto(3, "ping\n", 5, 0, NULL, 0) = 5
  1609430221.748048 (+ 0.000188) recvfrom(0, 0x7ffcf2f2ca50, 8192, 0, 0x7ffcf2f2c9d0, [128]) = -1 ENOTSOCK
      (Socket operation on non-socket)
  1609430221.748330 (+ 0.000282) recvfrom(3, "+PONG\r\n", 8192, 0, 0x7ffcf2f2c9d0, [128->0]) = 7
  +PONG
  1609430221.748543 (+ 0.000213) recvfrom(3, "", 8192, 0, 0x7ffcf2f2c9d0, [128->0]) = 0
  1609430221.752110
      (+ 0.003569) +++ exited with 0 +++
  ```

   在上面的示例中，完成该命令所耗费的时间稍多于 54 毫秒（752110 – 697712 = 54398 微秒）。

   实例化 NC 并执行名称解析耗费了大量的时间（从 697712 到 717890，大约 20 毫秒），之后创建 TCP 套接字需要 2 毫秒（745659 到 747858），提交和接收请求的响应需要 0.4 毫秒（747858 到 748330）。

## 相关主题
<a name="wwe-troubleshooting.related"></a>
+ [ElastiCache 最佳实践和缓存策略](BestPractices.md)