*Redis EXPIREAT 命令
EXPIREAT 用于将指定键的过期时间设置为某个 Unix 时间戳(秒级)。
*语法
EXPIREAT key unix-time-seconds [NX | XX | GT | LT]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 键名 |
| unix-time-seconds | Integer | 是 | Unix 时间戳(秒) |
| NX | Flag | 否 | 仅在键没有过期时间时设置 |
| XX | Flag | 否 | 仅在键已存在过期时间时设置 |
| GT | Flag | 否 | 仅在新过期时间大于当前过期时间时设置 |
| LT | Flag | 否 | 仅在新过期时间小于当前过期时间时设置 |
*返回值
- 1:过期时间设置成功
- 0:条件不满足(如 NX 但键已有过期时间)
- Error:参数错误、时间戳无效等
*时间复杂度
O(1)
*
*示例
*基本用法
> SET mykey "hello"
OK
> EXPIREAT mykey 1717500000
1
> TTL mykey
3600
*条件设置(NX)
> SET mykey "hello"
OK
> EXPIREAT mykey 1717500000 NX
1
> EXPIREAT mykey 1717500000 NX
0
*条件设置(GT)
> SET mykey "hello" EX 100
OK
> EXPIREAT mykey 1717500000 GT
1
> EXPIREAT mykey 1717490000 GT
0
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数数量不足 | 检查 key 和 unix-time-seconds 是否提供 |
| ERR value is not an integer | unix-time-seconds 不是整数 | 确保传入有效的 Unix 时间戳 |
| ERR GT and LT options at the same time | 同时使用了 GT 和 LT | 两者互斥,只能选一个 |
*最佳实践
- 场景:精确控制缓存失效时间、定时任务清理
- 与 EXPIRE 的区别:EXPIREAT 使用绝对时间戳,EXPIRE 使用相对秒数
- 建议配合 TIME 命令获取当前服务器时间,避免客户端时钟偏差
- 对于长期缓存,优先使用 EXPIREAT 避免相对时间漂移
*FAQ
Q1: EXPIREAT 和 EXPIRE 有什么区别? A: EXPIREAT 使用绝对 Unix 时间戳(秒),EXPIRE 使用相对秒数。EXPIREAT 更适合需要精确到某个时间点失效的场景。
Q2: 如果设置的时间戳已经过去会怎样? A: 键会被立即删除,返回 1(如果键存在)。
Q3: NX/XX/GT/LT 选项可以组合使用吗? A: NX 和 XX 互斥,GT 和 LT 互斥,但 NX/XX 可以与 GT/LT 组合使用(如 NX GT)。