24.02.25 23:24 작성
·
144
0
public Long increment() {
return redisTemplate
.opsForValue()
.increment("coupon_count");
}
----------------------------------------------------
public void apply(Long userId) {
Long count = couponCountRepository.increment();
if (count > 100) {
return;
}
couponRepository.save(new Coupon(userId));
}
코드에서 쿠폰을 100개 발급할 수 있도록 했는데
만약 동시에 100만 개의 요청이 들어오게 되면 redis에도 똑같이 100만 번의 요청이 가서 100개의 요청을 제외한 나머지 불필요한 요청을 redis가 처리해야 되는 문제가 발생할 것 같습니다.
public void apply(Long userId) {
Long count = couponCountRepository.getCount();
if (count > 100) {
return;
}
couponCountRepository.increment();
couponRepository.save(new Coupon(userId));
}
그래서 쿠폰 개수를 먼저 가져와서 검증 후 개수를 올리게 되면 또다시 Race Condition이 발생할 것 같습니다.
실무에서는 어떠한 방식으로 코드를 작성하시는지 궁금합니다!
답변 1
0
2024. 02. 25. 23:33
강민님 안녕하세요.
말씀해주신 방법대로 하게된다면 race condition 이 발생할 수 있습니다.
1차로 먼저 가져온 후 100개 이상이라면 return 하고 100개 이하라면 increment 한 후 결과값을 재검증하는 방식으로 사용한다면 불필요한 요청을 최소화 할 수 있을 것 같습니다.
감사합니다.