永不过期的基础数据无法靠volatile策略真正保护,因redis淘汰机制只针对带过期时间的key;真隔离需实例级物理拆分,如foundation专用实例配noeviction策略。

重要基础数据设为永不过期,但仅靠不设置过期时间 + volatile-lru 等策略无法真正隔离保护——Redis 的淘汰机制根本不会区分“重不重要”,只看 key 是否带 expire。
volatile-lru / volatile-ttl 等策略完全无视“基础数据是否关键”
Redis 的 volatile-lru、volatile-ttl、volatile-random 这类淘汰策略,只会扫描并淘汰那些**设置了过期时间的 key**。如果你给基础数据(如用户中心配置、核心服务开关)没设 expire,它们压根不会被纳入淘汰候选池——听起来像保护?其实是个错觉:这不是“被优待”,而是“被忽略”。一旦内存打满,且所有带 expire 的 key 都被淘汰光了,而内存仍不足,Redis 会直接拒绝写入(返回 (error) OOM command not allowed when used memory > 'maxmemory'.),而不是去动你的永久 key。
- 也就是说:
volatile-类策略下,“永不过期”不是保险丝,是断路器——它不保你可用,只保你不被删;但服务可能因写入失败而卡死 -
allkeys-lru才会扫所有 key(含永不过期的),此时你的基础数据反而最危险——因为 LRU 逻辑下,长期不更新的配置项最容易被淘汰 - 没有策略能识别“这个 hash 是用户表结构定义,那个 string 是灰度开关”,Redis 没有元数据标签能力
真要隔离基础数据,必须用 Redis 实例级物理隔离
靠配置策略做逻辑隔离,在 Redis 里是伪需求。实际生产中唯一可靠的方式,是把基础数据和业务缓存拆到不同实例(或至少不同 db,但 db 隔离弱,不推荐):
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 单独部署一个
redis-foundation实例,专存service_config、region_list、feature_flags等,maxmemory设宽松(比如 2GB),并配noeviction策略——内存满时直接报错,逼监控告警,而不是删数据 - 业务缓存走另一个
redis-cache实例,用allkeys-lru或allkeys-lfu,允许淘汰,也允许爆内存后降级 - 不要用
SELECT切 db 来“假装隔离”:同一个实例里,所有 db 共享内存与淘汰上下文,allkeys-*策略照样跨 db 扫描
如果硬要用单实例,只能靠应用层防御+运维兜底
放弃策略幻想,转为工程控制:
- 写入基础数据时,强制校验 key 名称是否命中白名单(如正则
^foundation:.*$),并在客户端 SDK 层拦截EXPIRE/SETEX等带过期操作 - 定时任务每 5 分钟跑一次
SCAN+TTL,告警所有匹配foundation:前缀但 TTL ≠ -1 的 key(说明被误加了过期) - 在
redis.conf中启用notify-keyspace-events "Ex",监听expired事件——虽然基础数据不会过期,但能帮你快速发现哪些业务 key 在高频失效,反推缓存设计问题 - 禁用
CONFIG SET maxmemory动态调参,所有内存限制必须静态配置并纳入 Git 版本管理,避免误操作瞬间击穿
真正难的不是“怎么设永不过期”,而是当所有基础 key 都活着、但业务写不进新数据时,你能否在 30 秒内判断出是缓存实例内存打满,而不是下游服务超时——这时候,INFO memory 和 MEMORY USAGE 的响应延迟,比任何淘汰策略都更值得你盯紧。










