设置
Syntax
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
- Available since:
- 1.0.0
- Time complexity:
- O(1)
- ACL categories:
-
@write
,@string
,@slow
,
将key
设置为保存字符串value
。
如果key
已经保存了一个值,无论其类型如何,它都会被覆盖。
在成功的SET
操作中,与键相关的任何先前生存时间都将被丢弃。
选项
SET
命令支持一组修改其行为的选项:
EX
seconds -- 设置指定的过期时间,单位为秒(一个正整数)。PX
毫秒 -- 设置指定的过期时间,单位为毫秒(一个正整数)。EXAT
timestamp-seconds -- 设置指定的Unix时间,以秒为单位(一个正整数),在此时间键将过期。PXAT
timestamp-milliseconds -- 设置指定的Unix时间(以毫秒为单位,正整数),在该时间点键将过期。NX
-- 仅当键不存在时才设置键。XX
-- 仅当键已存在时才设置。KEEPTTL
-- 保留与键关联的生存时间。GET
-- 返回存储在键中的旧字符串,如果键不存在则返回nil。如果存储在键中的值不是字符串,则返回错误并中止SET
。
注意:由于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 回复
以下任意一项:
- Nil reply:
GET
未提供:操作被中止(与XX
/NX
选项之一冲突)。 - Simple string reply:
OK
.GET
未提供: 键已设置。 - Nil reply:
GET
给定:在SET
之前键不存在。 - Bulk string reply:
GET
给定: 键的先前值。
RESP3 回复
以下任意一项:
- Null reply:
GET
未提供: 操作被中止 (与XX
/NX
选项之一冲突). - Simple string reply:
OK
.GET
未提供: 键已设置。 - Null reply:
GET
给定:在SET
之前键不存在。 - Bulk string reply:
GET
给定:键的先前值。
历史
- 从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
选项一起使用。