SET
语法
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
- 可用版本
- Redis 开源版 1.0.0
- 时间复杂度
- O(1)
- ACL 分类
-
@write
,@string
,@slow
,
将 key
设置为字符串 value
。如果 key
已经持有值,无论其类型如何,旧值都会被覆盖。成功的 SET
操作会丢弃与该 key 关联的任何先前生存时间。
选项
SET
命令支持一组修改其行为的选项
EX
seconds -- 设置指定的过期时间,单位为秒(正整数)。PX
milliseconds -- 设置指定的过期时间,单位为毫秒(正整数)。EXAT
timestamp-seconds -- 设置 key 过期的指定的 Unix 时间,单位为秒(正整数)。PXAT
timestamp-milliseconds -- 设置 key 过期的指定的 Unix 时间,单位为毫秒(正整数)。NX
-- 仅在 key 不存在时设置。XX
-- 仅在 key 存在时设置。KEEPTTL
-- 保留与 key 关联的生存时间。GET
-- 返回存储在 key 的旧字符串值,如果 key 不存在则返回 nil。如果存储在 key 的值不是字符串,则返回错误并中止SET
。
注意:由于 SET
命令选项可以替代 SETNX
、SETEX
、PSETEX
、GETSET
,未来的 Redis 版本中这些命令可能会被弃用并最终移除。
示例
代码示例
模式
注意: 不建议使用以下模式,而推荐使用 Redlock 算法,该算法实现起来虽然稍微复杂一些,但提供更好的保证并具有容错能力。
命令 SET resource-name anystring NX EX max-lock-time
是实现 Redis 锁系统的一种简单方法。
如果上述命令返回 OK
(或命令返回 Nil 后等待一段时间重试),客户端可以获取锁;使用 DEL
即可移除锁。
锁将在过期时间到达后自动释放。
可以通过修改解锁模式来使此系统更加健壮,如下所示:
- 不设置固定的字符串,而是设置一个不可猜测的大随机字符串,称为 token。
- 不使用
DEL
释放锁,而是发送一个只有在值匹配时才移除 key 的脚本。
这可以避免客户端在过期时间后尝试释放锁,从而删除了由稍后获取锁的另一个客户端创建的 key。
解锁脚本的示例类似于以下内容:
if redis.call("get",KEYS[1]) == ARGV[1]
then
return redis.call("del",KEYS[1])
else
return 0
end
脚本应使用 EVAL ...script... 1 resource-name token-value
调用。
RESP2 回复
以下任何一种:
- Nil 回复:未给定
GET
:操作中止(与XX
/NX
选项之一冲突)。 - 简单字符串回复:
OK
。未给定GET
:Key 已设置。 - Nil 回复:给定
GET
:SET
之前 key 不存在。 - 批量字符串回复:给定
GET
:Key 的先前值。
RESP3 回复
以下任何一种:
- Null 回复:未给定
GET
:操作中止(与XX
/NX
选项之一冲突)。 - 简单字符串回复:
OK
。未给定GET
:Key 已设置。 - Null 回复:给定
GET
:SET
之前 key 不存在。 - 批量字符串回复:给定
GET
:Key 的先前值。
历史
- 从 Redis 版本 2.6.12 开始:添加了
EX
,PX
,NX
和XX
选项。 - 从 Redis 版本 6.0.0 开始:添加了
KEEPTTL
选项。 - 从 Redis 版本 6.2.0 开始:添加了
GET
,EXAT
和PXAT
选项。 - 从 Redis 版本 7.0.0 开始:允许同时使用
NX
和GET
选项。