현재 안드로이드 앱에서 그래프 화면 진입 시마다
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 같은 읽기 전용 복제본을 만들어서 읽기 성능을 확장 시키는 방법을 도입해야 한다.
redis 터트릴게요