# SET

设置key的字符串值

语法

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 毫秒——设置指定的过期时间,以毫秒为单位。
  • EXAT timestamp-seconds -- 设置密钥过期的指定 Unix 时间,以秒为单位。
  • PXAT timestamp-milliseconds -- 设置密钥过期的指定 Unix 时间,以毫秒为单位。
  • NX-- 仅当密钥不存在时才设置它。
  • XX-- 仅当密钥已存在时才设置它。
  • KEEPTTL-- 保留与密钥关联的生存时间。
  • GET-- 返回存储在 key 中的旧字符串,如果 key 不存在,则返回 nil。SET如果存储在 key 的值不是字符串,则返回并中止错误。

注意:由于SET命令选项可以替换 SETNX, SETEX, PSETEX, GETSET,因此在未来的 Redis 版本中,这些命令可能会被弃用并最终被删除。

# 返回

简单字符串回复OK如果SET正确执行。

Null 回复(nil)如果SET由于用户指定了NXorXX选项但不满足条件而未执行操作。

如果命令与GET选项一起发出,则上述内容不适用。它将改为如下回复,无论是否SET实际执行:

批量字符串回复 :存储在键中的旧字符串值。

空回复(nil)如果密钥不存在。

# 例子

redis> SET mykey "Hello"
"OK"
redis> GET mykey
"Hello"
redis> SET anotherkey "will expire in a minute" EX 60
"OK"
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

# 历史

  • 从 Redis 版本 2.6.12 开始:添加了、EXPX选项。NX``XX
  • 从 Redis 版本 6.0.0 开始:添加了该KEEPTTL选项。
  • 从 Redis 版本 6.2.0 开始:添加了GET,EXATPXAT选项。
  • 从 Redis 版本 7.0.0 开始:允许NXGET选项一起使用。

# 反馈

如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。

Last Updated: 4/18/2023, 8:45:33 AM