java中使用redis加锁
时间: 2023-10-24 19:11:49 浏览: 90
在Java中使用Redis实现分布式锁的一般步骤如下:
1. 首先,连接Redis服务器,获取JedisClient对象。
2. 使用setnx操作,尝试获取锁。setnx是Redis的一个原子操作,如果key存在则返回0,否则返回1。我们可以把key设置为锁的名称,value设置为当前时间加上一个超时时间(避免出现死锁),并设置过期时间。
3. 如果setnx返回1,说明获取锁成功,可以执行业务逻辑。如果返回0,说明锁已经被其他线程持有,需要等待一段时间再次尝试获取锁。
4. 执行完业务逻辑后,使用del操作释放锁。在释放锁之前,需要先判断锁是否已经过期,如果锁已经过期,则不能再释放锁,因为此时有可能锁已经被其他线程持有。
下面是一个简单的Redis分布式锁的示例代码:
```java
public class RedisLock {
private static final String LOCK_PREFIX = "lock:";
private static final int LOCK_EXPIRE_TIME = 300; // 锁的过期时间,单位为秒
private Jedis jedis;
private String lockName;
public RedisLock(Jedis jedis, String lockName) {
this.jedis = jedis;
this.lockName = LOCK_PREFIX + lockName;
}
public boolean tryLock() {
String value = System.currentTimeMillis() + LOCK_EXPIRE_TIME + "";
long result = jedis.setnx(lockName, value);
if (result == 1) {
jedis.expire(lockName, LOCK_EXPIRE_TIME);
return true;
}
return false;
}
public void unlock() {
String value = jedis.get(lockName);
if (value != null && System.currentTimeMillis() < Long.parseLong(value)) {
jedis.del(lockName);
}
}
}
```
使用示例:
```java
Jedis jedis = new Jedis("localhost", 6379);
RedisLock lock = new RedisLock(jedis, "mylock");
if (lock.tryLock()) {
try {
// 执行业务逻辑
} finally {
lock.unlock();
}
}
```
阅读全文