内存管理
逐出策略
选择适合应用程序的逐出策略。 Azure Cache for Redis 的默认策略为 volatile-lru
,这意味着只有利用 EXPIRE 等命令设置了 TTL 值的键才符合逐出条件。 如果没有任何键具有 TTL 值,则系统不会逐出任何键。 如果希望系统允许在内存不足时逐出任何键,那么可以考虑 allkeys-lru
策略。
键过期
为键设置过期值。 过期时会主动删除键,而不会等到出现内存压力的时候。 由于内存压力而开始逐出时,可能会导致服务器负载增多。 有关详细信息,请参阅 EXPIRE 和 EXPIREAT 命令的文档。
最小化内存碎片
较大的值可能会在逐出时造成内存碎片化,并可能导致较高的内存使用率和服务器负载。
监视内存使用量
对内存使用量添加监视可确保内存不会用完,并且可以在遇到问题之前缩放缓存。
配置 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-reserved
或maxfragmentationmemory-reserved
)时,请注意此更改对已在运行的包含大量数据的缓存有何影响。 例如,如果你的 53 GB 缓存中已有 49 GB 数据,然后将预留值更改为 8 GB,那么系统的最大可用内存将降至 45 GB。 如果你的当前used_memory
或used_memory_rss
值高于 45 GB 的新限制,则系统需要逐出数据,直到used_memory
和used_memory_rss
均低于 45 GB。 逐出可能会增加服务器负载和内存碎片。 有关缓存指标(例如,used_memory
和used_memory_rss
)的更多信息,请参阅创建自己的指标。
注意
纵向扩展或缩减缓存时,maxmemory-reserved
和 maxfragmentationmemory-reserved
设置都会自动根据缓存大小成比例进行缩放。 例如,如果 maxmemory-reserved
在 6 GB 缓存上设置为 3 GB,并且你扩展到 12 GB 缓存,则在扩展期间这些设置会自动更新为 6 GB。 纵向缩减时,将发生相反的行为。
使用 PowerShell、CLI 或 REST API 以编程方式纵向扩展或缩减缓存时,将忽略更新请求中的任何 maxmemory-reserved
或 maxfragmentationmemory-reserved
。 只会遵循缩放更改。 你可以在缩放操作完成后更新这些内存设置。