Redis 이용해보기

존스노우·2023년 10월 29일
0

  • set if not exsist 키와 벨류를 셋할때
  • 기존에 값이 없을때만 set 함
  • springLock로직 이므로 Retry로직을 따로 작성해줘야지
  • 스핀락? 락을 획득하려는 스레드가 락을 획득할 수 있는지 반복적으로 시도하면서 획득 작업


  • 정상적으로 1은 락이된다
  • 일정 시간이 후 스레드 2는 락획득을 재시도 함.

Redisson

  • 펍섭 기반은 채널을 하나 만들고 락을 점유 중인 쓰레드가 락획득하려도 대기중인 스레드에게
  • 스레드 해제를 알려주면 안내받은 스레드가 락을 획득하는 방식
  • 별도의 리트라이 로직을 작성하지 않아도 됨

시작

implementation 'org.springframework.boot:spring-boot-starter-data-redis'
  • 의존성 추가

  • 레디스는 현재 기본도커에 떠있으므로 생략

Lettuce를 작성하여 재고감소 로직 작성하기

  • 레디스 cli

  • 키는 1 벨류는 Lock으로 지정
  • 키가 중복되면 안됀다.
  • del 1 하면 키 1 삭제 명령어
  • 레디스는 Mysql의 네임드 락과 비슷하며 session관리에 신경을 안서도됨

  • 키는 sotck id, value lock으로 작성
  • 로직실행 전후로 락획득 해제를 위한 퍼사드 메서드를 작성해야됨


  • 테스트 실행
  • 구현이 간단하지만 스핀락 방식으로 레디스에 부하를 줄 수 있음

Redisson 을 활용하여 재고로직 작성하기

implementation 'org.redisson:redisson-spring-boot-starter:3.17.4'
  • 임플리먼트 추가

  • 이렇게 서로 통신 가능
  • 레디스는 자신이 점유하고 있는 락을 해제할 때 채널에 메시지를 보내줌으로서
  • 락을 획득해야하는 스레드들에게 락 획득 하라고 전달 해줌
  • 메세지 받은 스레드는 락획득 시도
  • 레디슨은 락 해제가 되었을때 한번 몇번만 시도해서 레디스의 부하를 줄여주게 됨.
  • 락 관련된 클래스들을 라아이브러리에서 제공해 줌 별도의 레포지토리 작성 XX

  • 레디스의 부하를 줄여 주는 장점이 있음
  • 구현이 복잡하고 라이브러리의 의존해야되는 단점이 있다
  • lock을 라이브러리 차원에서 제공해서 사용법을 공부해야됨

profile
어제의 나보다 한걸음 더

0개의 댓글