*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)。