>  기사  >  데이터 베이스  >  Redis가 분산 잠금을 구현하는 방법

Redis가 분산 잠금을 구현하는 방법

(*-*)浩
(*-*)浩원래의
2019-11-27 10:33:044159검색

Redis가 분산 잠금을 구현하는 방법

문제를 분산 잠금으로 해결해야 함

상호 배타성: 고객은 어느 곳에나 한 명만 있을 수 있습니다. time 클라이언트는 잠금을 소유하며 동시에 여러 클라이언트가 획득할 수 없습니다

보안: 잠금은 잠금을 보유한 사용자만 삭제할 수 있으며 다른 사용자는 삭제할 수 없습니다(권장 학습: # 🎜🎜#Redis 동영상 튜토리얼)

Deadlock: 잠금을 획득한 클라이언트가 어떤 이유로 다운되어 잠금을 해제하지 못했습니다. 이를 방지하기 위한 메커니즘 유사한 문제 발생

내결함성: 일부 노드가 다운되어도 클라이언트는 여전히 잠금을 획득하거나 잠금을 해제할 수 있습니다

Redis를 통한 분산 잠금 구현 방법:(완벽하지 않은 방법)

SETNX 키 값:키가 존재하지 않는 경우 값을 생성하고 할당합니다.

시간 복잡도: 0 (1)

반환 값: 설정에 성공하면 1이 반환되고, 설정에 실패하면 0이 반환됩니다.

그런데 이번에 획득한 키는 장기간 유효하므로 장기 유효성 문제를 어떻게 해결해야 할까요?

EXPIRE 키 초

키의 생존 시간을 설정합니다. 키가 만료되면(생존 시간은 0) 자동 삭제됩니다

단점: 원자성이 만족되지 않음

다음은 의사 코드입니다

//该程序存在危险,如果执行到第二行就崩溃了,则此时key会被一直占用而无法被释放
RedisService redisService = SpringUtils.getBean(Redi sService.class); 
long status = redisService.setnx(key, "1");
if(status == 1) {
	redisService.expire(key, expire);
	//执行独占资源逻辑
	doOcuppiedWork();
}

#🎜 🎜 #Redis를 통해 분산 잠금을 구현하는 방법: (올바른 방법)

SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX 초: 키의 만료 시간을 초 단위로 설정

PX 밀리초 : 키를 설정합니다. 만료 시간은 밀리초 밀리초입니다.

NX: 키가 존재하지 않는 경우에만 키가 설정됩니다.

XX: 키가 이미 있는 경우에만 키가 설정됩니다. 존재합니다. Set 연산

SET 연산이 성공적으로 완료되면 OK가 반환되고, 그렇지 않으면 nil이 반환됩니다. #

많은 수의 키 동시 만료에 대한 주의사항

#🎜 🎜#

집중 만료, 많은 수의 키를 삭제하는 데 시간이 많이 걸리므로 단기 지연이 발생합니다

#🎜 🎜#해방 계획: 키 만료 시간을 설정할 때 추가 각 키에 대한 임의의 값Redis 관련 기술 기사를 더 보려면

Redis 시작하기 튜토리얼

학습 컬럼을 방문하세요!

위 내용은 Redis가 분산 잠금을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.