java实现redis分布式锁使用SETNX与EXPIRE
时间: 2025-05-30 18:10:25 AIGC 浏览: 30
### Java 基于 Redis 的分布式锁实现(SETNX 和 EXPIRE)
以下是使用 `SETNX` 和 `EXPIRE` 命令在 Java 中实现基于 Redis 的分布式锁的示例代码:
```java
import redis.clients.jedis.Jedis;
public class DistributedLock {
// 定义锁的Key
private static final String LOCK_KEY = "distributed_lock";
// 定义锁的有效时间(单位:秒)
private static final int LOCK_EXPIRE_TIME = 10;
public boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
// 尝试获取锁,如果不存在则设置并返回true;存在则不覆盖并返回false
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
return "OK".equals(result); // 如果返回值为"OK",表示成功获取锁
}
public void releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
// 使用 Lua 脚本来确保原子性解锁操作
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
jedis.eval(script, java.util.Collections.singletonList(lockKey), java.util.Collections.singletonList(requestId));
}
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
DistributedLock distributedLock = new DistributedLock();
String uniqueRequestId = Thread.currentThread().getName();
try {
if (distributedLock.tryGetDistributedLock(jedis, LOCK_KEY, uniqueRequestId, LOCK_EXPIRE_TIME * 1000)) {
System.out.println(Thread.currentThread().getName() + ": 获取锁成功!");
// 执行临界区代码
try {
Thread.sleep(5000); // 模拟业务逻辑耗时
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 开始释放锁...");
distributedLock.releaseDistributedLock(jedis, LOCK_KEY, uniqueRequestId);
System.out.println(Thread.currentThread().getName() + ": 锁已释放!");
} else {
System.out.println(Thread.currentThread().getName() + ": 获取锁失败!");
}
} finally {
jedis.close();
}
}
}
```
#### 解析
- **`tryGetDistributedLock` 方法**
此方法尝试通过 `SETNX` 命令来创建一个锁。如果键不存在,则会设置键值对,并指定过期时间为防止死锁发生[^1]。
- **`releaseDistributedLock` 方法**
使用 Lua 脚本确保删除锁的操作具有原子性。只有当当前线程持有的锁与存储中的锁一致时才会删除锁[^2]。
- **`main` 方法**
主函数展示了如何调用上述两个方法以实现完整的加锁和解锁流程。它还模拟了一个简单的业务场景,在持有锁期间让线程休眠一段时间[^3]。
---
###
阅读全文
相关推荐




















