Redis는 분산 잠금을 구현합니다
1. lockKey 영역을 기준으로 setnx(설정이 없으면 키 값이 비어 있으면 정상적으로 설정하고 1을 반환하고 그렇지 않으면 설정하지 않고 0을 반환) 작업을 수행합니다. 성공하면 잠금이 획득되었음을 나타냅니다. 그렇지 않으면 잠금이 획득되지 않았습니다.
2. 잠금을 얻지 못한 경우 Redis로 이동하여 키에 해당하는 값을 가져옵니다. 교착 상태 및 다른 클라이언트가 키를 차지하는 것을 방지하기 위해 키에 타임스탬프(밀리초 단위로 표시)를 저장합니다. 잠금이 특정 시간(5초)을 초과하면 클라이언트의 현재 타임스탬프가 사용되며 저장된 타임스탬프와 비교됩니다. (추천 학습: Redis 동영상 튜토리얼)
3. 키의 사용 시간 제한을 초과하지 않은 경우 false를 반환하여 다른 사람이 키를 점유하고 있으며 시간 제한이 초과되면 강제로 사용할 수 없음을 나타냅니다. 초과되면 이 필드의 값 대신 타임스탬프를 사용하여 잠금을 해제할 수 있습니다.
4. 하지만 setnx가 실패한 후 값을 가져오지만 필드를 가져올 수 없다면 이는 작업 전에 잠금이 해제되었음을 의미합니다. 이때 가장 좋은 방법은 값을 가져오는 것입니다. .자물쇠.
잠금 해제: redis에서 키 삭제
Zookeeper는 분산 잠금을 구현합니다
임시 순차 노드 기반:
1 클라이언트는 create() 메서드를 호출하여 "locknode/guid-lock"이라는 노드를 생성합니다. -", 이 노드의 생성 유형을 EPHEMERAL_SEQUENTIAL로 설정해야 한다는 점에 유의해야 합니다.
2. 클라이언트는 생성된 모든 하위 노드를 얻기 위해 getChildren("locknode") 메서드를 호출합니다.
3. 클라이언트가 모든 하위 노드의 경로를 얻은 후 1단계에서 생성한 노드가 모든 노드 중에서 가장 작은 시퀀스 번호를 가지고 있는 것으로 확인되면 클라이언트가 잠금을 얻은 것으로 간주됩니다.
4. 생성된 노드가 전체 노드 중 가장 작은 시퀀스 번호를 갖지 않는 경우, 생성한 노드보다 작은 시퀀스 번호를 갖는 가장 큰 노드를 모니터링하고 대기에 들어갑니다. 다음에 모니터링되는 자식 노드가 변경될 때까지 자식 노드를 다시 획득하여 잠금 획득 여부를 결정합니다.
잠금을 해제하는 과정은 비교적 간단합니다. 생성한 하위 노드를 삭제하면 됩니다.
차이점:
redis 분산 잠금은 사실 지속적으로 잠금을 획득하려고 시도해야 하며, 이로 인해 성능이 소모됩니다
zk 분산 잠금, 잠금을 획득할 수 없는 경우 리스너만 등록하면 됩니다. 아니요 지속적으로 적극적으로 잠금을 획득하려고 시도하면 성능 오버헤드가 줄어듭니다
또 다른 요점은 Redis가 잠금을 획득하는 클라이언트에 버그가 있거나 전화가 끊기는 경우 제한 시간 이후에 zk에서만 잠금을 해제할 수 있다는 것입니다. , 생성된 임시 znode이기 때문에 클라이언트가 전화를 끊으면 znode가 자동으로 해제됩니다.
Redis 관련 기술 기사를 더 보려면 소개를 방문하세요. Redis 데이터베이스 사용 튜토리얼 칼럼을 통해 배워보세요!
위 내용은 zk와 redis 분산 잠금의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!