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_KEY
作为分布式锁的键,这个键在所有节点中必须保持唯一。另外,设置了一个LOCK_TIMEOUT
常量来表示锁的超时时间。在lock
方法中,首先获取当前时间作为开始时间,然后使用一个无限循环来尝试获取分布式锁。在循环中,使用Redis的set
命令进行设置操作,设置键为LOCK_KEY
,值为"locked",并且设置了NX
和PX
选项,NX
表示只有键不存在时才执行设置操作,PX
表示设置键的过期时间为LOCK_TIMEOUT
毫秒。
如果设置成功,则表示获取锁成功,方法返回true
;否则继续进行重试,每次重试时会等待100毫秒。同时,还需要判断获取锁的时间是否超过了LOCK_TIMEOUT
的值,如果超过则表示获取锁的等待时间已经过长,放弃获取锁,并返回false
。
在unlock
方法中,通过调用del
lock
메서드에서는 먼저 현재 시간을 시작 시간으로 가져온 다음 무한 루프를 사용하여 분산 잠금을 획득하려고 시도합니다. 루프에서 Redis의 set
명령을 사용하여 설정 작업을 수행합니다. 설정 키는 LOCK_KEY
이고 값은 "잠김"이며 NX
입니다. PX
옵션, NX
는 키가 존재하지 않을 때만 설정 작업이 수행됨을 의미하고, PX
는 세트의 만료 시간을 의미합니다. 키는 LOCK_TIMEOUT</ code>밀리초입니다. <li><br>설정이 성공하면 잠금이 성공적으로 획득되었음을 의미하며 메서드는 <code>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 중국어 웹사이트의 기타 관련 기사를 참조하세요!