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]相关推荐

  1. redis - set key value [expiration EX seconds|PX milliseconds] [NX|XX]

    **set key value [expiration EX seconds|PX milliseconds] [NX|XX]** EX seconds : 将键的过期时间设置为 seconds 秒. ...

  2. nx set 怎么实现的原子性_基于Redis的分布式锁实现

    前言 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问 ...

  3. nx set 怎么实现的原子性_【redis进阶(1)】redis的Lua脚本控制(原子性)

    [toc] 为什么要用lua 减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少了网络往返时延. 原子操作:Redis会将整个脚本作 ...

  4. redis 所有模糊key 查询_写完这篇Redis由浅入深剖析快自闭了!

    前言 常用的SQL数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的IO压力,但由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候, ...

  5. redis key失效的事件_Redis常见、常用的知识点

    阅读文本大概需要15分钟. 1.为什么使用 Redis? 在项目中使用 Redis,主要考虑两个角度:性能和并发.如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要 ...

  6. Redis分布式锁/Redis的setnx命令如何设置key的失效时间(同时操作setnx和expire)

    Redis的setnx命令是当key不存在时设置key,但setnx不能同时完成expire设置失效时长,不能保证setnx和expire的原子性.我们可以使用set命令完成setnx和expire的 ...

  7. redis set NX EX 命令

    Redis 命令参考 » SET SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值 value 关联到 key . 如果 key 已 ...

  8. REDIS01_概述、安装、key、字符串String、列表List、集合Set、Hash哈希、Zset有序集合、持久化策略

    文章目录 ①. Redis - 概述 ②. Redis - 安装 ③. 常用五大数据类型 ④. 字符串类型 - String ⑤. 列表类型 - list ⑥. 集合类型 - Set ⑦. 哈希类型 ...

  9. Redis 的 key 和数据类型

    Redis 是一个高性能的键值对(key-value) 内存数据库.它支持存储的 value 类型十分丰富.性能极高,读写速度每秒 10w 次以上. Redis 的操作是原子性的.要么成功执行,要么失 ...

最新文章

  1. 多路归并排序_1600W整数排序多路归并
  2. 03JavaScript程序设计修炼之道-2019-06-20_20-31-49
  3. 5.2.3 std::atomic的相关操作
  4. 寄存器位读写,结构体位域定义,位域操作,位操作
  5. idirect3ddevice9虚函数偏移_C++ 虚函数简介
  6. CF1041D Glider
  7. Spring Cloud教程合集
  8. 锐捷网关交换机开启dhcp服务
  9. 数据结构韩顺平版(2)
  10. HTML模拟唯品会登陆和注册页面
  11. 前端js 面试题 forEach 和 map 有什么区别?
  12. 部分大数据平台运维题及答案
  13. Android 9 wifi PNO 扫描
  14. 计算机桌面图标损坏,损坏的图像,教您提示损坏的图像该怎么解决
  15. ndis拨号软件 linux,嵌入式linux系统下NDIS拨号
  16. 推荐一些比较好的代码编辑器
  17. Cool Edit 初学者 进行音频的编辑与处理 项目仿真 多媒体
  18. NBOJv2 Problem 1009 蛤玮的魔法(二分)
  19. 新基建必看系列——一文看懂爆火的智慧灯杆未来趋势及竞争格局
  20. 异或运算与奇偶校验的作用

热门文章

  1. C-C Primer Plus阅读笔记
  2. informatica中的workflow连接远程数据库
  3. Windows8 64位运行Silverlight程序不能访问WCF的解决方案
  4. 错误提示之:已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性...
  5. 【Hibernate】Hibernate基本原理及概念详解
  6. awk命令扩展使用操作
  7. 本地Git关联远程Git时遇到的一些问题
  8. html5media使用
  9. MyBatis对于Java对象里的枚举类型处理
  10. NIO入门系列之第4章:缓冲区内部细节