- 用法
-
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
EX
秒数 -- 设置指定的过期时间,单位为秒(一个正整数)。PX
毫秒数 -- 设置指定的过期时间,单位为毫秒(一个正整数)。EXAT
时间戳-秒 -- 设置键将在指定的 Unix 时间过期,单位为秒(一个正整数)。PXAT
时间戳-毫秒 -- 设置键将在指定的 Unix 时间过期,单位为毫秒(一个正整数)。NX
-- 仅当键不存在时才设置键。XX
-- 仅当键已存在时才设置键。IFEQ
比较值 -- 如果比较值与现有值匹配,则设置键。如果键中存储的值不是字符串,则返回错误并中止SET
操作。KEEPTTL
-- 保留与键关联的生存时间。GET
-- 返回键中存储的旧字符串,如果键不存在则返回 nil。如果键中存储的值不是字符串,则返回错误并中止SET
操作。- 不设置固定字符串,而是设置一个不可猜测的大随机字符串,称为令牌(token)。
- 不用
DEL
释放锁,而是发送一个脚本,该脚本仅在值匹配时才移除键。 DELIFEQ
- 如果键的值与给定字符串匹配,则删除该键。-
给定
GET
和XX
:非 Nil 回复 表示键已设置。 -
给定
GET
和NX
:Nil 回复 表示键已设置。 -
给定
GET
和IFEQ
:如果回复等于comparison-value
,则键已设置。 -
给定
GET
和XX
:非 Null 回复 表示键已设置。 -
给定
GET
和NX
:Null 回复 表示键已设置。 -
给定
GET
和IFEQ
:如果回复等于comparison-value
,则键已设置。
将 key
设置为存储字符串 value
。如果 key
已持有值,则无论其类型如何,该值都将被覆盖。成功执行 SET
操作后,与键关联的任何先前的生存时间都将被丢弃。
选项
SET
命令支持一组修改其行为的选项
注意:由于 SET
命令选项可以替代 SETNX
、SETEX
、PSETEX
、GETSET
,因此在 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
移除锁。
达到过期时间后,锁将自动释放。
可以通过以下方式修改解锁方案,使该系统更加健壮
这避免了客户端在过期时间后尝试释放锁时,删除由另一个稍后获取锁的客户端创建的键。
解锁脚本的一个示例如下
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
调用
另请参阅
RESP2 回复
如果未给定 GET
,则为以下任意一种
如果给定 GET
,则为以下任意一种
请注意,当 GET
与 XX
/NX
/IFEQ
一起使用时,回复间接指示键是否已设置
RESP3 回复
如果未给定 GET
,则为以下任意一种
如果给定 GET
,则为以下任意一种
请注意,当 GET
与 XX
/NX
/IFEQ
一起使用时,回复间接指示键是否已设置
历史
版本 | 变更 |
---|---|
2.6.12 | 添加了 |
6.0.0 | 添加了 |
6.2.0 | 添加了 |
7.0.0 | 允许 |
8.1.0 | 添加了 |