Lock 해제 문의 드립니다.
4
11 câu hỏi đã được viết
Lock 해제 코드에서
다른 사용자가 생성한 락을 삭제하지 않기 위해 본인의 identifier이랑 락의 value를 비교해서 삭제하는 로직 부분에서 궁금한 내용이 있습니다.
멀티스레드, 프로세스 환경에서 충분히 일어날 일 이라고 하셨는데
내가 락을 얻으면 다른 사용자는 락을 얻지 못해 value는 항상 나의 identifier이 들어있어야 하는게 아닌가? 라는 생각이 드는데
rd.set(lock_name, identifier, nx=True, px=lock_timeout_ms)이 코드 방식으로 락을 만들면 여러 사용자가 특정 환경에 락을 얻을 수 있는건가요?
Câu trả lời 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
53
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

