inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2026년! 백엔드 개발자를 위한 Redis 실전 가이드: 기초부터 실무 패턴까지

패턴 06: 분산 락(Distributed Lock) - 동시성 문제 해결

Lock 해제 문의 드립니다.

해결된 질문

30

index

작성한 질문수 11

0

Lock 해제 코드에서

다른 사용자가 생성한 락을 삭제하지 않기 위해 본인의 identifier이랑 락의 value를 비교해서 삭제하는 로직 부분에서 궁금한 내용이 있습니다.

 

멀티스레드, 프로세스 환경에서 충분히 일어날 일 이라고 하셨는데

 

내가 락을 얻으면 다른 사용자는 락을 얻지 못해 value는 항상 나의 identifier이 들어있어야 하는게 아닌가? 라는 생각이 드는데

 

rd.set(lock_name, identifier, nx=True, px=lock_timeout_ms)

이 코드 방식으로 락을 만들면 여러 사용자가 특정 환경에 락을 얻을 수 있는건가요?

아키텍처 redis FastAPI

답변 2

1

코딩하는기술사

안녕하세요. 😊

release_lock의 identifier 비교 로직은 "임계영역에 대한 작업 소요 시간이 락의 TTL을 초과했을 때" 를 전제로 한 방어 코드입니다.

락을 먼저 잡은 A가 임계영역에 대한 작업이 예상보다 길어져 락의 TTL이 먼저 만료되어 버리면, 락이 자동 삭제되고 다른 요청 B가 새로 락을 획득할 수 있습니다. 이 시점에 A가 작업을 끝내고 아무 검증 없이 DEL을 호출하면 B의 락을 지워버리는 문제가 생깁니다. 그래서 identifier를 비교한 뒤 삭제하면 이를 막을 수 있습니다.

또한 GET → DEL 사이에 TTL이 만료되고 다른 요청이 락을 가져가는 상황이 끼어들 수 있기 때문에, Lua 스크립트로 원자적으로 묶을 것을 권장드린 것이고요.

참고로 강의의 샘플 코드에서는 작업 시간(sleep(2))이 락의 TTL(5초)보다 짧아서 이와 같은 상황이 발생하지는 않겠지만, 실무에서는 DB 응답 지연, 서버 부하 등으로 작업 시간이 예상을 초과하는 일이 발생할 수 있습니다. 그래서 TTL을 작업 예상 시간보다 충분히 크게 설정하는 것이 중요합니다.

그리고 이 코드는 분산락의 기본 원리 이해 직접 구현한 샘플이고요
실제 실무에서는 Lua 원자성, 다중 노드 지원(Redlock) 등을 고려해 Redisson(Java), redlock-py(Python) 같은 검증된 라이브러리 도입을 검토하시길 권장합니다.

좋은 질문 감사합니다. 👍

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. index님.

Redis를 이용한 분산 락 해제와 관련하여 중요한 질문을 주셨습니다. 분산 환경에서의 락 처리에 대한 이해는 복잡할 수 있지만, 올바르게 이해하는 것이 시스템 안정성에 매우 중요합니다.

분산 락에서의 문제 상황

Redis에서 SET 명령어를 사용하여 락을 설정할 때, NX 옵션을 통해 락이 이미 존재하지 않을 경우에만 락을 설정하라는 뜻입니다. 이 과정에서 px 옵션은 락의 만료 시간을 지정하는 데 사용됩니다.

문제의 핵심

멀티스레드/프로세스 환경 또는 네트워크 지연 상황에서, 락을 설정하고 일정 시간이 지난 후, 락이 만료되어 삭제될 수 있습니다. 이 경우, 다른 프로세스가 그 락을 다시 획득할 수 있게 됩니다. 이런 상황에서는 락 해제 시 주의가 필요합니다:

  1. Race Condition: 프로세스 A가 락을 점유하고 작업을 처리하는 중 만료 시간이 지나면 락이 해제됩니다. 락이 해제된 직후, 프로세스 B가 해당 락을 획득하게 될 수 있습니다.

  2. Identifier 검증: 락을 해제할 때, 락의 value를 확인하는 이유는 바로 이 때문입니다. 프로세스 B가 다시 락을 획득한 후, 프로세스 A가 기존의 락을 해제하려 할 때(아직 작업이 끝나지 않았다면), B의 identifier와 일치하지 않기 때문에 올바르게 동작할 수 있습니다.

안전한 락 해제

락을 해제하는 코드에서는 반드시 다음 단계를 따라야 합니다:

  • 락의 value가 자신이 설정한 identifier인지 확인
  • 일치할 경우에만 락 해제

이러한 방법은 락의 원자성을 보장하고 다른 프로세스의 데이터 안정성을 확보하는데 도움을 줍니다.

추가 자료

다른 분산 락 구현 및 잠금 관리에 대한 더 깊은 이해를 원하신다면, 다음 자료를 참고해 보시면 도움이 될 것입니다:
- Redis 교습서에서는 Redis 기반의 다양한 동작 원리 및 예제를 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

jar 파일 빌드

-1

4

1

env

1

12

1

맥에서 파이썬

1

9

2

GCP SQL 진짜 어이가 없네

-1

10

1

레디스로 재고 관리

0

27

2

이제 인프런에서 강의 더 안산다. 후져....

0

31

1

소스코드 어디서 다운받아요?

0

43

5

답을언제쯤받아볼수있나요

0

38

2

프로젝트가 없어요..

0

52

2

강의 일정 및 수업 자료 공유 관련 문의드립니다!

0

32

1

레디스로 대기큐 구현 질문

0

70

2

API LIMIT

0

49

1

캐시 무효화

0

40

2

Redis와 Kafca의 Pub/Sub 차이

0

54

2

27강 슬랙 테스트 부분도 누락된 것 같네요

1

61

2

너무 흥미진진합니다..

1

56

2

순위가 동률일 때의 처리에 대해 질문드립니다.

0

69

2

Redlock 알고리즘 관해 궁금한게 있습니다!

0

90

2

좋아요/조회수 카운팅 병목현상에 대해서 궁금한점이 있습니다.

0

64

2

백엔드 서버 코드 변경에서 프론트엔드 서버가 값을 파싱하지 못하는 문제

0

111

1

강사님 GETDEL 관련해서 질문 있습니다

0

121

2

비밀번호를 걸고 실행된 레디스 서버에 lua 스크립트를 등록하는 경우

0

102

2

보안 설정을 한 수강생들은 Connection Settings에 비밀번호를 넣어야 추가되네요

0

81

2

Redis Container 해킹

0

133

1