设置
语法
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
- 从以下位置开始可用:
- 1.0.0
- 时间复杂度:
- O(1)
- ACL 类别:
-
@write
,@string
,@slow
,
设置key
以按住字符串value
.
如果key
already hold a value,则无论其类型如何,它都会被覆盖。
成功后,将丢弃与密钥关联的任何先前的生存时间SET
操作。
选项
这SET
命令支持一组修改其行为的选项:
EX
seconds (秒) -- 设置指定的过期时间,以秒为单位(正整数)。PX
milliseconds -- 设置指定的过期时间,以毫秒为单位(正整数)。EXAT
timestamp-seconds -- 设置密钥过期的指定 Unix 时间,以秒为单位(正整数)。PXAT
timestamp-milliseconds -- 设置密钥过期的指定 Unix 时间,以毫秒为单位(正整数)。NX
-- 仅当 key 尚不存在时才设置 key。XX
-- 仅当 key 已存在时才设置 key。KEEPTTL
-- 保留与键关联的生存时间。GET
-- 返回存储在 key 处的旧字符串,如果 key 不存在,则返回 nil。返回一个错误,并且SET
如果存储在 key 的值不是字符串,则 aborted 。
注意:由于SET
命令选项可以将SETNX
,SETEX
,PSETEX
,GETSET
,在 Redis 的未来版本中,这些命令可能会被弃用并最终删除。
例子
代码示例
模式
注意:不建议使用以下模式,而使用 Redlock 算法,该算法的实现稍微复杂一些,但提供了更好的保证并且具有容错能力。
命令SET resource-name anystring NX EX max-lock-time
是使用 Redis 实现锁定系统的一种简单方法。
如果上述命令返回OK
(如果命令返回 Nil,请在一段时间后重试),然后仅使用DEL
.
达到过期时间后,锁将自动释放。
可以使此系统更健壮地修改解锁架构,如下所示:
- 不要设置固定字符串,而是设置一个不可猜测的大随机字符串,称为 token。
- 而不是使用
DEL
,请发送一个脚本,该脚本仅在值匹配时删除键。
这样可以避免客户端在过期时间后尝试释放锁,删除稍后获取锁的另一个客户端创建的密钥。
解锁脚本的示例类似于以下内容:
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 回复
以下任何一项:
- 无 回复:
GET
not given:作已中止(与XX
/NX
选项)。 - 简单的字符串回复:
OK
.GET
not given:已设置键。 - 无 回复:
GET
given:该 key 在SET
. - 批量字符串回复:
GET
given:键的上一个值。
RESP3 回复
以下任何一项:
- 空回复:
GET
not given:作已中止(与XX
/NX
选项)。 - 简单的字符串回复:
OK
.GET
not given:已设置键。 - 空回复:
GET
given:该 key 在SET
. - 批量字符串回复:
GET
given:键的上一个值。
历史
- 从 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
选项一起使用。