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