redis에서 setnx(key, value) 명령을 사용하면 키가 없으면 추가되고, 있으면 아무 작업도 수행되지 않습니다. 여러 클라이언트가 동시에 setnx 명령을 보내는 경우 하나의 클라이언트만 성공하고 1(true)을 반환할 수 있으며 다른 클라이언트는 0(false)을 반환합니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, Redis 버전 5.0.10, DELL G3 컴퓨터.
분산 잠금 구현
비즈니스 개발의 요구에 따라 원래의 단일 머신 배포 시스템은 분산 클러스터 시스템으로 발전했습니다. 분산 시스템은 다중 스레드, 다중 프로세스 및 다양한 머신에 분산되어 있기 때문입니다. make 원래 독립형 배포 상황의 동시성 제어 잠금 전략은 유효하지 않으며 단순 Java API는 분산 잠금 기능을 제공할 수 없습니다. 이 문제를 해결하려면 공유 리소스에 대한 액세스를 제어하기 위한 교차 JVM 상호 배제 메커니즘이 필요합니다. 이것이 바로 분산 잠금이 해결해야 하는 문제입니다.
분산 잠금을 위한 주요 구현 솔루션:
데이터베이스 기반 분산 잠금 구현
캐시 기반(Redis 등)
Zookeeper 기반
여기서 우리는 분산 잠금 기반을 구현합니다. 레디스에서 .
기본 구현
redis에서 setnx(key, value) 명령을 사용하면 키가 없으면 추가되고, 있으면 아무 작업도 수행되지 않습니다. 여러 클라이언트가 동시에 setnx 명령을 보내는 경우 하나의 클라이언트만 성공하고 1(true)을 반환할 수 있으며 다른 클라이언트는 0(false)을 반환합니다.
주로 Redis Setnx 명령어를 사용합니다
지정된 키가 존재하지 않을 경우 해당 키에 지정된 값을 설정합니다
설정에 성공하면 1이 반환됩니다. 설정이 실패하고 0
redis> EXISTS job # job 不存在 (integer) 0 redis> SETNX job "programmer" # job 设置成功 (integer) 1 redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败 (integer) 0 redis> GET job # 没有被覆盖 "programmer"
java code
public void testLock() { // 执行redis的setnx命令 String uuid = UUID.randomUUID().toString(); Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 5, TimeUnit.SECONDS); // 判断是否拿到锁 if (lock) { // 执行业务逻辑代码 // ... // 释放锁资源 (保证获取值和删除操作的原子性) LUA脚本保证删除的原子性 String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; this.redisTemplate.execute(new DefaultRedisScript<>(script), Arrays.asList("lock"), Arrays.asList(uuid)); // if (StrUtil.equals(uuid,redisTemplate.opsForValue().get("lock"))){ // redisTemplate.delete("lock"); // } } else { // 其他请求尝试获取锁 testLock(); } }
가 반환됩니다. 분산 잠금을 사용할 수 있도록 하려면 최소한 잠금 구현이 다음 네 가지 조건을 동시에 충족하는지 확인해야 합니다.
상호 배타성. 언제든지 하나의 클라이언트만 잠금을 보유할 수 있습니다.
교착상태가 발생하지 않습니다. 클라이언트가 잠금을 적극적으로 잠금 해제하지 않고 잠금을 유지하는 동안 충돌이 발생하더라도 다른 클라이언트가 이후에 잠금을 잠글 수 있다는 것이 보장됩니다.
종을 풀려면 종을 묶어야 합니다. 잠금 및 잠금 해제는 동일한 클라이언트에 의해 수행되어야 합니다. 클라이언트 자체는 다른 사람이 추가한 잠금을 잠금 해제할 수 없습니다.
관련 튜토리얼 권장 사항: Redis 튜토리얼
위 내용은 Redis 분산 잠금의 구현 원리는 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!