*Redis PEXPIREAT 命令
PEXPIREAT 用于设置键的过期时间,以 Unix 时间戳(毫秒精度)指定键将在何时过期。
*语法
PEXPIREAT key milliseconds-timestamp [NX | XX | GT | LT]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 要设置过期时间的键名 |
| milliseconds-timestamp | Integer | 是 | 以毫秒为单位的 Unix 时间戳 |
| NX | Flag | 否 | 仅在键没有过期时间时设置 |
| XX | Flag | 否 | 仅在键已存在过期时间时设置 |
| GT | Flag | 否 | 仅在新过期时间大于当前过期时间时设置 |
| LT | Flag | 否 | 仅在新过期时间小于当前过期时间时设置 |
*返回值
- 1:过期时间设置成功
- 0:条件未满足(如 NX/XX/GT/LT 限制),或键不存在
*时间复杂度
O(1)
*
*示例
*基本用法
> SET mykey "hello"
OK
> PEXPIREAT mykey 1893456000000
1
> TTL mykey
(integer) 一个大于0的值
*使用条件选项
> SET session "user123"
OK
> PEXPIREAT session 1893456000000 NX
1
> PEXPIREAT session 1893456000000 NX
0
*更新过期时间(GT/LT)
> SET mykey "value"
OK
> PEXPIREAT mykey 1893456000000
1
> PEXPIREAT mykey 1893456000001 GT
1
> PEXPIREAT mykey 1893456000000 GT
0
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR value is not an integer or out of range | 时间戳不是整数或超出范围 | 确保传入有效的毫秒时间戳 |
| ERR wrong number of arguments | 参数数量不足 | 检查是否传入了 key 和 timestamp |
| ERR syntax error | 同时使用了冲突的选项(如 NX 和 XX) | 确保条件选项不冲突 |
*最佳实践
- 适用于精确控制键的过期时刻,如缓存失效时间对齐到整点
- 与 PEXPIRE 的区别:PEXPIRE 是相对时间(毫秒),PEXPIREAT 是绝对时间戳
- 配合 Lua 脚本可实现原子化的"设置并设置过期时间"操作
- 在缓存预热场景中,使用 PEXPIREAT 可以统一缓存失效时间
*FAQ
Q1: PEXPIREAT 和 EXPIREAT 有什么区别? A: EXPIREAT 使用秒级时间戳,PEXPIREAT 使用毫秒级时间戳。两者功能相同,只是精度不同。
Q2: 如果时间戳已经过去,会发生什么? A: 键会立即被删除,返回 1。
Q3: 可以同时使用 NX 和 GT 吗? A: 可以,NX 和 GT/LT 是不同维度的条件限制,可以组合使用。但 NX 和 XX 不能同时使用。
Q4: 如何查看键的过期时间戳? A: 使用 PTTL key 查看剩余毫秒数,或使用 OBJECT IDLETIME 获取信息。