Redis 的内存使用率是一个关键的监控指标。实例内存不足可能导致数据库响应变慢,严重时甚至会出现数据写入错误。
配置说明:配置 maxmemory 参数后,Redis 可用的内存限制将与 maxmemory 保持一致。当内存使用达到限制时,Redis 只接受读命令,写命令将返回错误。也可以配置驱逐键,以确保在达到最大内存限制时 Redis 的正常运行。
内存使用情况可以从实例本身或 Pods 进行监控。
你可以查看 Redis 的 info 信息,在对应的指标中于 Redis 实例详情 > 监控 中查看内存使用统计。
| 指标名称 | 含义 |
|---|---|
| MemoryUsed | Redis 分配器分配的总内存。 |
| MemFragmentationRatio | 碎片率,即 used_memory_rss 与 used_memory 之间的比率。 |
| MemoryUsed,Peak | Redis 的峰值内存消耗。 |
| MemoryMax | 配置中设置的最大可用内存值。 |
Redis 下每个 Pod 的内存资源使用统计,按 Pod 维度展示,显示 Pod 内每个容器的内存统计。你可以在 Redis 实例详情 > 副本数 > StatefulSet > Pods 中查看 Pod 内存监控。
| 指标名称 | 含义 |
|---|---|
| Memory Usage Rate | 每个 Pod 的内存使用率。 |
在大多数场景下,内存主要被实际数据存储需求所消耗,你可以根据需求考虑扩容实例规格。
在 Redis 内存使用不符合预期的特定场景下,可以利用 Redis 内存模块进行相关分析。
点击 Redis 实例详情 > 终端控制台,连接 Redis 实例,输入 memory stats 命令查看服务器内存使用信息。详情请参考 MEMORY STATS。
通常,Redis 实例的大部分内存被数据集占用,但也存在其他内存开销,如主从复制的积压缓冲区、Redis 进程初始化时消耗的内存,以及维护 Redis 中键值链表所用的内存。
如果非数据集部分消耗的内存较少,建议忽略这部分,重点分析数据集内存使用是否符合预期。
如果非数据集部分占用大量内存,则需要基于 memory stats 命令逐项分析内存消耗的根本原因。
你也可以通过配置数据驱逐策略或过期策略来处理内存中的数据。
当 Redis 内存不足时,如果配置了相关的数据驱逐策略,会自动驱逐数据,确保 Redis 实例正常运行。你可以通过 Redis 实例详情 > 参数配置 更新 maxmemory-policy 参数。
参数值说明:
| 参数值 | 说明 |
|---|---|
| volatile-lru | 从设置了过期时间的数据集中驱逐最近最少使用的数据(包括键值和哈希中的字段)。 |
| volatile-lfu | 从设置了过期时间的数据集中驱逐使用频率最低的数据(包括键值和哈希中的字段)。 |
| volatile-ttl | 仅驱逐设置了过期时间的数据,按 TTL 升序驱逐。 |
| volatile-random | 从设置了过期时间的数据集中随机选择数据进行驱逐。 |
| allkeys-lru | 从所有数据集中驱逐最近最少使用的数据(包括键值、哈希、列表、集合和有序集合)。 |
| allkeys-lfu | 从所有数据集中驱逐使用频率最低的数据(包括键值、哈希、列表、集合和有序集合)。 |
| allkeys-random | 从所有数据集中随机选择数据进行驱逐(包括键值、哈希、列表、集合和有序集合)。 |
| noeviction | 不驱逐数据;当内存空间不足时,写操作直接返回错误。 |
Redis 提供可配置的过期策略(expire),允许自动过期键。该策略允许用户为键设置过期时间,达到时间后 Redis 会删除该键。此功能对缓存数据尤为有用,可防止缓存数据无限期保留导致内存资源浪费。
通常,数据集占据 Redis 内存的绝大部分,因此内存优化主要聚焦于这部分。你可以参考以下配置最佳实践:
maxmemory)参数,控制 Redis 实例可使用的最大内存。当 Redis 达到最大内存限制时,会触发各种清理策略,如删除过期键或使用 LFU(最少使用)算法移除较少使用的键。建议 maxmemory 大小不超过实例规格的 80%。最佳实践会因不同应用场景而异,因此你可能需要根据具体的应用背景和需求,定制 Redis 内存使用的最佳实践。