

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

# 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)

## 启用 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
```