java 使用 redis 的 ttl 和淘汰策略只需调用原生命令设置过期时间(如setex、expire),并配置redis.conf中的maxmemory与maxmemory-policy;redis 通过惰性+定期删除机制自动清理过期键,java 应避免集中过期、主动探查ttl、不手动del,并监控expired_keys和evicted_keys指标。

Java 中使用 Redis 的过期时间(TTL)和缓存淘汰策略,核心是两件事:一是让键在指定时间后自动失效,二是当内存满时合理腾出空间。Redis 本身已内置成熟机制,Java 只需正确调用并配合配置,无需自己实现定时器或淘汰逻辑。
设置 TTL 让数据自动过期
通过 Jedis 或 Lettuce 客户端,直接调用 Redis 原生命令即可为键设置过期时间:
- EXPIRE key seconds:设置键在多少秒后过期(适合已有键)
- SETEX key seconds value:一步完成写入 + 设置秒级 TTL
- PSETEX key milliseconds value:毫秒级精度,更适用于高时效场景(如验证码、临时 token)
- EXPIREAT / PEXPIREAT:按绝对时间戳过期,适合需要统一失效时间的批量任务(如整点清缓存)
示例(Jedis):
jedis.setex("user:1001", 3600, "{'name':'Alice'}"); // 1 小时后自动删除理解 Redis 的过期清理机制
Java 不用管“什么时候删”,但得知道 Redis 怎么删——这影响你对数据时效性和内存占用的预期:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 惰性删除:get 时才检查是否过期,过期就删并返回 null。访问少的冷数据可能长期滞留内存
- 定期删除:Redis 每 100ms 随机抽样检查一批带 TTL 的键,过期即删;若抽样中过期比例 >25%,会多轮重试
- 两者结合,既避免 CPU 占用过高,又防止内存无限堆积
配置内存淘汰策略应对空间不足
TTL 解决“该不该删”,淘汰策略解决“不得不删时删谁”。需在 redis.conf 中显式配置 maxmemory 和 maxmemory-policy:
- volatile-lru:只淘汰设置了 TTL 的键中最近最少用的(推荐用于纯缓存场景)
- allkeys-lru:所有键都参与 LRU 淘汰,适合混合存储(缓存+持久数据)且内存紧张时
- volatile-ttl:优先淘汰剩余 TTL 最短的键,适合希望“快过期的先走”的业务逻辑
- volatile-random / allkeys-random:随机淘汰,开销最小,适合对数据一致性要求不高的场景
注意:若未配置 maxmemory,Redis 默认不限制内存,淘汰策略不会触发。
Java 侧的实用建议
光靠 Redis 配置还不够,Java 应用层要配合规避常见问题:
- 批量写入带 TTL 的数据时,避免集中设置相同过期时间,防止缓存雪崩——可加几秒随机偏移
- 读取前用
TTL key或PTTL key主动探查剩余寿命,适合需提前预警的业务(如登录态续期) - 不要依赖
DEL手动清理过期键——Redis 已自动处理,手动删反而增加网络开销 - 监控
expired_keys和evicted_keys这两个 Redis 统计指标,能快速判断过期清理是否正常、淘汰是否频繁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










