레디스의 자바 클라이언트이다.

Lettuce로 분산 락(Distributed lock)을 구현하는 경우 setnx 명령어를 활용할 수 있다.

*setnx: 동일한 key가 존재하지 않을때만 value가 저장됨 set if not exists

이때 Spin lock 방식으로 구현하는데, 주의할 점으로 retry 로직을 개발자가 직접 작성해주어야한다.

스핀 락

스레드가 Lock을 획득하기 위해 반복적으로 시도하는 기법이다.

Spin Lock으로 락을 획득하는 과정을 그림으로 나타내면 다음과 같다.

스크린샷 2025-02-27 오후 7.23.40.png

먼저 Thread-1이 setnx 명령어로 key = 1, value = lock으로 레디스에 set을 시도한다.

현재 레디스에는 key가 1인 값이 없으므로 정상적으로 적재하고 성공을 반환한다.

이후 Thread-2가 동일한 key와 value로 set을 시도한다.

하지만 이때는 이미 {1: lock}으로 값이 포함되어 있으므로 Thread-2의 set은 실패한다.

Thread-2는 Lock 획득에 실패하였으므로 일정시간(e.g. 100ms) 이후 Lock 획득을 재시도 한다.

Redisson

Lettuce와 같은 자바 레디스 클라이언트이다.

Redisson을 사용하는 경우 pub-sub 기반으로 Lock을 구현한다.

pub-sub

Lock을 관리하기 위한 채널을 생성한다.

Lock을 점유중인 쓰레드가 작업이 끝나면 Lock을 획득하려고 대기중인 쓰레드에게 해제를 알려준다.

이후 안내를 받은 쓰레드가 Lock을 획득하는 시도를 한다.