java使用redis上锁
时间: 2023-06-29 21:02:23 浏览: 106
java操作redis
在Java中使用Redis进行分布式锁是一种常见的方式,可以避免多个进程或线程同时修改同一个资源的问题。下面是一个简单的Java代码示例:
```java
import redis.clients.jedis.Jedis;
public class RedisLock {
private static final String LOCK_KEY = "lock_key";
private static final int LOCK_EXPIRE_TIME = 10000; // 锁的过期时间,单位毫秒
private Jedis jedis;
public RedisLock(Jedis jedis) {
this.jedis = jedis;
}
public boolean lock() {
long now = System.currentTimeMillis();
long expireTime = now + LOCK_EXPIRE_TIME + 1;
String expireStr = String.valueOf(expireTime);
// 尝试获取锁
if (jedis.setnx(LOCK_KEY, expireStr) == 1) {
// 获取锁成功
return true;
}
// 获取锁失败,检查锁是否已经过期
String currentValueStr = jedis.get(LOCK_KEY);
if (currentValueStr != null && Long.parseLong(currentValueStr) < now) {
// 锁已经过期,尝试获取锁
String oldValueStr = jedis.getSet(LOCK_KEY, expireStr);
if (oldValueStr != null && oldValueStr.equals(currentValueStr)) {
// 获取锁成功
return true;
}
}
// 获取锁失败
return false;
}
public void unlock() {
jedis.del(LOCK_KEY);
}
}
```
在上述代码中,我们定义了一个`RedisLock`类,它包含了`lock()`方法和`unlock()`方法。在`lock()`方法中,我们首先获取当前时间戳,并计算出锁的过期时间。然后,我们使用`setnx()`命令尝试获取锁,如果返回值为1,则表示获取锁成功;否则,我们检查锁是否已经过期,如果过期则使用`getSet()`命令尝试获取锁,如果返回的旧值等于当前值,则表示获取锁成功。
在使用完锁之后,我们需要调用`unlock()`方法释放锁,这里我们使用`del()`命令删除锁的键。
阅读全文