SET
设置键的字符串值;如果键不存在则创建,原有类型不影响覆盖。
语法
SET key value [NX | XX | IFEQ ifeq-value | IFNE ifne-value | IFDEQ ifdeq-digest | IFDNE ifdne-digest] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
引入版本:1.0.0
复杂度摘要:O(1)
设置 key 以保存字符串 value。如果 key 已保存一个值,则无论其类型如何,该值都会被覆盖。成功执行 SET 操作后,与该键关联的任何先前的生存时间都将被丢弃。
必需参数
key
键名称。
value
要设置的字符串值。
可选参数
以下选项修改命令的行为。条件选项(NX、XX、IFEQ、IFNE、IFDEQ、IFDNE)是互斥的,过期选项(EX、PX、EXAT、PXAT、KEEPTTL)也是互斥的。
NX
仅当键尚不存在时才设置该键。
XX
仅当键已存在时才设置该键。
IFEQ ifeq-value
仅当键的当前值等于 ifeq-value 时,才设置键的值和过期时间。如果键不存在,则不会创建它。
IFNE ifne-value
仅当键的当前值不等于 ifne-value 时,才设置键的值和过期时间。如果键不存在,则会创建它。
IFDEQ ifdeq-digest
仅当键当前值的哈希摘要等于 ifdeq-digest 时,才设置键的值和过期时间。如果键不存在,则不会创建它。有关详细信息,请参阅下面的 哈希摘要 部分。
IFDNE ifdne-digest
仅当键当前值的哈希摘要不等于 ifdne-digest 时,才设置键的值和过期时间。如果键不存在,则会创建它。有关详细信息,请参阅下面的 哈希摘要 部分。
GET
返回存储在键中的旧字符串,如果键不存在则返回 nil。如果存储在键中的值不是字符串,则会返回错误并中止 SET。
EX seconds
设置指定的过期时间,以秒为单位(正整数)。
PX milliseconds
设置指定的过期时间,以毫秒为单位(正整数)。
EXAT unix-time-seconds
设置键过期的指定 Unix 时间,以秒为单位(正整数)。
PXAT unix-time-milliseconds
设置键过期的指定 Unix 时间,以毫秒为单位(正整数)。
KEEPTTL
保留与键关联的生存时间。
注意:由于 SET 命令选项可以替换 SETNX、SETEX、PSETEX、GETSET,因此在 Redis 的未来版本中,这些命令可能会被弃用并最终删除。
示例
> SET mykey "Hello"
OK
> GET mykey
"Hello"
> SET anotherkey "will expire in a minute" EX 60
OK
详细说明
哈希摘要
哈希摘要是字符串值的固定大小的数字表示,使用 XXH3 哈希算法计算。 Redis 使用此哈希摘要进行高效的比较操作,而无需比较完整的字符串内容。您可以使用 DIGEST 命令检索键的哈希摘要,该命令将其作为十六进制字符串返回,您可以将其与 IFDEQ 和 IFDNE 选项以及 DELEX 命令的 IFDEQ 和 IFDNE 选项一起使用。
图案
注意:不鼓励使用以下模式,而使用 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 调用脚本
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ✅ 标准 |
✅ 标准 |
返回值
RESP2
- 如果未指定
GET,则执行以下操作之一: - 以下两种情况下空批量字符串回复.
- 键不存在并且指定了
XX/IFEQ/IFDEQ。未创建键。 - 键存在,并且指定了
NX或指定的IFEQ/IFNE/IFDEQ/IFDNE条件为假。未设置键。
- 键不存在并且指定了
- 简单字符串回复:
OK: 键已设置。 - 如果指定了
GET,则为以下其中一项: - 空批量字符串回复:在
SET操作之前该键不存在,无论该键是否创建。 - 批量字符串回复:键先前的值,无论是否设置键。
RESP3
资料来源:Redis 官方 SET 文档;中文内容参考 Redis 文档许可。