过期设置是什么
过期设置给键指定生存时间,支持秒级、毫秒级,也支持直接指定到期的时间点。较新版本还引入了条件选项:只在键没有过期时设置、只在已有时才更新、只在新的时间更长或更短时才生效。这些条件在续期逻辑里非常有用,可以避免无条件覆盖把短过期意外改长,或者把长过期莫名缩短。
基本信息
| 秒级设置 | 设置以秒为单位的生存时间 |
|---|---|
| 毫秒级设置 | 设置以毫秒为单位的生存时间 |
| 时间点设置 | 指定绝对到期时刻,有秒与毫秒两种精度 |
| 条件选项 | 无过期才设、有过期才设、新值更大才设、新值更小才设 |
| 查询命令 | 查看剩余生存时间,返回负数表示键不存在或无过期 |
| 版本要求 | 条件选项需要较新的服务端版本 |
典型使用场景
- 会话续期:用户活跃时延长会话的生存时间
- 缓存兜底:写缓存时设置过期,避免键永久驻留
- 限流窗口回收:靠过期自动清理计数键
- 定时任务锁:给锁设置过期防止死锁
- 精准到期:用绝对时间点对齐业务周期
- 临时数据延迟清理:给中间结果设置较短过期
示例
示例
SET session:u1 token # 写入会话键
EXPIRE session:u1 3600 # 设置一小时生存时间
TTL session:u1 # 查看剩余秒数
EXPIRE session:u1 7200 XX # 只在键已有过期时才更新
EXPIRE session:u1 60 GT # 只在新的时间更长时才更新,防止被缩短
PEXPIREAT session:u1 1798761600000 # 指定绝对到期时间点(毫秒精度)命令与条件读法
| 写法 | 作用 | 注意 |
|---|---|---|
| 秒级设置 | 以秒为单位指定生存时间 | 最常用的写法 |
| 毫秒级设置 | 以毫秒为单位指定 | 需要更细粒度时使用 |
| 时间点设置 | 指定绝对到期时刻 | 适合与业务周期对齐 |
| 无过期才设 | 键没有过期时才生效 | 避免覆盖已有的过期设置 |
| 有过期才设 | 键已有过期时才生效 | 只续期,不给无过期键新增 |
| 新值更大才设 | 只延长不缩短 | 续期场景的防缩短手段 |
| 新值更小才设 | 只缩短不延长 | 紧急失效场景使用 |
| 查询剩余时间 | 查看还能存活多久 | 负数表示键不存在或无过期 |
对不存在的键设置过期会返回零且不报错:业务逻辑必须处理这个分支,否则会误以为过期已经设置成功。
用无条件设置做过期续期,可能把短过期意外延长、也可能把长过期缩短;精细控制应使用条件选项,让续期只发生在预期方向。
键过期后不会立刻消失:内存是在访问时或后台清理时回收,内存紧张时应结合淘汰策略一起考虑,而不是只依赖过期。
过期策略检查清单
- 缓存写入默认带过期,避免键永久驻留
- 续期使用条件选项,防止时间被意外改写
- 限流与临时数据用相对过期,业务周期用绝对时间点
- 键不存在时设置过期会失败,逻辑要处理这个分支
- 监控过期键比例与内存水位,评估清理效果
- 关键键的过期时间纳入配置管理,不要散落在代码里
过期时间是业务语义的一部分:同一个业务对象的生存时间应有统一定义,代码里各处随手写不同的秒数,最终会造成缓存表现不一致与排查困难。