인프런 커뮤니티 질문&답변

김태영님의 프로필 이미지
김태영

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

라이브러리 장단점

redis 라이브러리별 케이스에 관하여 문의 드립니다

작성

·

311

1

redis를 활용한 사례를 처음 접하여서 강의 중 말씀해주신

'재시도가 필요하지 않은 경우', '재시도가 필요한 경우'가 명확히 떠오르지 않습니다

괜찮으시다면 간단한 예를 들어서 설명해주시면 감사하겠습니다

답변 1

4

최상용님의 프로필 이미지
최상용
지식공유자

김태영님 안녕하세요.

재시도가 필요한 경우를 예로 들어드리자면 주문할때일것 같습니다.

유저 A 가 로지텍마우스를 구매하였고 동시에 유저 B 도 로지텍마우스를 구매하였습니다.

이럴때는 유저 A 가 먼저 Lock 을 잡고있다면 유저B 는 기다렸다가 재시도를 하여 로지텍마우스를 구매할 수 있게합니다.

재시도가 필요없을경우는 선착순 1명만 로지텍마우스를 구매할 수 있다고 가정합니다.

유저 A 가 로지텍마우스를 구매하고자 Lock 을 획득하였고, 유저 B 가 추후에 로지텍마우스를 구매하고자 Lock 획득을 시도합니다.

유저 A 가 구매를 하고있는중이며 구매는 1명만 할 수 있기때문에 유저 B 는 획득을 시도해봤자 로지텍마우스를 구매할 수 없습니다.

그렇기때문에 Lock 획득 재시도를 할 필요가 없습니다.

추가로 질문이 있으시다면 댓글 부탁드리겠습니다!

감사합니다.

재시도가 필요하지 않은 경우 Lettuce를 사용한다고 하셨는데

그렇다면 while 문 밖에서 다시 while 문으로 재고를 확인하고 재고가 없다면 break 처리된다고 이해하면 될까요?

class LettuceLockStockFacade {

public void decrease(Long key, Long quantity) throws InterruptedException {
    while (!redisRepository.lock(key)) {
        TimeUnit.MILLISECONDS.sleep(100); // 시간을 두고 부하를 줄여준다
    }
}

 

최상용님의 프로필 이미지
최상용
지식공유자

tasklet1579 님 안녕하세요.

재시도가 필요하지 않은경우에는 lock 획득을 하지 못하면 바로 로직수행을 멈추시면 될것같습니다.

public void demo() {
     Boolean lock = redisRepository.lock(key);
     if(!lock) {
          // 재시도가 필요하지 않으므로 다른로직을 수행하지 않습니다.
          // 로깅이 필요하다면 로깅을 추가할 수 있습니다.
          // 에러 상황이라면 throw 를 할 수도 있겠습니다.
          return;
     }

     // 비즈니스 로직
}
김태영님의 프로필 이미지
김태영

작성한 질문수

질문하기