首页/数据/数据库速查/SETEX / PSETEX 设置带过期的值
Redis 命令96 条

SETEX / PSETEX 设置带过期的值

设置值的同时指定秒/毫秒级过期:SETEX key seconds value、PSETEX key milliseconds value;等价于 SET key value EX/PX,历史 API 仍在广泛使用。

数据库速查数据更新于 2026-10-13

设置值同时设过期

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 表示键存在但没有设置过期时间。看到键消失就归因于过期,容易忽略内存不足导致的淘汰。

易错点

  • 计算得到的过期秒数为 0 或负数直接传给 SETEX:命令报错,业务链路中断,要先兜底成最小值
  • 把 SETEX 当续期手段:它会覆盖原值,续期应使用 EXPIRE 或 SET 的 KEEPTTL 选项
  • 给长周期缓存设过期却不设计回源与续期:热点键集中失效时数据库被瞬间打穿
  • 毫秒级场景用 SETEX:精度不够导致窗口偏差,短时占位类逻辑应使用 PSETEX

数据来源与参考

  • Redis 官方文档: SETEX
  • Redis 官方文档: PSETEX

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌