Java代码实现redis分布式锁
时间: 2023-04-07 15:00:46 浏览: 81
可以使用Redisson框架来实现Redis分布式锁,具体实现方式如下:
1. 引入Redisson依赖
```xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.14.0</version>
</dependency>
```
2. 创建Redisson客户端
```java
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
```
3. 获取锁
```java
RLock lock = redisson.getLock("myLock");
lock.lock();
try {
// 执行业务逻辑
} finally {
lock.unlock();
}
```
4. 释放锁
```java
lock.unlock();
```
以上就是Java代码实现Redis分布式锁的基本步骤。
相关问题
java代码实现redis分布式锁
好的,关于实现redis分布式锁的java代码,你可以参考以下代码:
```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;
public class RedisDistributedLock {
private JedisPool jedisPool;
// 锁定一个资源
public boolean lock(String resource, String requestId, int expireTime) {
try (Jedis jedis = jedisPool.getResource()) {
SetParams params = new SetParams().nx().ex(expireTime);
String result = jedis.set(resource, requestId, params);
return result != null && result.equalsIgnoreCase("OK");
}
}
// 释放一个资源
public void unlock(String resource, String requestId) {
try (Jedis jedis = jedisPool.getResource()) {
String value = jedis.get(resource);
if (value != null && value.equalsIgnoreCase(requestId)) {
jedis.del(resource);
}
}
}
}
```
需要注意的是,这个代码中的分布式锁是基于redis的set指令,利用了redis的原子性操作实现的。其中,nx表示只有在key不存在时才能set,ex表示key的过期时间。同时,为了保证线程安全,这里使用了JedisPool来获取Jedis实例。
java代码实现redis分布式锁,任务结束后才开锁
实现分布式锁的一种方式是使用Redis的SETNX命令。以下是Java代码实现Redis分布式锁的示例:
```java
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private static final String LOCK_KEY = "distributed_lock";
private static final int LOCK_EXPIRY_TIME = 30000; // 锁的过期时间:30秒
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean lock() {
long lockExpiryTime = System.currentTimeMillis() + LOCK_EXPIRY_TIME + 1;
String lockExpiryTimeStr = String.valueOf(lockExpiryTime);
// 尝试获取锁
if (jedis.setnx(LOCK_KEY, lockExpiryTimeStr) == 1) {
// 成功获取锁
return true;
}
// 检查锁是否过期
String currentLockExpiryTimeStr = jedis.get(LOCK_KEY);
if (currentLockExpiryTimeStr != null && Long.parseLong(currentLockExpiryTimeStr) < System.currentTimeMillis()) {
// 锁已过期,尝试获取锁
String oldLockExpiryTimeStr = jedis.getSet(LOCK_KEY, lockExpiryTimeStr);
if (oldLockExpiryTimeStr != null && oldLockExpiryTimeStr.equals(currentLockExpiryTimeStr)) {
// 成功获取锁
return true;
}
}
// 未获取到锁
return false;
}
public void unlock() {
jedis.del(LOCK_KEY);
}
}
```
使用分布式锁的代码示例:
```java
import redis.clients.jedis.Jedis;
public class MyTask {
private RedisDistributedLock lock;
private Jedis jedis;
public MyTask(Jedis jedis) {
this.jedis = jedis;
this.lock = new RedisDistributedLock(jedis);
}
public void run() {
boolean locked = lock.lock();
if (locked) {
try {
// 执行任务
} finally {
lock.unlock();
}
} else {
// 未获取到锁,任务不能执行
}
}
}
```
在使用分布式锁时,两个或多个线程/进程可能同时尝试获取锁。在代码示例中,只有一个线程/进程可以获取锁并运行任务。在任务完成后,使用unlock()方法释放锁。