Lock 해제 문의 드립니다.
2
작성한 질문수 11
Lock 해제 코드에서
다른 사용자가 생성한 락을 삭제하지 않기 위해 본인의 identifier이랑 락의 value를 비교해서 삭제하는 로직 부분에서 궁금한 내용이 있습니다.
멀티스레드, 프로세스 환경에서 충분히 일어날 일 이라고 하셨는데
내가 락을 얻으면 다른 사용자는 락을 얻지 못해 value는 항상 나의 identifier이 들어있어야 하는게 아닌가? 라는 생각이 드는데
rd.set(lock_name, identifier, nx=True, px=lock_timeout_ms)이 코드 방식으로 락을 만들면 여러 사용자가 특정 환경에 락을 얻을 수 있는건가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. index님.
Redis를 이용한 분산 락 해제와 관련하여 중요한 질문을 주셨습니다. 분산 환경에서의 락 처리에 대한 이해는 복잡할 수 있지만, 올바르게 이해하는 것이 시스템 안정성에 매우 중요합니다.
분산 락에서의 문제 상황
Redis에서 SET 명령어를 사용하여 락을 설정할 때, NX 옵션을 통해 락이 이미 존재하지 않을 경우에만 락을 설정하라는 뜻입니다. 이 과정에서 px 옵션은 락의 만료 시간을 지정하는 데 사용됩니다.
문제의 핵심
멀티스레드/프로세스 환경 또는 네트워크 지연 상황에서, 락을 설정하고 일정 시간이 지난 후, 락이 만료되어 삭제될 수 있습니다. 이 경우, 다른 프로세스가 그 락을 다시 획득할 수 있게 됩니다. 이런 상황에서는 락 해제 시 주의가 필요합니다:
Race Condition: 프로세스 A가 락을 점유하고 작업을 처리하는 중 만료 시간이 지나면 락이 해제됩니다. 락이 해제된 직후, 프로세스 B가 해당 락을 획득하게 될 수 있습니다.
Identifier 검증: 락을 해제할 때, 락의
value를 확인하는 이유는 바로 이 때문입니다. 프로세스 B가 다시 락을 획득한 후, 프로세스 A가 기존의 락을 해제하려 할 때(아직 작업이 끝나지 않았다면), B의 identifier와 일치하지 않기 때문에 올바르게 동작할 수 있습니다.
안전한 락 해제
락을 해제하는 코드에서는 반드시 다음 단계를 따라야 합니다:
- 락의
value가 자신이 설정한identifier인지 확인
- 일치할 경우에만 락 해제
이러한 방법은 락의 원자성을 보장하고 다른 프로세스의 데이터 안정성을 확보하는데 도움을 줍니다.
추가 자료
다른 분산 락 구현 및 잠금 관리에 대한 더 깊은 이해를 원하신다면, 다음 자료를 참고해 보시면 도움이 될 것입니다:
- Redis 교습서에서는 Redis 기반의 다양한 동작 원리 및 예제를 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답을언제쯤받아볼수있나요
0
7
2
프로젝트가 없어요..
0
26
2
강의 일정 및 수업 자료 공유 관련 문의드립니다!
0
17
1
레디스로 대기큐 구현 질문
0
52
2
API LIMIT
0
40
1
캐시 무효화
0
32
2
Redis와 Kafca의 Pub/Sub 차이
0
41
2
27강 슬랙 테스트 부분도 누락된 것 같네요
1
47
2
22강 케글 연동 강의내용 누락된듯해요
1
47
2
한국투자증권 미국 주식 매매 수수료와 환전 수수료가 높은 경우 자동매매 베개투자법을 적용해도 괜찮을까요?
0
59
2
스크립트를 한번에 복사하고 싶습니다.
0
35
2
@Version 어노테이션이 붙은 필드는 낙관적 락이든 비관적 락이든 업데이트가 됩니다.
0
40
1
너무 흥미진진합니다..
1
47
2
SP를 아직도 사용하나요?
0
51
2
캐시전략 - Write-behind
0
46
2
모델 서빙과 관련된 강좌 출시 예정된 바가 있으신지 여쭤봅니다!
0
48
2
순위가 동률일 때의 처리에 대해 질문드립니다.
0
63
2
Redlock 알고리즘 관해 궁금한게 있습니다!
0
82
2
좋아요/조회수 카운팅 병목현상에 대해서 궁금한점이 있습니다.
0
58
2
백엔드 서버 코드 변경에서 프론트엔드 서버가 값을 파싱하지 못하는 문제
0
104
1
강사님 GETDEL 관련해서 질문 있습니다
0
117
2
비밀번호를 걸고 실행된 레디스 서버에 lua 스크립트를 등록하는 경우
0
99
2
보안 설정을 한 수강생들은 Connection Settings에 비밀번호를 넣어야 추가되네요
0
77
2
Redis Container 해킹
0
130
1





