maxmemory-samples只对allkeys-lru和volatile-lru生效。采样数从5调至10,CPU开销可能翻倍,高并发下淘汰延迟可达0.3毫秒。参数最大支持200,超出自动截断且无提示。多数场景无需调高,LRU可能不适合业务形态,应优先审视数据分布。
这个参数仅对 allkeys-lru 和 volatile-lru 两种淘汰策略生效。如果配置的是 allkeys-random 或 noeviction,即使将该参数设为 200,也不会参与任何内存淘汰逻辑。
许多团队调完参数后便认为“更准了”,但通过 CONFIG GET maxmemory-policy 检查发现,策略根本没有切换。线上环境中因忽视此点而踩坑的案例不少——调整参数前确认策略,是最基础的排查步骤。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
每次内存淘汰触发时,Redis 会随机读取 maxmemory-samples 个 key 的 LRU 字段(24 位时间戳),并比较时间戳的“年龄”。该操作并非 O(1),而是 O(N) 扫描。具体性能表现如下:
通过 INFO stats 可观察到,当 evicted_keys 突增时,instantaneous_ops_per_sec 常同步下跌——这正是主线程被淘汰逻辑拖慢的迹象。
因此,不要只紧盯命中率,应优先关注 redis-cli --stat 中的 evicted 指标以及延迟毛刺。
该参数的最大支持值为 200。若设置超过此上限,Redis 会在启动时或执行 CONFIG SET 时直接截断为 200,且不输出任何错误或提示。例如:
CONFIG SET maxmemory-samples 300
随后查询 CONFIG GET maxmemory-samples,返回的依然是 200。
线上调整参数时,不要仅依赖输入的数值——务必二次确认返回值。许多管理员误以为设置了 500,实际早被 Redis 悄悄截断。
多数团队在此参数上并无实质性调整需求。真正需要提高 maxmemory-samples 的场景只有一个:冷热数据分离极其极端,且局部访问倾斜严重——例如一批冷数据的 key 长期不被访问,但因采样过少而总被遗漏。
然而现实中更常见的问题是:LRU 本身可能并不适合业务形态。
allkeys-lfu 往往比调大 maxmemory-samples 更有效。lfu-log-factor 和 lfu-decay-time 的作用远大于采样精度。OBJECT IDLETIME 返回的是秒级估算,精度本身较低,不应作为验证“哪个 key 最老”的依据。其结果并不可靠。采样精度并非万能杠杆——它主要撬动的是 CPU 资源和延迟开销,而非业务语义上的“正确性”。调整前先自问:问题究竟出在淘汰策略上,还是数据分布形态上?
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述