TTL / PTTL / PERSIST 是什么
TTL 查询键的剩余生存秒数,PTTL 是毫秒版;PERSIST 移除键上的过期时间,让它变成永久键。TTL 的返回约定很关键:-1 表示键存在但没有过期时间,-2 表示键根本不存在,非负数才是剩余秒数;PTTL 的 -1/-2 语义完全相同。
基本信息
| 适用版本 | Redis 全版本;TTL 秒级精度,PTTL 毫秒 |
|---|---|
| 语法 | TTL key / PTTL key / PERSIST key |
| 返回值 | -1 无过期;-2 键不存在;>=0 剩余时间 |
| 权限 | 普通读写权限即可 |
| 相关命令 | EXPIRE / PEXPIRE / SETEX / EXPIREAT |
典型使用场景
- 巡检缓存:确认热点 key 的 TTL 是否符合预期,避免永久键堆满内存
- 排查内存泄漏:SCAN 抽样统计无过期键的比例,定位忘记设 TTL 的写入方
- 锁续期:检查锁剩余时间,决定是否需要延长,避免业务没跑完锁先到期
- 临时键转永久:把确认要长期保留的键用 PERSIST 固定,避免被过期规则清掉
- 结合 INFO keyspace 看 expires 数量,评估过期键规模是否合理
示例
示例
SET a v # 无过期
TTL a # -1:键存在但永久有效
SET b v EX 100
TTL b # 100
TTL missing # -2:键不存在,注意与 -1 区分
PTTL b # 99500 左右,毫秒精度
PERSIST b # 返回 1:成功移除过期时间
TTL b # -1:已变永久键
PERSIST a # 返回 0:本来就没有过期时间返回值逐列读法
| 返回值 | 含义 | 常见误判 |
|---|---|---|
| -1 | 键存在,但没有设置过期时间 | 被当成键不存在而重复回源写缓存 |
| -2 | 键不存在或已过期被清除 | 被当成永久键而漏做回源 |
| >=0 | 剩余生存时间,秒(PTTL 为毫秒) | 拿它做精确倒计时,忽略删除是近似的 |
| PERSIST 1/0 | 1=成功移除过期;0=键不存在或本来无过期 | 把 0 当作命令执行失败 |
TTL 是近似值而不是倒计时契约:惰性删除加定期删除的机制决定了键在过期后可能仍短暂存在,不能用它做精确调度。
过期键在从库上不会被主动删除,从库读到的 TTL 可能仍显示未过期,直到主库发来 DEL 命令;判断过期状态以主库为准。