해결된 질문
작성
·
94
0
제가 강의에서 이해한 바로는 example/1 과 같은 단일 리턴값에는 캐쉬를 적용해서 db의 부하를 줄일 수 있다고 생각했습니다.
하지만, search?title=딩코&tag=백엔드…” 와 같은 복합 검색 조건을 기반으로, 백만 건 이상의 데이터 중에서 동적 쿼리를 사용해 10개씩 페이지네이션하여 가져오고 있습니다.
이 경우에는 쿼리마다 값이 달라지니 미리 레디스에 값을 반영할 수도 없는 상황입니다.
그리고 DB에서는 10개의 값을 리턴시키는데, 이런 상황에서는 캐시를 사용할 수 없는 건가요? 반드시 인덱스를 통해서만 성능을 확보해야 하나요?
답변 2
0
안녕하세요 kongminoo님!!! 좋은 질문 해주셔서 감사합니다.
먼저 제안드리고 싶은 방법은, 쿼리 조건 기반 캐시 키 생성입니다!
결국 유저들이 검색하는 패턴이 무한하지 않고, 많은 검색들이 특정 유사경우들이 발생할거라서, 쿼리조건을 해싱하여 만든 값으로 캐싱하는 것을 추천드립니다.
저도 그 외의 방법들이 궁금해서 실제 대기업들이 어떻게 하는지 찾아보니까 다른 방법들이 있어 공유드립니다!
Netflix는 사용자별로 다음과 같이 캐시 키를 만든다고 합니다
// Netflix 방식 예시
String cacheKey = "search:user_" + userId + ":query_" + hashQuery(searchParams) + ":page_" + pageNumber;
밤에 배치로 개인화 결과를 미리 만들어놓고, 실시간으로는 짧은 TTL로 캐싱해서 응답시간을 줄인다고 합니다
Uber는 초당 4천만건 읽기를 처리하면데, 복합 검색 조건이 엄청 복잡해요 (위치, 차종, 가격, 시간 등). 그래서 H3 육각형 지리공간 인덱싱을 통해 위치를 육각형 ID로 변환해서 캐시 키에 포함한다고 합니다. 이를 통해 캐시 히트율 & CPU 사용량을 매우 감소시켰다고 합니다. 요런 사례를 가지고 개선 사례를 제시해봐도 너무너무 좋을 것 같네요!! 좋은 질문 주셔서 감사합니다 민우님!!
// Uber식 위치 기반 캐시 키
String cacheKey = "driver_search:" + h3Index + ":" + carType + ":" + timeSlot;
0
안녕하세요, kongminoo님! 인프런 AI 인턴입니다.
동적 쿼리를 사용하면서도 캐싱을 활용할 수 있는 방법에 대해 궁금해 하시는군요. 백엔드 시스템에서는 캐시와 데이터베이스를 적절히 활용하여 성능을 최적화하는 것이 중요합니다. 하지만, 쿼리마다 결과가 달라지거나 조건이 복잡할 경우 캐시를 적용하기가 쉽지 않은데요, 몇 가지 접근 방법을 소개해 드리겠습니다.
쿼리 결과 캐싱:
Redis
와 같은 캐시 스토리지를 사용할 수 있으며, 페이지 번호와 사용한 필터 조건 등을 키로 조합하여 캐싱할 수 있습니다. 예를 들어, search?title=딩코&page=1&tag=백엔드
와 같이 키를 구성할 수 있습니다.데이터 아키텍처 최적화:
인메모리 캐시 활용:
캐시와 인덱싱을 동시에 활용하는 것이 고성능을 유지하는 데 효과적일 것입니다. 관련된 자료와 실제 사례는 아래 링크에서 추가적으로 확인하시면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.