内存管理

逐出策略

选择适合应用程序的逐出策略。 Azure Cache for Redis 的默认策略为 volatile-lru,这意味着只有利用 EXPIRE 等命令设置了 TTL 值的键才符合逐出条件。 如果没有任何键具有 TTL 值,则系统不会逐出任何键。 如果希望系统允许在内存不足时逐出任何键,那么可以考虑 allkeys-lru 策略。

键过期

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

最小化内存碎片

较大的值可能会在逐出时造成内存碎片化,并可能导致较高的内存使用率和服务器负载。

监视内存使用量

对内存使用量添加监视可确保内存不会用完,并且可以在遇到问题之前缩放缓存。

配置 maxmemory-reserved 设置

配置 maxmemory-reserved 设置可提高系统响应能力:

  • 对于写入密集型工作负载,或者,如果你要在缓存中存储 100 KB 或更大的值,则设置充足的预留尤为重要。 默认情况下,创建缓存时,大约会为 maxmemory-reserved 预留 10% 的可用内存。 并为 maxfragmentationmemory-reserved 预留另外 10% 的可用内存。 如果有写入密集型负载,则可以增加预留量。

  • maxmemory-reserved 设置用于配置群集中预留给非缓存操作(例如故障转移期间的复制)的每个实例的内存量(以 MB 为单位)。 设置此值能够在负载变化时具有更一致的 Redis 服务器体验。 对于写入大量数据的工作负载,应将此值设置得较大。 为此类操作保留内存后,无法存储缓存数据。 maxmemory-reserved 的允许范围是 maxmemory 的 10% - 60%。 如果尝试将这些值设置为低于 10% 或高于 60%,则会重新评估这些值,并将其设置为最小值 10% 和最大值 60%。 这些值以兆字节为单位呈现。

  • maxfragmentationmemory-reserved 设置用于配置群集中预留以容纳内存碎片的每个实例的内存量(以 MB 为单位)。 设置此值后,当缓存已满或接近满的状态并且碎片比率很高时,Redis 服务器体验更加稳定。 为此类操作保留内存后,无法存储缓存数据。 maxfragmentationmemory-reserved 的允许范围是 maxmemory 的 10% - 60%。 如果尝试将这些值设置为低于 10% 或高于 60%,则会重新评估这些值,并将其设置为最小值 10% 和最大值 60%。 这些值以兆字节为单位呈现。

  • 选择新的内存预留值(maxmemory-reservedmaxfragmentationmemory-reserved)时,请注意此更改对已在运行的包含大量数据的缓存有何影响。 例如,如果你的 53 GB 缓存中已有 49 GB 数据,然后将预留值更改为 8 GB,那么系统的最大可用内存将降至 45 GB。 如果你的当前 used_memoryused_memory_rss 值高于 45 GB 的新限制,则系统需要逐出数据,直到 used_memoryused_memory_rss 均低于 45 GB。 逐出可能会增加服务器负载和内存碎片。 有关缓存指标(例如,used_memoryused_memory_rss)的更多信息,请参阅创建自己的指标

注意

纵向扩展或缩减缓存时,maxmemory-reservedmaxfragmentationmemory-reserved 设置都会自动根据缓存大小成比例进行缩放。 例如,如果 maxmemory-reserved 在 6 GB 缓存上设置为 3 GB,并且你扩展到 12 GB 缓存,则在扩展期间这些设置会自动更新为 6 GB。 纵向缩减时,将发生相反的行为。 使用 PowerShell、CLI 或 REST API 以编程方式纵向扩展或缩减缓存时,将忽略更新请求中的任何 maxmemory-reservedmaxfragmentationmemory-reserved。 只会遵循缩放更改。 你可以在缩放操作完成后更新这些内存设置。

后续步骤