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(); } } }
以上がRedis と Java を使用して分散ロック機能を開発する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。