请在java代码中实现 redis 分布式锁
时间: 2023-10-11 08:08:39 浏览: 119
以下是Java代码实现Redis分布式锁的示例:
```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
public class RedisDistributedLock {
private static final String LOCK_KEY = "lock_key";
private static final int LOCK_EXPIRE_TIME = 5000; // 锁的过期时间,单位毫秒
private Jedis jedis;
public RedisDistributedLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean tryLock() {
SetParams setParams = new SetParams().nx().px(LOCK_EXPIRE_TIME);
String result = jedis.set(LOCK_KEY, "1", setParams);
return "OK".equals(result);
}
public void unlock() {
jedis.del(LOCK_KEY);
}
}
```
在上面的代码中,我们定义了一个`RedisDistributedLock`类,它包含两个方法:`tryLock()`和`unlock()`。
`tryLock()`方法尝试获取分布式锁,它会向Redis服务器发送一个`SET`命令,如果返回结果为`OK`,则获取锁成功,否则获取锁失败。
`unlock()`方法用于释放锁,它会向Redis服务器发送一个`DEL`命令,将锁的key删除。
需要注意的是,在`tryLock()`方法中,我们使用了`SetParams`来设置锁的过期时间和`NX`参数。`NX`参数表示只有当key不存在时才能设置成功,这样可以避免多个进程同时获取锁。`PX`参数表示锁的过期时间,如果锁在过期时间内没有被释放,Redis服务器会自动将锁释放。
使用示例:
```java
import redis.clients.jedis.Jedis;
public class Main {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
RedisDistributedLock lock = new RedisDistributedLock(jedis);
if (lock.tryLock()) {
try {
// 执行临界区代码
} finally {
lock.unlock();
}
} else {
// 获取锁失败,处理逻辑
}
}
}
```
在上面的示例中,我们先创建了一个`Jedis`实例,然后创建了一个`RedisDistributedLock`实例。在获取锁时,我们调用`tryLock()`方法,如果返回值为true,则表示获取锁成功,可以执行临界区代码。在临界区代码执行完毕后,需要调用`unlock()`方法来释放锁。如果获取锁失败,则需要处理获取锁失败的逻辑。
阅读全文