在Java中實現Redis分布式鎖可以使用Redis的SETNX命令來實現。以下是一個簡單的示例代碼:
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private final Jedis jedis;
private final String lockKey;
private final long expireTime;
public RedisDistributedLock(Jedis jedis, String lockKey, long expireTime) {
this.jedis = jedis;
this.lockKey = lockKey;
this.expireTime = expireTime;
}
public boolean tryLock() {
String result = jedis.set(lockKey, "", "NX", "EX", expireTime);
return "OK".equals(result);
}
public void unlock() {
jedis.del(lockKey);
}
}
上述代碼中,RedisDistributedLock
類在構造函數中接收一個Jedis實例、鎖的鍵名和過期時間。tryLock
方法會使用Redis的SETNX命令來嘗試獲取鎖,如果返回結果為"OK",表示獲取鎖成功;否則表示獲取鎖失敗。unlock
方法會釋放鎖,即刪除對應的鍵。
使用示例:
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, "mylock", 10);
if (lock.tryLock()) {
try {
// 獲取到鎖之后的業務邏輯
System.out.println("獲取到鎖");
} finally {
lock.unlock();
}
} else {
// 未獲取到鎖的處理邏輯
System.out.println("未獲取到鎖");
}
jedis.close();
}
}
在上述示例中,首先創建一個Jedis實例,然后創建一個RedisDistributedLock
對象,指定鎖的鍵名為"mylock",過期時間為10秒。然后調用tryLock
方法嘗試獲取鎖,如果獲取成功,則執行獲取到鎖后的業務邏輯,最后釋放鎖。如果獲取鎖失敗,則執行未獲取到鎖的處理邏輯。
需要注意的是,當鎖的過期時間設置得較長時,可能會出現死鎖的情況。為了避免死鎖,可以在業務邏輯中增加一個超時機制,當超過一定時間仍未完成業務邏輯時,可以主動釋放鎖。