能,但需满足maxmemory已设置且当前内存≥阈值,否则策略不触发;拼错策略名会报错,改后仅在下次写入超限时才淘汰。

CONFIG SET maxmemory-policy 能直接生效吗?
能,但有个硬性前提:maxmemory 必须已设置且当前内存使用量 ≥ 阈值,否则策略不会触发——改了等于没改。很多用户执行 CONFIG SET maxmemory-policy allkeys-lfu 后发现“没反应”,其实是 maxmemory 还是默认的 0(不限制),淘汰机制根本没开。
动态修改前必须确认的三件事
用 redis-cli 连上实例后,先跑这三条命令:
-
CONFIG GET maxmemory—— 看是不是 0;如果是,得先设个值,比如CONFIG SET maxmemory 1gb -
INFO memory | grep used_memory_human—— 确认当前已用内存是否接近或超过maxmemory,否则策略不触发 -
CONFIG GET maxmemory-policy—— 查当前策略,避免重复设置或误覆盖
修改时参数写错会怎样?
Redis 对 maxmemory-policy 值校验很松:拼错、多空格、大小写混用(如 ALLKEYS-LRU)通常也能接受;但若传了完全不存在的策略名(如 allkeys-mru),CONFIG SET 会返回 (error) ERR Unsupported CONFIG parameter,且原策略不变。
常见可用值(注意连字符和大小写):noeviction、allkeys-lru、volatile-lfu、volatile-ttl —— 全部小写,带连字符,不能缩写。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
改完策略后数据立刻被删?
不会。淘汰只在**下一次写入触发内存增长时**才发生。比如你刚设好 allkeys-lru,但此时内存还没超限,后续执行 SET 或 LPUSH 导致内存突破 maxmemory,Redis 才开始采样、比对、淘汰旧 key。
这意味着:策略切换后没有“立即清理”动作,也没有后台扫描线程主动删数据。如果你希望立刻释放空间,得手动触发一次写操作(如 SET dummy_key "x"),再观察 INFO stats | grep evicted_keys 是否递增。
最容易被忽略的一点:如果用的是 volatile-* 类策略(如 volatile-lru),而库里大部分 key 都没设过期时间,那实际可淘汰的 key 极少——策略会退化成 noeviction,写入仍报 OOM。务必结合业务数据特征选策略,别只看名字顺眼。

















