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 会覆盖任何类型的旧值且不报错:原本是列表或哈希的键被写入字符串后,旧数据直接消失;写入前先确认键的用途与归属。
不带过期时间地写缓存,键会永久驻留,内存只涨不降,最终触发淘汰或内存告警;缓存写入应默认带过期,只有明确的持久数据才不带。
覆盖写会清除原有的过期时间:不希望过期被重置时,必须使用保留过期时间的选项,否则原先的过期设置会丢失。
写入检查清单
- 确认键的类型与用途,避免覆盖非字符串数据
- 缓存类写入默认带过期,时长按业务容忍度设定
- 需要原子条件写就用单条命令的选项,不要拆成先查后写
- 锁场景的过期时间要覆盖业务最长耗时
- 更新内容时确认是否需要保留原有过期时间
- 写入后抽查过期时间与值,确认符合预期
大批量写入时留意实例的写入压力与内存水位:一次写入大量不带过期的键会把内存迅速推高,触发淘汰策略后可能连带把还在用的热键淘汰掉。