redis 문서에서 SETNX를 통해 기본 잠금을 구현할 수 있음을 발견했습니다.
http://redis.io/commands/setnx
C4는 잠금을 획득하기 위해 SETNX lock.foo를 보냅니다.
크래시 된 클라이언트 C3는 여전히 그것을 보유하고 있으므로 Redis는 C4에 0으로 응답합니다.
C4는 잠금이 만료되었는지 확인하기 위해 GET lock.foo를 보냅니다. 그렇지 않은 경우 잠시 휴면 상태가되고 처음부터 다시 시도합니다.
대신 lock.foo의 Unix 시간이 현재 Unix 시간보다 오래되어 잠금이 만료되면 C4는 다음을 수행하려고합니다.
GETSET lock.foo
GETSET 시맨틱 때문에 C4는 키에 저장된 이전 값이 여전히 만료 된 타임 스탬프인지 확인할 수 있습니다. 그렇다면 잠금을 획득 한 것입니다.
다른 클라이언트 (예 : C5)가 C4보다 빠르고 GETSET 작업으로 잠금을 획득 한 경우 C4 GETSET 작업은 만료되지 않은 타임 스탬프를 반환합니다. C4는 첫 번째 단계부터 다시 시작됩니다. C4가 앞으로 몇 초 동안 키를 설정하더라도 이것은 문제가되지 않습니다.
그러나 일부 사용자가 언급했듯이 UNIX 타임 스탬프를 만료로 사용하려면 클라이언트와 서버의 시간이 완벽하게 동기화되어야합니다. Redis에서 전역 / 분산 잠금을 만드는 더 나은 대안이 있습니까?
사용 SET
대신에 SETNX
. SET
UNIX 타임 스탬프 값 대신 초 및 밀리 초 단위의 만료 시간 인수를 허용합니다.
이전 SETNX 기반 패턴은 역사적인 이유로 만 문서화되었습니다.
에서 SETNX
설명 :
참고 : Redis 2.6.12부터는 SET 명령을 사용하여 잠금을 획득하고 간단한 Lua 스크립트를 사용하여 잠금을 해제하는 훨씬 더 간단한 잠금 기본 요소를 만들 수 있습니다. 패턴은 SET 명령 페이지에 설명되어 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다