noeviction策略下Redis内存达maxmemory时强制拒绝所有写入,返回OOM错误,确保配置类key不被淘汰;但需配合独立实例、合理maxmemory设置及应用层降级处理。
重要配置信息不会被自动淘汰——前提是它根本不在淘汰范围里,或者你压根没给 Redis 淘汰的机会。
当配置 maxmemory-policy noeviction 时,Redis 不会主动删任何 key。但一旦内存触达 maxmemory 上限,所有写命令(SET、HSET、LPUSH 等)都会直接报错:(error) OOM command not allowed when used memory > 'maxmemory'。
这不是“数据被悄悄淘汰了”,而是“你连写都写不进去”。所以:
config:redis:timeout、settings:feature:flag)只要成功写入,就永远在内存里used_memory,业务可能突然卡在写配置这一步CONFIG SET 命令本身不受 noeviction 影响,但修改 maxmemory 后新写入仍会触发 OOM用一个只存配置的 Redis 实例(比如 redis-config),配合 noeviction + 合理的 maxmemory(例如 16MB),是最稳妥的做法。
原因很实际:
allkeys-lru,哪怕你给配置 key 加了 TTL,它也照样可能被 LRU 淘汰INFO memory,一眼看清配置项占多少内存,有没有异常增长SAVE 或 BGSAVE 仍会持久化这些 key,RDB/AOF 恢复后配置仍在noeviction 只管“不删数据”,不管“数据怎么进来的”。几个容易忽略的坑:
SET config:key "value" EX 3600 写入的,它带 TTL,那它本质是 volatile key —— 即使策略是 noeviction,过期时间一到,Redis 仍会自动删除它(这是过期策略,不是淘汰策略)FLUSHDB、FLUSHALL 这类命令照常执行,人工误操作照样清空配置真正关键的不是选哪个策略,而是明确:配置数据是否允许丢失、是否必须强一致、谁负责兜底重试。这些决定了你是加个独立实例,还是在应用层加一层本地缓存 fallback,而不是只盯着 maxmemory-policy 配置打转。