bigywater.tech
Redis · 22

allkeys-lru 淘汰算法

用跟上一篇volatile-lru完全相同的数据分布,只把策略换成allkeys-lru,直接对照验证这次连无TTL的key也会被淘汰。

187/200
无TTL的key这次也被淘汰了(对照上篇200/200)
整个keyspace
allkeys-lru的淘汰候选范围
168次淘汰
同样内存压力下的淘汰总数

做的事:跟上一篇一模一样的数据,只改策略

同样200个无TTL的key、600个有TTL的key、同样3MB的maxmemory,唯一变量是策略名字。

操作CONFIG SET maxmemory-policy allkeys-lru -- 唯一的区别 CONFIG SET maxmemory 3mb 插入200个persistent_*(无TTL) 插入600个volatile_*(有TTL)

验证:这次无TTL的key也被淘汰了

跟上一篇volatile-lru的结果直接对照。

结果evicted_keys: 168 persistent_(无TTL) 幸存: 187 / 200 ← 上一篇volatile-lru下是200/200! volatile_(有TTL) 幸存: 529 / 600

对照非常直接:完全相同的数据分布,上一篇 volatile-lru 下无TTL的key一个都没少(200/200),这一篇同样场景换成 allkeys-lru,无TTL的key也开始被淘汰了(187/200,少了13个)。

这就是allkeys-lru和volatile-lru唯一但关键的区别:allkeys-lru把整个keyspace都当成淘汰候选池,不管有没有设置TTL,纯粹按最近最少使用排序淘汰;volatile-lru则只在"有TTL的key"这个子集里做淘汰。选哪个策略,取决于业务上"没设TTL的数据能不能被牺牲"——如果所有数据都可以在内存紧张时被淘汰(纯缓存场景),allkeys-lru更彻底;如果有些数据必须长期保留、绝不能被自动淘汰掉,就得用volatile-lru把它们的TTL留空。

分步演示:allkeys-lru和volatile-lru的直接对照

每一步都是本文上面用redis-cli和redis-py跑出来的原始结果。

allkeys-lru不区分有没有TTL,全部纳入淘汰候选
这一步新验证的结果

    本文用到的工具

    • 本机 Redis 8.10.1 单节点,maxmemory=3MB
    • CONFIG SET maxmemory-policy allkeys-lru:对照volatile-lru验证淘汰范围的区别
    京ICP备2026067502号-1京公网安备11010502063487号