设置键值
语法
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
已经存在,则覆盖它,无论其数据类型如何。任何之前与键关联的生存时间都会在 SET
操作成功后被丢弃。
选项
SET
命令支持一组选项来修改其行为
EX
seconds -- 设置生存时间,以秒为单位(正整数)。PX
milliseconds -- 设置生存时间,以毫秒为单位(正整数)。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
来释放锁。
锁将在达到过期时间后自动释放。
可以通过修改解锁方案来使该系统更加健壮
- 不要设置固定的字符串,而是设置一个不可猜测的随机字符串,称为令牌。
- 不要使用
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
:操作被中止(与XX
/NX
选项之一冲突)。 - 简单字符串回复:
OK
。未提供GET
:键已设置。 - 空回复: 提供
GET
:键在SET
之前不存在。 - 块字符串回复: 提供
GET
:键的先前值。
RESP3 响应
以下任何一种
- 空回复: 未提供
GET
:操作被中止(与XX
/NX
选项之一冲突)。 - 简单字符串回复:
OK
。未提供GET
:键已设置。 - 空回复: 提供
GET
:键在SET
之前不存在。 - 块字符串回复: 提供
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
选项。