처음 redis로 티켓의 임시 예약 기능을 구현하기 위해 티켓의 점유자와 유저가 티켓을 점유하고 있는지를 확인하기 위해 strings을 사용해 구조를 만들었었다.
ticket_reserve:${user_uuid}
유저가 티켓을 점유하고 있는지 확인하기 위한 key
생성할때 NX 옵션과 EX 옵션을 같이 사용해서 생성을 시도할 때 임시예약중인 유저인지 체크하고, 임시 예약의 시간 제한을 EX 옵션을 통해 자동 만료되게 설계를 했었다.
show_reserve:${show_id}-${ticket_area}-${ticket_seat}
공연에서 점유중인 좌석을 확인하기 위한 key
생성할때 동일하게 NX 와 EX 옵션을 사용해서 자동 만료와 예약이 되어있는 좌석인지를 확인했다.
위와 같은 방식으로 구현을 하니 생긴 문제가 있었다.
바로 공연에서 빈 좌석을 출력하기 위해선 key값의 리스트가 필요하다는 점.
그래서 scan 을 통해 key값을 불러오는데 여기서 이제 문제가 생겼다.
데이터가 많이 쌓인 상태에서 scan으로 key값을 불러오기 위해서 들어가는 시간과, 값을 불러오는동안 생기는 블로킹…
처음에 scan 의 카운트를 50정도로 잡아서 사용했었는데, 이때 로드 테스트중(유저가 좌석 임시예약을 하는 시나리오) 빈 좌석을 불러오는데 대략 12000ms 정도가 걸리게 되는것이였다…
더더욱 큰 문제는 여기서 key값이 더 늘어나게 되면 시간은 기하수급적으로 늘어나게 될 상황..
그래서 나는 일단 scan의 카운트 값을 늘려 한번에 서치하는 양을 늘리기로 했다.