请用java代码实现分布式锁
时间: 2023-06-29 20:04:19 浏览: 90
分布式锁是为了解决分布式环境下多个应用程序之间的资源竞争问题,Java中可以使用Redis来实现分布式锁。
下面是一个简单的Java代码示例,使用Redis实现分布式锁:
```java
public class RedisDistributedLock {
private static final Logger logger = LoggerFactory.getLogger(RedisDistributedLock.class);
private JedisPool jedisPool;
public RedisDistributedLock(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
/**
* 加锁方法,如果key已经存在,则说明已经被锁定,返回false,否则返回true
*
* @param key 锁的key
* @param uuid 锁的id
* @param time 锁过期时间,单位秒
* @return true表示加锁成功,false表示加锁失败
*/
public boolean lock(String key, String uuid, int time) {
try (Jedis jedis = jedisPool.getResource()) {
String result = jedis.set(key, uuid, "NX", "EX", time);
return "OK".equals(result);
} catch (Exception e) {
logger.error("redis lock error", e);
}
return false;
}
/**
* 解锁方法,如果uuid和redis中存储的值相同,则说明是同一个锁,删除key
*
* @param key 锁的key
* @param uuid 锁的id
* @return true表示解锁成功,false表示解锁失败
*/
public boolean unlock(String key, String uuid) {
try (Jedis jedis = jedisPool.getResource()) {
String value = jedis.get(key);
if (value != null && value.equals(uuid)) {
jedis.del(key);
return true;
}
} catch (Exception e) {
logger.error("redis unlock error", e);
}
return false;
}
}
```
这里使用JedisPool来获取Jedis实例来操作Redis,`lock`方法加锁,使用Redis的setnx方法,如果key不存在,则设置成功,否则设置失败。`unlock`方法解锁,使用Redis的get方法获取锁的id,如果id和传入的一致,则说明是同一个锁,可以删除key,释放锁。
需要注意的是,分布式锁的实现需要考虑很多因素,比如锁的超时时间、锁的重入、锁的死锁等问题,以上代码只是简单的实现示例,生产环境中需要根据具体情况进行调整和优化。
阅读全文