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

  • 如果未指定 GET,则执行以下操作之一:
  • 以下两种情况下空回复.
    • 键不存在并且指定了XX/IFEQ/IFDEQ。未创建键。
    • 键存在,并且指定了 NX 或指定的 IFEQ/IFNE/IFDEQ/IFDNE 条件为假。未设置键。
  • 简单字符串回复: OK: 键已设置。
  • 如果指定了 GET,则为以下其中一项:
  • 空回复:在SET操作之前该键不存在,无论该键是否创建。
  • 批量字符串回复:键先前的值,无论是否设置键。

资料来源:Redis 官方 SET 文档;中文内容参考 Redis 文档许可。