SET key value [EX seconds] [PX milliseconds] [NX|XX]
Set key
to hold the string value
. If key
already holds a value, it is overwritten, regardless of its type. Any previous time to live associated with the key is discarded on successful SET
operation.
将键key
设定为指定的“字符串”值。
如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。
当set
命令执行成功之后,之前设置的过期时间都将失效
选项
从2.6.12版本开始,redis为SET
命令增加了一系列选项:
EX
seconds – Set the specified expire time, in seconds.PX
milliseconds – Set the specified expire time, in milliseconds.NX
– Only set the key if it does not already exist.XX
– Only set the key if it already exist.EX
seconds – 设置键key的过期时间,单位时秒PX
milliseconds – 设置键key的过期时间,单位时毫秒NX
– 只有键key不存在的时候才会设置key的值XX
– 只有键key存在的时候才会设置key的值
注意: 由于SET
命令加上选项已经可以完全取代SETNX, SETEX, PSETEX的功能,所以在将来的版本中,redis可能会不推荐使用并且最终抛弃这几个命令。
返回值
simple-string-reply:如果SET
命令正常执行那么回返回OK
,否则如果加了NX
或者 XX
选项,但是没有设置条件。那么会返回nil。
例子
redis> SET mykey "Hello"
OK
redis> GET mykey
"Hello"
redis>
设计模式
注意: 下面这种设计模式并不推荐用来实现redis分布式锁。应该参考the Redlock algorithm的实现,因为这个方法只是复杂一点,但是却能保证更好的使用效果。
命令 SET resource-name anystring NX EX max-lock-time
是一种用 Redis 来实现锁机制的简单方法。
如果上述命令返回OK
,那么客户端就可以获得锁(如果上述命令返回Nil,那么客户端可以在一段时间之后重新尝试),并且可以通过DEL命令来释放锁。
客户端加锁之后,如果没有主动释放,会在过期时间之后自动释放。
可以通过如下优化使得上面的锁系统变得更加鲁棒:
- 不要设置固定的字符串,而是设置为随机的大字符串,可以称为token。
- 通过脚步删除指定锁的key,而不是DEL命令。
上述优化方法会避免下述场景:a客户端获得的锁(键key)已经由于过期时间到了被redis服务器删除,但是这个时候a客户端还去执行DEL命令。而b客户端已经在a设置的过期时间之后重新获取了这个同样key的锁,那么a执行DEL就会释放了b客户端加好的锁。
解锁脚本的一个例子将类似于以下:
if redis.call("get",KEYS[1]) == ARGV[1]
thenreturn redis.call("del",KEYS[1])
elsereturn 0
end
这个脚本执行方式如下:
EVAL …script… 1 resource-name token-value
SET key value [EX seconds] [PX milliseconds] [NX|XX]相关推荐
- redis - set key value [expiration EX seconds|PX milliseconds] [NX|XX]
**set key value [expiration EX seconds|PX milliseconds] [NX|XX]** EX seconds : 将键的过期时间设置为 seconds 秒. ...
- nx set 怎么实现的原子性_基于Redis的分布式锁实现
前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...
- nx set 怎么实现的原子性_【redis进阶(1)】redis的Lua脚本控制(原子性)
[toc] 为什么要用lua 减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少了网络往返时延. 原子操作:Redis会将整个脚本作 ...
- redis 所有模糊key 查询_写完这篇Redis由浅入深剖析快自闭了!
前言 常用的SQL数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的IO压力,但由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候, ...
- redis key失效的事件_Redis常见、常用的知识点
阅读文本大概需要15分钟. 1.为什么使用 Redis? 在项目中使用 Redis,主要考虑两个角度:性能和并发.如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要 ...
- Redis分布式锁/Redis的setnx命令如何设置key的失效时间(同时操作setnx和expire)
Redis的setnx命令是当key不存在时设置key,但setnx不能同时完成expire设置失效时长,不能保证setnx和expire的原子性.我们可以使用set命令完成setnx和expire的 ...
- redis set NX EX 命令
Redis 命令参考 » SET SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值 value 关联到 key . 如果 key 已 ...
- REDIS01_概述、安装、key、字符串String、列表List、集合Set、Hash哈希、Zset有序集合、持久化策略
文章目录 ①. Redis - 概述 ②. Redis - 安装 ③. 常用五大数据类型 ④. 字符串类型 - String ⑤. 列表类型 - list ⑥. 集合类型 - Set ⑦. 哈希类型 ...
- Redis 的 key 和数据类型
Redis 是一个高性能的键值对(key-value) 内存数据库.它支持存储的 value 类型十分丰富.性能极高,读写速度每秒 10w 次以上. Redis 的操作是原子性的.要么成功执行,要么失 ...
最新文章
- 多路归并排序_1600W整数排序多路归并
- 03JavaScript程序设计修炼之道-2019-06-20_20-31-49
- 5.2.3 std::atomic的相关操作
- 寄存器位读写,结构体位域定义,位域操作,位操作
- idirect3ddevice9虚函数偏移_C++ 虚函数简介
- CF1041D Glider
- Spring Cloud教程合集
- 锐捷网关交换机开启dhcp服务
- 数据结构韩顺平版(2)
- HTML模拟唯品会登陆和注册页面
- 前端js 面试题 forEach 和 map 有什么区别?
- 部分大数据平台运维题及答案
- Android 9 wifi PNO 扫描
- 计算机桌面图标损坏,损坏的图像,教您提示损坏的图像该怎么解决
- ndis拨号软件 linux,嵌入式linux系统下NDIS拨号
- 推荐一些比较好的代码编辑器
- Cool Edit 初学者 进行音频的编辑与处理 项目仿真 多媒体
- NBOJv2 Problem 1009 蛤玮的魔法(二分)
- 新基建必看系列——一文看懂爆火的智慧灯杆未来趋势及竞争格局
- 异或运算与奇偶校验的作用
热门文章
- C-C Primer Plus阅读笔记
- informatica中的workflow连接远程数据库
- Windows8 64位运行Silverlight程序不能访问WCF的解决方案
- 错误提示之:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性...
- 【Hibernate】Hibernate基本原理及概念详解
- awk命令扩展使用操作
- 本地Git关联远程Git时遇到的一些问题
- html5media使用
- MyBatis对于Java对象里的枚举类型处理
- NIO入门系列之第4章:缓冲区内部细节