英翻中:https://redis.io/commands/set

文章访问量:

redis官网–set指令翻译

SET指令

格式

SET key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAt unix-time-millisecond|KEEPTTL]

可用版本:1.0.0

时间复杂度:O(1)

访问控制列表(ACL:Acess Control List)类别:@write,@string,@slow

SET指令通过设置key来保存一个string类型的值。即便key已经保存了某个值,SET指令也会直接将其覆写并忽略原来值的类型。并且在SET指令执行成功的情况下,该键在此之前设置的的TTL(Time To Live)都将失效。

可用选项

SET指令支持一系列修改其行为的选项,如下:

  • EX seconds— 设置一个特定的过期时间,该过期时间以秒为单位。
  • PX milliseconds — 设置一个特定的过期时间,该过期时间以毫秒为单位。
  • EXAT timestamp-seconds — 将设置以UNIX时间为准的过期时间,单位为秒。
  • PXAT timestamp-millisecond — 将设置以UNIX时间为准的过期时间,单位为毫秒。
  • NX — 当键不存在时执行SET指令。
  • XX — 当键存在时执行SET指令。
  • KEEPTTL — 保存TTL时间。
  • GET — 返回该键在SET指令执行前所保存的值,如果键不存在则返回nil。如果key对应的值不是String类型,SET指令会取消执行并返回Error。

注:由于SET指令带上这些可用选项之后,就可以代替SETNX,SETEX,PSETEX,GETSET。所以在redis以后的版本中可能会移除这些指令。

返回值

Simple string reply:如果SET指令执行成功会返回OK

NUll reply:如果用户在使用SET指令时添加了 NX或XX选项,但对应的键存在/不存在,导致SET指令没有执行,会返回nil。

如果SET指令加上了GET选项,那么上面两条则不再适用。无论SET指令是否正常执行都会返回以下内容:

Bulk string reply:键在SET指令之前前保存的值。

Null reply:如果键不存在则返回nil。

设计模式

注意:下列的模式并不建议拿来实现redis的分布式锁。而是参考实现更复杂但提供更好保障和容错率的the Redlock algorithm。

指令SET resource-name anystring NX EX max-lock-time是在redis中实现分布式锁的一种简单方式。

如果上面这条指令返回OK,那么客户端就可以获得锁,(或者客户端在该指令返回nil时客户端多试几次),然后通过DEL指令释放锁,

当键到了过期时间时,锁会被自动释放。

通过修改解锁模式还可以使系统变得更加鲁棒:

写者注

鲁棒,即robust的谐音。鲁棒性指的是系统在收到外部干扰或者内部参数摄动等不确定因素的干扰时,还能保持其结构和功能稳定。
  • 设置一个随机不可猜测的大字符串,而不是设置一个固定的。这个大字符串被称为记号(token)。
  • 设置一个只有当值匹配时才移除键的脚本,而不是用DEL指令去释放锁。

这样可以避免当A客户端的键由于到了过期时间而被删除后,而B客户端在该时间后重新创建了一个相同键的锁,此时A客户端若再执行DEL指令就会释放B客户端的锁。

解锁的脚本和下列的代码相似:

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

Subscribe
提醒
0 评论
Inline Feedbacks
View all comments
0
在此留下你的评论x