Redis 분산 잠금의 구현 원리는 무엇입니까

醉折花枝作酒筹
풀어 주다: 2021-06-23 11:57:19
원래의
3374명이 탐색했습니다.

redis에서 setnx(key, value) 명령을 사용하면 키가 없으면 추가되고, 있으면 아무 작업도 수행되지 않습니다. 여러 클라이언트가 동시에 setnx 명령을 보내는 경우 하나의 클라이언트만 성공하고 1(true)을 반환할 수 있으며 다른 클라이언트는 0(false)을 반환합니다.

Redis 분산 잠금의 구현 원리는 무엇입니까

이 튜토리얼의 운영 환경: Windows 7 시스템, Redis 버전 5.0.10, DELL G3 컴퓨터.

분산 잠금 구현

비즈니스 개발의 요구에 따라 원래의 단일 머신 배포 시스템은 분산 클러스터 시스템으로 발전했습니다. 분산 시스템은 다중 스레드, 다중 프로세스 및 다양한 머신에 분산되어 있기 때문입니다. make 원래 독립형 배포 상황의 동시성 제어 잠금 전략은 유효하지 않으며 단순 Java API는 분산 잠금 기능을 제공할 수 없습니다. 이 문제를 해결하려면 공유 리소스에 대한 액세스를 제어하기 위한 교차 JVM 상호 배제 메커니즘이 필요합니다. 이것이 바로 분산 잠금이 해결해야 하는 문제입니다.

분산 잠금을 위한 주요 구현 솔루션:

  • 데이터베이스 기반 분산 잠금 구현

  • 캐시 기반(Redis 등)

  • Zookeeper 기반

여기서 우리는 분산 잠금 기반을 구현합니다. 레디스에서 .

기본 구현

redis에서 setnx(key, value) 명령을 사용하면 키가 없으면 추가되고, 있으면 아무 작업도 수행되지 않습니다. 여러 클라이언트가 동시에 setnx 명령을 보내는 경우 하나의 클라이언트만 성공하고 1(true)을 반환할 수 있으며 다른 클라이언트는 0(false)을 반환합니다.

Redis 분산 잠금의 구현 원리는 무엇입니까

주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!