优先使用单key+原生ttl,如rbucket.set(value, 30, timeunit.minutes),避免rmapcache等模拟field过期方案;配置allkeys-lru淘汰策略并监控内存与命中率;必要时分层缓存。

直接用带原生过期能力的结构,别依赖模拟 TTL 的封装层。
优先使用单 key + 原生 TTL
Redis 本身对 String 类型支持高效、可靠的 EX/PX 过期命令,这是内核级实现,无脚本开销、无元数据膨胀、可被所有淘汰策略(如 allkeys-lru)立即识别和清理。比如把 RMapCache<string object></string> 改成:
- 构造唯一 key:如
"user:profile:" + userId - 用
RBucket.set(value, 30, TimeUnit.MINUTES)存储 - 天然支持集群分片——key 名含业务标识,哈希后自动分散
禁用字段级过期的“伪优化”设计
RMapCache 等模拟 hash field TTL 的方案,在百万级数据下会触发三重负担:
- 每个 field 需维护至少 3 个有序集合(超时、空闲、访问时间),500 万条 = 上千万辅助条目
- 高并发写入时 Lua 脚本可能被 Redis 拒绝执行(内存达 maxmemory 临界点后)
- 整个 hash 是单 key,无法水平扩展,极易形成热点节点
搭配合理的淘汰策略与监控
仅设 TTL 不够,还需让 Redis 主动管理内存压力:
- 配置
maxmemory-policy为allkeys-lru或volatile-lru,避免 OOM 后被动驱逐 - 通过
INFO memory定期检查used_memory_peak和mem_fragmentation_ratio - 在应用层记录缓存命中率与平均存活时长,反向验证 TTL 设置是否合理
必要时引入二级缓存或冷热分离
若部分数据访问频次极低但又不能丢弃,可考虑:
- 热数据走 Redis(带 TTL)
- 温数据下沉到本地 Caffeine 缓存(带权重/大小限制)
- 冷数据归档至数据库或对象存储,按需异步加载
不复杂但容易忽略:淘汰机制不是“有就行”,而是要和数据生命周期、访问模式、部署拓扑完全对齐。










