为什么不用原生的redis setnx做分布式锁
时间: 2023-12-02 19:39:56 浏览: 235
使用原生的 Redis setNx 命令实现分布式锁存在以下问题:
1. 没有过期时间,如果持有锁的客户端崩溃或者网络异常,其他客户端将无法获取锁。
2. 没有锁的持有者标识,即任何客户端都可以释放锁,这可能会导致误解锁或者锁被其他客户端意外释放。
3. 不支持重入,即同一个客户端在持有锁的情况下再次获取锁会失败。
因此,为了解决这些问题,需要对原生的 Redis setNx 命令进行封装或者选择使用其他的分布式锁实现方式。
相关问题
Redisson setnx 和redis setnx的区别
`Redisson SetNX` 是 Redisson 这个 Java 对 Redis 的客户端库提供的一个方法,用于在 Redis 数据库中创建一个新的键值集合(Set),如果该键不存在,则设置新集合并返回 `true`,否则不做任何操作并返回 `false`。这是一个原子操作,保证了在并发环境中的一致性。
`Redis SETNX` 是原生 Redis 操作命令,同样用于创建新的集合成员,如果指定的键不存在则添加成功并返回 `1`,存在则返回 `0`。这个操作也是原子的,不会因为其他客户端的写入操作而失败。
两者的区别主要在于:
1. **库级支持**:Redisson 提供的是基于 Redis 原理的 Java API 实现,SETNX 被封装为了更方便使用的 Java 方法;而 SETNX 是直接操作 Redis 数据库本身的命令。
2. **API 轻量化**:使用 Redisson,开发者无需关心底层的 Redis 连接管理和协议交互,直接通过它的 API 完成操作,而 SETNX 则需要开发者手动管理连接和编写 Redis 命令。
3. **错误处理**:Redisson 可能提供更丰富的异常处理和错误反馈,比如超时、连接断开等情况;SETNX 则通常只返回是否成功的数字结果。
4. **功能扩展性**:Redisson 库可能包含更多的功能和特性,如事务、分布式锁等,而 SETNX 更专注于基本的集合操作。
redis setnx和redission加锁区别 以及分别如何使用
引用\[1\]:分布式锁的实现思路是利用Redis的set nx ex命令来获取锁,并设置过期时间。通过保存线程标识来判断是否可以释放锁。这种方式利用了Redis的互斥性和过期时间特性,同时也可以利用Redis集群来保证高可用和高并发特性。\[1\]
引用\[2\]:红锁算法认为,只要2N + 1个节点加锁成功,就认为获取了锁。解锁时需要将所有实例解锁。具体流程是顺序向多个节点请求加锁,并根据一定的超时时间来判断是否跳过某个节点。如果有足够数量的节点加锁成功并且花费的时间小于锁的有效期,就认为加锁成功。\[2\]
引用\[3\]:删除锁的正确姿势之一是使用Lua脚本,通过Redis的eval/evalsha命令来运行。在Lua脚本中,可以通过比较锁的值与传入的标识符来判断是否可以删除锁。如果值相等,则执行删除操作;否则返回0表示删除失败。\[3\]
根据以上引用内容,可以得出以下答案:
Redis的setnx命令是用来设置一个键值对,如果键不存在则设置成功,返回1;如果键已经存在则设置失败,返回0。在分布式锁中,可以利用setnx命令来实现互斥性,即只有一个线程能够成功获取锁。而redission是一个基于Redis的Java分布式锁框架,它封装了分布式锁的实现细节,提供了更方便的API来使用分布式锁。
使用setnx命令获取锁的步骤如下:
1. 使用setnx命令尝试获取锁,如果返回1表示获取成功,可以执行业务逻辑;如果返回0表示获取失败,需要等待或者执行其他操作。
2. 设置锁的过期时间,避免锁一直被占用而无法释放。
3. 执行业务逻辑。
4. 释放锁时,先判断锁的值是否与自己的标识符相等,如果相等则删除锁。
而redission的使用方式更加简单,可以通过以下步骤来使用:
1. 创建一个RedissonClient对象,连接到Redis集群。
2. 使用RLock对象来加锁和解锁,RLock对象提供了lock()和unlock()方法来实现加锁和解锁操作。
3. 执行业务逻辑。
4. 在业务逻辑执行完成后,调用unlock()方法释放锁。
总结来说,Redis的setnx命令是一种原生的分布式锁实现方式,需要手动处理加锁和解锁的逻辑;而redission是一个封装了分布式锁实现细节的框架,提供了更方便的API来使用分布式锁。
#### 引用[.reference_title]
- *1* [基于Redis的setnx的分布式锁的实现(结合具体案例)另加Redission的介绍](https://blog.csdn.net/liyanglaila/article/details/130343326)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* *3* [细说Redis分布式锁:setnx/redisson/redlock?了解一波?](https://blog.csdn.net/fengyuyeguirenenen/article/details/124180012)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文