- set if not exsist 키와 벨류를 셋할때
- 기존에 값이 없을때만 set 함
- springLock로직 이므로 Retry로직을 따로 작성해줘야지
- 스핀락? 락을 획득하려는 스레드가 락을 획득할 수 있는지 반복적으로 시도하면서 획득 작업
- 정상적으로 1은 락이된다
- 일정 시간이 후 스레드 2는 락획득을 재시도 함.
Redisson
- 펍섭 기반은 채널을 하나 만들고 락을 점유 중인 쓰레드가 락획득하려도 대기중인 스레드에게
- 스레드 해제를 알려주면 안내받은 스레드가 락을 획득하는 방식
- 별도의 리트라이 로직을 작성하지 않아도 됨
시작
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
-
의존성 추가
-
레디스는 현재 기본도커에 떠있으므로 생략
Lettuce를 작성하여 재고감소 로직 작성하기
- 키는 1 벨류는 Lock으로 지정
- 키가 중복되면 안됀다.
- del 1 하면 키 1 삭제 명령어
- 레디스는 Mysql의 네임드 락과 비슷하며 session관리에 신경을 안서도됨
- 키는 sotck id, value lock으로 작성
- 로직실행 전후로 락획득 해제를 위한 퍼사드 메서드를 작성해야됨
- 테스트 실행
- 구현이 간단하지만 스핀락 방식으로 레디스에 부하를 줄 수 있음
Redisson 을 활용하여 재고로직 작성하기
implementation 'org.redisson:redisson-spring-boot-starter:3.17.4'
- 이렇게 서로 통신 가능
- 레디스는 자신이 점유하고 있는 락을 해제할 때 채널에 메시지를 보내줌으로서
- 락을 획득해야하는 스레드들에게 락 획득 하라고 전달 해줌
- 메세지 받은 스레드는 락획득 시도
- 레디슨은 락 해제가 되었을때 한번 몇번만 시도해서 레디스의 부하를 줄여주게 됨.
- 락 관련된 클래스들을 라아이브러리에서 제공해 줌 별도의 레포지토리 작성 XX
- 레디스의 부하를 줄여 주는 장점이 있음
- 구현이 복잡하고 라이브러리의 의존해야되는 단점이 있다
- lock을 라이브러리 차원에서 제공해서 사용법을 공부해야됨