首页/数据/数据库速查/SET 设置键值(含过期与条件选项)
Redis 命令96 条

SET 设置键值(含过期与条件选项)

Redis 最核心的写命令:SET key value 支持 EX/PX 过期、NX/XX 条件、GET 返回旧值、KEEPTTL 保留原 TTL,是缓存写入与简易锁的基石。

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

SET 是什么

SET 是 Redis 最核心的写命令,写入字符串键的值,并通过选项一次完成过期设置与条件写入:带过期让缓存有兜底,带条件选项实现「不存在才写」,带返回旧值的选项便于做前后对比。它有一个必须记住的特性是覆盖:目标键无论原本是字符串、列表还是哈希,都会被直接覆盖,而且不会报错。

基本信息

用途写入字符串键,可选设置过期与条件
语法SET 键 值 [NX|XX] [GET] [EX 秒|PX 毫秒|EXAT 时间戳|PXAT 时间戳|KEEPTTL]
返回值成功返回 OK,条件不满足时返回空
过期选项秒级、毫秒级、指定到期时间点、保留原过期
条件选项NX 不存在才写,XX 存在才写
平台版本Redis 2.6.12 起支持完整选项集

典型使用场景

  • 缓存回填:写入业务数据并设定过期时间
  • 分布式锁雏形:不存在才写入并带过期,避免死锁
  • 只有键存在时才更新,用于刷新缓存而不新建键
  • 保留原过期时间地更新内容,避免过期被意外清除
  • 写前对比旧值:原子地拿到旧值并写入新值
  • 计数器初始化:先写入初值再交给自增命令维护

常用写法

常用写法
SET article:1001 "{...json...}" EX 3600   # 写入并设一小时过期
SET lock:order:88 1 NX PX 5000   # 不存在才写,带毫秒级过期:分布式锁雏形
SET counter 10 XX GET   # 仅当键存在时写入,并返回旧值
SET config:flag on KEEPTTL   # 更新内容,保留原有过期时间
TTL article:1001   # 写完确认过期时间是否符合预期

选项速查

选项作用使用建议
EX 秒 / PX 毫秒设置过期时间写缓存必须带,避免键永久驻留
EXAT / PXAT指定到期时间点对齐业务周期的失效场景
KEEPTTL保留原有过期时间更新内容时别让过期被清掉
NX不存在时才写入锁与去重场景
XX存在时才写入只刷新已存在的缓存
GET返回写入前的旧值做前后对比或回滚判断
组合冲突同时给出多种过期选项会报错按语义只选一种
SET 会覆盖任何类型的旧值且不报错:原本是列表或哈希的键被写入字符串后,旧数据直接消失;写入前先确认键的用途与归属。
不带过期时间地写缓存,键会永久驻留,内存只涨不降,最终触发淘汰或内存告警;缓存写入应默认带过期,只有明确的持久数据才不带。
覆盖写会清除原有的过期时间:不希望过期被重置时,必须使用保留过期时间的选项,否则原先的过期设置会丢失。

写入检查清单

  • 确认键的类型与用途,避免覆盖非字符串数据
  • 缓存类写入默认带过期,时长按业务容忍度设定
  • 需要原子条件写就用单条命令的选项,不要拆成先查后写
  • 锁场景的过期时间要覆盖业务最长耗时
  • 更新内容时确认是否需要保留原有过期时间
  • 写入后抽查过期时间与值,确认符合预期
大批量写入时留意实例的写入压力与内存水位:一次写入大量不带过期的键会把内存迅速推高,触发淘汰策略后可能连带把还在用的热键淘汰掉。

易错点

  • 用先查后写两步操作代替条件写入:并发下出现竞态,两个客户端同时判断键不存在然后都写入
  • 写缓存不带过期:键永久驻留,内存只涨不降,直到触发淘汰或内存告警
  • 覆盖更新时没保留过期时间:原本的过期设置被清掉,缓存变成永久键
  • 同一条命令里同时给出多种过期选项:直接报语法错误,批量脚本中断执行
  • 对可能属于其他数据类型的键执行字符串写入:旧数据被覆盖且无法恢复,写入前应先确认键的类型

数据来源与参考

  • Redis 官方文档: SET
  • Redis 命令参考: Strings

相关工具

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