SET

用法
SET key value [ NX | XX | IFEQ comparison-value ] [ GET ] [ EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL ]
复杂度
O(1)
自从
1.0.0
ACL 类别
@string, @write, @slow

key 设置为存储字符串 value。如果 key 已持有值,则无论其类型如何,该值都将被覆盖。成功执行 SET 操作后,与键关联的任何先前的生存时间都将被丢弃。

选项

SET 命令支持一组修改其行为的选项

  • EX 秒数 -- 设置指定的过期时间,单位为秒(一个正整数)。
  • PX 毫秒数 -- 设置指定的过期时间,单位为毫秒(一个正整数)。
  • EXAT 时间戳-秒 -- 设置键将在指定的 Unix 时间过期,单位为秒(一个正整数)。
  • PXAT 时间戳-毫秒 -- 设置键将在指定的 Unix 时间过期,单位为毫秒(一个正整数)。
  • NX -- 仅当键不存在时才设置键。
  • XX -- 仅当键已存在时才设置键。
  • IFEQ 比较值 -- 如果比较值与现有值匹配,则设置键。如果键中存储的值不是字符串,则返回错误并中止 SET 操作。
  • KEEPTTL -- 保留与键关联的生存时间。
  • GET -- 返回键中存储的旧字符串,如果键不存在则返回 nil。如果键中存储的值不是字符串,则返回错误并中止 SET 操作。

注意:由于 SET 命令选项可以替代 SETNXSETEXPSETEXGETSET,因此在 Valkey 的未来版本中,这些命令可能会被弃用并最终移除。

示例

基本用法

127.0.0.1:6379> SET mykey "Hello"
OK
127.0.0.1:6379> GET mykey
"Hello"

设置一个值和过期时间。

127.0.0.1:6379> SET anotherkey "will expire in a minute" EX 60
OK

有条件地设置一个值。

127.0.0.1:6379> SET foo "Initial Value"
OK
127.0.0.1:6379> GET foo
"Initial Value"
127.0.0.1:6379> SET foo "New Value" IFEQ "Initial Value"
OK
127.0.0.1:6379> GET foo
"New Value"

模式

注意:不建议使用以下模式,而应使用Redlock 算法,该算法实现起来只稍微复杂一点,但提供了更好的保证且容错。

命令 SET resource-name anystring NX EX max-lock-time 是使用 Valkey 实现锁定系统的简单方法。

如果上述命令返回 OK(如果返回 Nil 则在一段时间后重试),客户端可以获取锁,并仅使用 DEL 移除锁。

达到过期时间后,锁将自动释放。

可以通过以下方式修改解锁方案,使该系统更加健壮

  • 不设置固定字符串,而是设置一个不可猜测的大随机字符串,称为令牌(token)。
  • 不用 DEL 释放锁,而是发送一个脚本,该脚本仅在值匹配时才移除键。

这避免了客户端在过期时间后尝试释放锁时,删除由另一个稍后获取锁的客户端创建的键。

解锁脚本的一个示例如下

if server.call("get",KEYS[1]) == ARGV[1]
then
    return server.call("del",KEYS[1])
else
    return 0
end

该脚本应使用 EVAL ...script... 1 resource-name token-value 调用

另请参阅

  • DELIFEQ - 如果键的值与给定字符串匹配,则删除该键。

RESP2 回复

如果未给定 GET,则为以下任意一种

如果给定 GET,则为以下任意一种

请注意,当 GETXX/NX/IFEQ 一起使用时,回复间接指示键是否已设置

  • 给定 GETXX:非 Nil 回复 表示键已设置。

  • 给定 GETNXNil 回复 表示键已设置。

  • 给定 GETIFEQ:如果回复等于 comparison-value,则键已设置。

RESP3 回复

如果未给定 GET,则为以下任意一种

如果给定 GET,则为以下任意一种

请注意,当 GETXX/NX/IFEQ 一起使用时,回复间接指示键是否已设置

  • 给定 GETXX:非 Null 回复 表示键已设置。

  • 给定 GETNXNull 回复 表示键已设置。

  • 给定 GETIFEQ:如果回复等于 comparison-value,则键已设置。

历史

版本 变更
2.6.12

添加了 EXPXNXXX 选项。

6.0.0

添加了 KEEPTTL 选项。

6.2.0

添加了 GETEXATPXAT 选项。

7.0.0

允许 NXGET 选项一起使用。

8.1.0

添加了 IFEQ 选项。