Redis SET 命令手册

  • 1. 可选项
  • 2. 返回值
  • 3. 历史变化
  • 4. 案例
  • 5. 模式


从Redis 1.0.0 起可用
时间复杂度:O(1)

设置 key 以保存字符串 value。如果 key 已经保存了一个 value,则无论其类型如何,都会覆盖该值。成功的 SET 操作将丢弃与该键任何以前的时间关联的内容。

命令格式:SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]

1. 可选项

SET命令支持一组可选项来修改它的行为:

  • EX seconds:设置指定的过期时间,单位为秒;
  • PX milliseconds:设置指定的过期时间,单位为毫秒;
  • EXAT timestamp-seconds:设置key过期的指定Unix时间(以秒为单位);
  • PXAT timestamp-milliseconds:设置key过期的指定Unix时间(以毫秒为单位);
  • NX:只有当key不存在时才设置它;
  • XX:只有当key存在时才设置它;
  • KEEPTTL:保存与key建立连接的时间;
  • GET:返回存储在value上的旧值,或当value不存在时返回 nil 。

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

2. 返回值

简单字符串应答:如果SET被正确执行,则OK。批量字符串应答:当设置GET选项时,旧值存储在键上,或当键不存在时为nil。Null应答:如果用户指定了NX或XX选项但条件不满足而没有执行SET操作,或者用户指定了GET选项但之前没有键值,则返回Null Bulk reply。

3. 历史变化

  • >=2.6.12:添加可选项 EX, PX和 XX;
  • >=6.0:添加可选项 KEEPTTL;
  • >=6.2:添加可选项 GET, EXAT和PXAT选项。

4. 案例

>set mykey "hello"
OK
> get mykey
"hello"
> set anotherkey "will expire in a minute" ex 60
OK

5. 模式

注意:为了支持Redlock算法,不建议使用下面的模式,它的实现稍微复杂一点,但是提供了更好的保证,并且容错能力强。

命令 SET resource-name anystring NX EX max-lock-time 是用Redis实现锁定系统的一种简单方法。

如果上面的命令返回OK(或重试一段时间后,如果命令返回Nil)客户端可以获得锁,并使用DEL就可以删除锁。

锁定将在到达过期时间后自动释放。

修改解锁模式可以使这个系统更健壮,如下所示::

  • 与其设置固定的字符串,不如设置一个不可猜测的大型随机字符串,称为token;
  • 发送一个只在值匹配时移除键的脚本,而不是使用DEL释放锁。

这避免了客户端在过期时间后试图释放锁,删除另一个客户端在之后创建的key。

解锁脚本的示例如下:

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