java redis lua 加锁
时间: 2023-08-09 20:05:50 浏览: 102
在Java中使用Redis和Lua脚本实现分布式锁可以确保在多个线程或多个应用程序之间同步对共享资源的访问。下面是一个示例代码:
```java
import redis.clients.jedis.Jedis;
public class RedisLock {
private static final String LOCK_KEY = "my_lock";
private static final int LOCK_EXPIRE_TIME = 10000; // 锁的过期时间,单位毫秒
private static final int ACQUIRE_TIMEOUT = 1000; // 获取锁的超时时间,单位毫秒
private Jedis jedis;
public RedisLock() {
jedis = new Jedis("localhost", 6379);
}
public boolean acquireLock() {
long start = System.currentTimeMillis();
try {
while (true) {
String result = jedis.set(LOCK_KEY, "locked", "NX", "PX", LOCK_EXPIRE_TIME);
if ("OK".equals(result)) {
return true; // 获取锁成功
}
if (System.currentTimeMillis() - start > ACQUIRE_TIMEOUT) {
return false; // 获取锁超时
}
Thread.sleep(100); // 等待重试
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return false;
}
}
public void releaseLock() {
jedis.del(LOCK_KEY);
}
}
```
在上面的示例中,我们使用了Redis的`SET`命令来尝试获取锁。通过设置`NX`参数,可以确保只有当键不存在时才会设置成功,因此只有一个线程或应用程序能够成功获取到锁。我们还使用了`PX`参数来设置锁的过期时间,以防止死锁的情况。
如果获取锁失败或超时,可以根据实际情况进行处理,例如等待一段时间后重试或放弃获取锁。
在实际使用中,还可以结合Lua脚本来实现更复杂的锁逻辑,以满足特定的业务需求。
阅读全文