EXPIRE 家族是什么
EXPIRE 系列用来给键设置过期时间,四个命令分别覆盖「相对时间与绝对时间」「秒与毫秒」四个组合:EXPIRE 与 PEXPIRE 从当前时刻起算,EXPIREAT 与 PEXPIREAT 按 Unix 时间戳到期。7.0 起这些命令支持 NX、XX、GT、LT 四个选项,用来精确控制「什么时候才允许改动已有的过期时间」,避免并发场景下把更长或更短的 TTL 误覆盖掉。
基本信息
| 命令族 | EXPIRE / PEXPIRE / EXPIREAT / PEXPIREAT,另有毫秒级的 EXPIRETIME 查询 |
|---|---|
| 选项 | NX 无 TTL 时才设置,XX 已有 TTL 时才设置,GT 仅新值更长时生效,LT 仅新值更短时生效 |
| 查询与修改 | TTL / PTTL 查询剩余,PERSIST 移除过期时间,GETEX 读取时顺带改 TTL |
| 返回值 | 1 表示设置成功,0 表示条件不满足或键不存在 |
| 版本前提 | NX/XX/GT/LT 需要 7.0 及以上 |
典型使用场景
- 会话与登录态:写入时直接带 EX,或用 EXPIRE 单独设置会话有效期
- 缓存对象:SET 时带 EX 最简洁,需要动态延长时用 EXPIRE XX GT
- 跨实例统一调度:用 EXPIREAT 按绝对时间点到期,避免各实例时钟起点不同
- 续期保护:锁或租约在业务未完成时用 GT 延长,防止把别人的长租期改短
- 临时键治理:给存量历史键批量补 TTL,用 NX 确保不会覆盖已有的过期设置
常用写法
常用写法
redis-cli EXPIRE session:abc 1800 # 相对时间,秒
redis-cli EXPIRE lock:k 30 NX # 仅当键当前没有 TTL 时才设置
redis-cli EXPIRE cache:k 600 GT # 仅当新 TTL 比现有更长才生效
redis-cli EXPIREAT cache:k 1799999999 # 绝对时间戳到期
redis-cli PERSIST cache:k # 移除过期时间,变永久键
redis-cli GETEX cache:k EX 300 # 读取并顺带改为 300 秒过期
redis-cli TTL cache:k # -1 表示有键无 TTL,-2 表示键不存在选项语义
| 选项 | 生效条件 | 典型用途 |
|---|---|---|
| NX | 键当前没有过期时间 | 批量补 TTL 时不覆盖既有设置 |
| XX | 键当前已有过期时间 | 只调整已有生命周期的键 |
| GT | 新 TTL 大于当前剩余 | 续期场景,防止把租期改短 |
| LT | 新 TTL 小于当前剩余 | 提前失效,例如强制刷新缓存 |
GETEX 是读取与改写 TTL 的组合命令,支持 EX、PX、EXAT、PXAT 以及 PERSIST,可以在一次往返里完成「取值并延长有效期」,很适合读时续期的滑动过期会话。使用前要确认服务端版本支持该命令。
SET 会清掉原有 TTL:用 SET 覆盖写缓存时,如果不显式带上 EX 参数,原本会过期的键会变成永久键。这类隐性变化往往在内存增长后才被发现,覆盖写时务必明确过期语义。