设置值同时设过期
SETEX key seconds value 与 PSETEX key milliseconds value 在一条命令内完成「写值 + 设过期时间」,分别是秒级与毫秒级精度。它们的语义等价于带 EX 或 PX 选项的 SET,属于 Redis 的元老级命令,存验证码、短信码、短期票据这类必须自动消失的数据时最常用,省略单独调用 EXPIRE 的一次往返。
基本信息
| 适用平台 | Redis 全版本;PSETEX 从 2.6.0 起 |
|---|---|
| 语法 | SETEX key seconds value / PSETEX key milliseconds value |
| 等价写法 | SET key value EX seconds / SET key value PX milliseconds |
| 原子性 | 写值与设过期在同一命令内完成 |
| 限制 | 过期时间必须大于 0,否则直接报错 |
典型使用场景
- 短信或邮件验证码:5 分钟内有效,过期自动清理不占内存
- 登录临时票据与一次性令牌,避免人工清理残留键
- 接口限流窗口的临时计数键,与业务窗口时长对齐
- 秒杀场景的短时占位标记,毫秒级精度控制时序
- 缓存预热数据:给短生命周期数据设置确定的过期时间
常用示例
常用示例
SETEX code:13800000000 300 654321 # 验证码 5 分钟有效
TTL code:13800000000 # 返回剩余秒数,约 300
GET code:13800000000 # 654321
PSETEX flashsale:88 500 stock=10 # 毫秒级过期,用于极短窗口
PTTL flashsale:88 # 返回剩余毫秒数,不超过 500
SETEX session:token 1800 uid:1001 # 会话票据 30 分钟
EXPIRE code:13800000000 600 # 已有键续期用 EXPIRE,不要用 SETEX 覆盖相关命令对照
| 命令 | 精度 | 说明 |
|---|---|---|
| SETEX | 秒 | 写值并设秒级过期 |
| PSETEX | 毫秒 | 写值并设毫秒级过期 |
| SET ... EX/PX | 秒或毫秒 | 等价写法,可叠加 NX/XX 条件 |
| EXPIRE / PEXPIRE | 秒或毫秒 | 只改已有键的过期时间 |
| TTL / PTTL | 秒或毫秒 | 读取剩余时间,-1 表示无过期 |
| GETEX | 秒或毫秒 | Redis 6.2+,取值同时可选更新过期 |
用 SET 覆盖一个已带过期时间的键会清除原 TTL(除非显式使用 KEEPTTL):把 SETEX 换成 SET 时容易踩到这个差异,键会从「会自动过期」变成永久存在。
过期时间小于等于 0 会直接返回错误 invalid expire time:把计算出的秒数直接传入前必须做兜底,否则业务会因为一条命令报错而中断。
排查过期键时先区分「过期」与「被淘汰」:TTL 返回 -2 表示键已不存在(可能已过期或被淘汰),-1 表示键存在但没有设置过期时间。看到键消失就归因于过期,容易忽略内存不足导致的淘汰。