互斥锁 setex,setnx
时间: 2023-10-06 09:05:33 浏览: 86
setex 和 setnx 都是 Redis 的命令,用于实现分布式锁的功能。
setex 命令用于设置一个带有过期时间的键值对。它的语法如下:
```
SETEX key seconds value
```
其中,key 是要设置的键,seconds 是过期时间(以秒为单位),value 是要设置的值。该命令会将 key 的值设置为 value,并在 seconds 秒后自动过期,即键值对会被自动删除。
setnx 命令用于设置一个不存在的键值对。它的语法如下:
```
SETNX key value
```
其中,key 是要设置的键,value 是要设置的值。如果 key 不存在,则设置成功,返回 1;如果 key 已经存在,则设置失败,返回 0。setnx 命令通常用于实现分布式锁的加锁操作,因为它能够确保只有一个客户端能够成功地将键设置为某个特定值,从而实现互斥访问。
相关问题
基于setnx拿锁设置锁的过期时间 自动续期,使用看门狗线程自动续期 原子性:将判断锁释放锁的逻辑代码用lua脚本编写交给redis执行 重入行:可以使用Hash记录锁的重入次数,释放时使用次数-1,=0则表示完全释放同时删除自己的锁
基于`SETNX`获取锁并设置过期时间是Redisson分布式锁常用的一种实现方式。首先,客户端会尝试使用`SETEX`(Set EXpiration Time)命令,该命令会在设置键值的同时设定一个过期时间,例如:
```shell
SETEX mylock 60 1 // 设置key 'mylock'的值为客户端唯一标识符,过期时间为60秒
```
如果`SETNX`命令成功,说明锁被获取,并且有一个定时器设置了60秒后自动过期,如果在此期间锁未被释放,将会自动失效。
对于自动续期和看门狗线程,Redisson会在过期前启动一个后台任务,通常是异步执行的,当检测到锁即将过期时,它会再次尝试获取锁并延长过期时间,这个过程是非阻塞的,保证了系统的高可用性。
至于原子性和Lua脚本,Redisson利用Redis的Lua脚本环境来确保获取、续期和解锁的过程是原子性的。 Lua脚本可以在服务器端执行,避免了网络延迟带来的不确定性,提高了操作的可靠性。例如,释放锁的逻辑可以用以下形式的Lua脚本:
```lua
if redis.call("GET", KEYS[1]) == ARGV[1] then
redis.call("EXPIRE", KEYS[1], 60) -- 如果匹配,更新过期时间
redis.call("DEL", KEYS[1]) -- 锁被释放,删除key
else
return false -- 错误:钥匙不是预期的值
end
```
重入锁则是通过哈希表(Hash)来维护,每个锁都有一个关联的哈希字段存储当前持有者的计数,每增加一次就加1,减少时减1,只有当计数变为0时才认为锁完全被释放。这使得同一客户端可以多次尝试获取同一个锁而不违反互斥原则。
python redis setnx与set区别
Python Redis中的setnx和set命令有以下区别:
1. 功能不同:set命令用于将字符串值关联到指定的键,如果键已经存在,则会覆盖旧值。而setnx命令只在键不存在时才会将值关联到键上,如果键已经存在,则不进行任何操作。
2. 返回值不同:set命令在设置成功时返回"OK",而setnx命令在设置成功时返回1,如果设置失败则返回0。
3. 用途不同:set命令主要用于设置键值对,可以用于缓存、存储用户登录状态等场景。而setnx命令通常用于实现分布式锁,可以用于多个服务同时调用一个方法时实现互斥效果。
总结起来,set命令是用于设置键值对的通用命令,而setnx命令是用于实现分布式锁等特殊场景的命令,只在键不存在时才会进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [使用redis的setnx实现分布式锁(python实现)](https://blog.csdn.net/qq_37253540/article/details/125575631)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [python-redis-lock:通过redis SET NX EX和BLPOP实现的锁上下文管理器](https://download.csdn.net/download/weixin_42116734/18353999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [redis中set、setnx、setex区别_Allione_新浪博客](https://blog.csdn.net/dsydly/article/details/109659103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
阅读全文