设maxmemory=3MB配合volatile-lru策略,插入无TTL和有TTL两类key直到触发内存淘汰,验证只有设了过期时间的key才会被淘汰。
一类key设了TTL,一类没设,maxmemory给得很紧。
操作CONFIG SET maxmemory-policy volatile-lru CONFIG SET maxmemory 3mb 插入200个persistent_*(无TTL) 插入600个volatile_*(有TTL, ex=10000)
内存撑满触发了淘汰,看谁被牺牲了。
结果used_memory: 3143792 字节 (已顶到maxmemory 3145728附近) evicted_keys: 83 persistent_(无TTL) 幸存: 200 / 200 volatile_(有TTL) 幸存: 516 / 600
数字非常直接:200个没设TTL的 persistent_* 一个都没少;600个设了TTL的 volatile_* 少了84个(跟的evicted_keys计数基本吻合)。volatile-lru 只在"设了过期时间的key"这个子集里,按最近最少使用的顺序做淘汰——完全不去碰那些没有TTL的key,不管内存有多紧张。
每一步都是本文上面用redis-cli和redis-py跑出来的原始结果。
CONFIG SET maxmemory-policy volatile-lru:验证淘汰范围只限于有TTL的key