문제를 분산 잠금으로 해결해야 함
상호 배타성: 고객은 어느 곳에나 한 명만 있을 수 있습니다. 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(); }
SET key value [EX seconds] [PX milliseconds] [NX|XX]
PX 밀리초 : 키를 설정합니다. 만료 시간은 밀리초 밀리초입니다.
NX: 키가 존재하지 않는 경우에만 키가 설정됩니다.
XX: 키가 이미 있는 경우에만 키가 설정됩니다. 존재합니다. Set 연산
SET 연산이 성공적으로 완료되면 OK가 반환되고, 그렇지 않으면 nil이 반환됩니다. #
많은 수의 키 동시 만료에 대한 주의사항#🎜 🎜#
집중 만료, 많은 수의 키를 삭제하는 데 시간이 많이 걸리므로 단기 지연이 발생합니다#🎜 🎜#해방 계획: 키 만료 시간을 설정할 때 추가 각 키에 대한 임의의 값Redis 관련 기술 기사를 더 보려면
Redis 시작하기 튜토리얼학습 컬럼을 방문하세요!
위 내용은 Redis가 분산 잠금을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!