如何使用Redis和Java開發分散式鎖定功能
import redis.clients.jedis.Jedis; public class DistributedLock { private static final String LOCK_KEY = "distributed_lock"; private static final int LOCK_TIMEOUT = 3 * 1000; // 锁的超时时间,单位为毫秒 private Jedis jedis; public DistributedLock(Jedis jedis) { this.jedis = jedis; } public boolean lock() { long start = System.currentTimeMillis(); try { while (true) { String result = jedis.set(LOCK_KEY, "locked", "NX", "PX", LOCK_TIMEOUT); if ("OK".equals(result)) { return true; } else { // 进行重试 Thread.sleep(100); } long end = System.currentTimeMillis(); if (end - start > LOCK_TIMEOUT) { // 超时退出 return false; } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); return false; } } public void unlock() { jedis.del(LOCK_KEY); } }
LOCK_KEY
作為分散式鎖的鍵,這個鍵在所有節點中必須保持唯一。另外,設定了一個LOCK_TIMEOUT
常數來表示鎖的逾時時間。 在lock
方法中,先取得目前時間作為開始時間,然後使用無限迴圈來嘗試取得分散式鎖定。在循環中,使用Redis的set
命令進行設定操作,設定鍵為LOCK_KEY
,值為"locked",並且設定了NX
和 PX
選項,NX
表示只有鍵不存在時才執行設定操作,PX
表示設定鍵的過期時間為LOCK_TIMEOUT
毫秒。
如果設定成功,則表示取得鎖定成功,方法傳回true
;否則繼續重試,每次重試時會等待100毫秒。同時,也需要判斷取得鎖的時間是否超過了LOCK_TIMEOUT
的值,如果超過則表示取得鎖的等待時間已經過長,放棄取得鎖,並傳回false
。
在unlock
方法中,透過呼叫del
指令刪除分散式鎖定的鍵。
import redis.clients.jedis.Jedis; public class LockTest { public static void main(String[] args) { Jedis jedis = new Jedis("localhost"); DistributedLock lock = new DistributedLock(jedis); try { if (lock.lock()) { // 获取到分布式锁后执行需要保护的代码 System.out.println("获取到分布式锁"); // ... 执行需要保护的代码 } else { System.out.println("获取分布式锁失败"); } } finally { lock.unlock(); } } }
在呼叫範例中,首先建立了一個Jedis連接對象,然後建立了一個DistributedLock對象,並傳入Jedis連接對像作為參數。在try-finally區塊中,先嘗試取得分散式鎖,如果成功則輸出"取得到分散式鎖",並執行需要保護的程式碼,然後在finally區塊中釋放分散式鎖定。
以上是如何使用Redis和Java開發分散式鎖定功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!