allkeys-random性能优势在于cpu开销最低、淘汰延迟稳定在sub-millisecond级,因其不排序、不计数、不查时间戳,仅依赖哈希表随机游走;但该策略无淘汰倾向性,不保障关键数据,无法解决内存持续增长本质问题。

allkeys-random 的性能优势体现在哪几个地方
它快,是因为它不做决策——不排序、不计数、不查时间戳。所有淘汰策略里,allkeys-random 是唯一一个只依赖哈希表随机游走(hash table random walk)的策略,CPU 开销最低,单次淘汰延迟通常
这种“快”不是靠算法聪明,而是靠放弃判断:
-
allkeys-lru要维护访问时间链表或近似LRU的采样池,每次淘汰需扫描maxmemory-samples个候选 key(默认 5 个),再比对时间 -
allkeys-lfu要更新每个 key 的访问频次计数器,还要做衰减,内存和 CPU 双开销 -
volatile-ttl得遍历过期字典并比对剩余 TTL,实际是 O(n) 查找 -
allkeys-random直接从 Redis 的全局键空间(dict)里随机挑一个 bucket,再随机选一个 entry,一步到位
为什么它在压测中看起来“更稳”
高并发写入触发频繁淘汰时,allkeys-random 的响应时间抖动最小。不像 allkeys-lru 在 key 数量激增时可能因采样逻辑导致偶发 >5ms 的延迟尖刺,allkeys-random 基本恒定在 sub-millisecond 级别。
但这只是表象稳定:
- 它不解决内存持续增长问题,只是“边漏边补”,压力始终存在
- QPS 测试值可能更高(比如 13.8 万/秒),但缓存命中率会掉到很低水平,下游实际负载反而上升
- 没有淘汰倾向性,无法配合业务语义做保护——比如你没法让 session key 比日志 key 更“抗删”
它真的适合生产环境吗
不适合。它的性能优势是面向“淘汰动作本身”的,不是面向“系统整体稳定性”的。
真实生产里,你更需要的是可预测性、可观测性和关键数据保底能力。而 allkeys-random 连被删了哪个 key 都不记录(除非开 MONITOR 或慢日志),故障时只能靠猜;它也不区分冷热,刚写入的订单状态和三年前的测试 token 一样可能被一枪毙掉。
真正该关注的,是为什么内存会反复触顶:是不是有大 value 没拆分?有没有 key 永久不清理?allkeys-random 不提醒你这些问题,它只是默默帮你掩盖它们。











