[Redis] 주식 데이터 캐시하기

한강섭·5일 전
0
post-thumbnail

문제점

현재 안드로이드 앱에서 그래프 화면 진입 시마다
GET /api/stock/v1/stocks/{stockId}/last3days 를 호출한다. 하지만 이 10만개의 데이터를 계속 GET 요청을 보내는 것에 비효율을 느꼈고 만약에 3일이 아닌 실제 증권처럼 30일, 1년, 몇년씩의 데이터를 가져오게 된다면 부하가 심할 것이다.

데스크탑이면 가능할지도 모르겠지만, 이 많은 데이터를 휴대폰 기기에 저장하는 것도 부담이 굉장히 크고 다운이 발생했다. 그렇게 Redis 도입을 고민하게 되었고 진행하게 되었다.

도입하기 전에 고려해야 할 점들을 정리하고 진행하려고 한다.

전략

일단 캐시 전략은 계층적 캐시 방식을 적용하려고 한다.

3일치 주식 데이터를 주세요 라는 요청이 들어온다면 먼저 2일치 캐시가 있는지?, 1일치 캐시가 있는지? 를 보고 히트한다. 만약 없다면 그때 3일치를 DB에서 불러온 후 캐시 해놓는 전략으로 도입했다.

구현 상세


일단 redis의존성을 추가하고 Configuration을 작성한다.

캐시 키를 stock:daily:{stockId}:{date} 식으로 설정하여 3개의 키를 모두 확인하고 없을 시 DB 조회를 한다.

각 날짜별로 캐시를 확인하고

캐시에 없는 날짜들을 DB에서 조회해서 캐시에 저장한다.

마지막으로 원래대로 시간순 정렬하여 반환하도록 설정해서 원래 응답 형식을 맞춰주면 끝

결과

첫번째 조회에서는 캐시 미스가 뜨고 DB에서 쿼리 수행 후 캐시 저장을 하고, 이후 접근 시 3일 동안 캐시가 있으면 히트 되어 바로 데이터를 가져와서 빠른 조회가 가능하게 되었다.

Log에 잘 찍히는 모습이고 밑은 우리 Redis UI로 확인한 저장 모습이다.

미래에는..

현재 우리 주식 종목이 5개 밖에 없고, 3일 치의 데이터만 가져오기 때문에 5 x 10만 50만 데이터를 저장하고 있어 현재 용량 설정인 1GB에 미친다면 위험하다.

종목수가 100개가 넘어갈때, 동시 사용자가 10000명이 넘어갈 때, 보관 기간이 30일이 넘어갈 때 문제가 생길 것이다.

Grafana를 통해 메모리 사용량을 확인하면서 모니터링을 하고

후에는 Read Replica 같은 읽기 전용 복제본을 만들어서 읽기 성능을 확장 시키는 방법을 도입해야 한다.

profile
기록하고 공유하는 개발자

2개의 댓글

comment-user-thumbnail
4일 전

redis 터트릴게요

1개의 답글