Azure托管 Redis 的内存管理

在本文中,我们将讨论Azure托管 Redis 缓存的有效内存管理。

了解如何报告内存使用情况

“已用内存”指标报告数据库消耗的总内存,包括所有分片。 启用高可用性后,该指标包括主分片和副本分片所使用的内存。 这意味着报告的值可能大约是实际数据集大小的 两倍

例如,如果将 10 GB 的数据存储在启用了高可用性的缓存中, 则“已用内存 ”指标报告大约 20 GB。

“已用内存”指标不包括内存碎片。 由于分配器开销,服务器上的实际物理内存消耗可能更高。 有关每个指标包括的更多详细信息,请参阅 监视数据参考

容量规划内存估算

在规划所需内存时,请考虑除了值的原始大小之外的其他因素:

  • 每密钥开销:Redis 中存储的每个密钥都包含内部元数据(指针、类型信息、过期跟踪)。 此开销通常是每个密钥的 50 到 100 字节,具体取决于密钥名称长度和值类型。 对于大量小密钥,此开销可能很大。
  • 密钥名称:用于存储密钥名称的内存会大规模增加。 较短的密钥名称有助于减少内存使用量。
  • 过期跟踪:具有 TTL 集的密钥使用额外的内存进行过期记帐。
  • 高可用性复制:启用高可用性后,将复制数据集。 “已用内存”指标反映主内存和副本内存,但 SKU 内存限制已考虑到这一点。 无需选择更大的 SKU 来容纳复制 - 根据实际数据集大小选择 SKU。

若要检查特定密钥的确切内存成本,请使用 Redis MEMORY USAGE 命令:

MEMORY USAGE <your_key_name>

此命令返回密钥使用的总字节数,包括所有内部开销。 使用此函数根据实际使用情况验证每个密钥内存的估计值。

逐出策略

选择适合你的应用程序的逐出策略。 Azure托管 Redis 的默认策略为 volatile-lru,这意味着只有使用 EXPIRE 等命令设置 TTL 值的键才有资格逐出。 如果没有键具有 TTL 值,则系统不会逐出任何密钥。 如果希望系统允许在内存压力下逐出任何密钥,请考虑该 allkeys-lru 策略。

密钥过期

为键设置过期值。 过期时会主动删除键,而不会等到出现内存压力的时候。 由于内存压力而开始逐出时,可能会导致服务器负载增多。 有关详细信息,请参阅 EXPIREEXPIREAT 命令的文档。

监视内存使用量

建议监视 已用内存百分比 指标,而不是原始 已用内存。 该百分比指标已经考虑了 SKU 的总内存限制(包括高可用性复制),因此你可以直接查看距离容量极限的接近程度,而无需对副本内存进行额外的心理调整。

已用内存百分比 上添加警报,以确保不会内存耗尽,并有机会在出现问题之前扩大缓存。 如果 已用内存百分比 一直超过 75%,请考虑通过缩放到更高的层来增加内存。 有关层的信息,请参阅 体系结构