Lettuce

Han Gyul Kang·2022년 10월 16일

동시성 문제

목록 보기
5/7

상위글 : 동시성 이슈 해결 고민

setnx 명령어 터미널 테스트

NameLock과 유사한 방식으로 구현 됨

예제 소스

    // lock
    public Boolean lock(Long key) {
        return redisTemplate
                .opsForValue()
                .setIfAbsent(generateKey(key), "lock", Duration.ofMillis(3000));
    }
    
    // unlock
    public Boolean unlock(Long key) {
        return redisTemplate.delete(generateKey(key));
    }
    
    // 실패 시 재요청
    public void decrease(Long key, Long quantity) throws InterruptedException {
        while(!redisLockRepository.lock(key)) {
        	// redis에 부하를 줄이기위해 100ms동안 Thread sleep
            Thread.sleep(100);
        }

        try {
            stockService.decrease(key, quantity);
        } finally {
            redisLockRepository.unlock(key);
        }
    }    
profile
피아노 치는 개발자

0개의 댓글