레디스 조회 기록 저장 방법 #177
-
관련 이슈
고민사항조회 정보 임시 저장을 위해 레디스를 사용해보려고 하는데 고민을 혼자서 너무 오래 붙잡고 있는 것 같아 팀원분들의 조언을 받아보고 싶습니다. 인기 게시글 판단 기준을 조회 정보가 많이 남아있는 순서대로 하려고 합니다. 조회 정보는 간단한 정보이고 타 정보와 연관이 없기 때문에 레디스를 통해 빠른 I/O를 추구하고자 합니다. 기존 리프레시 토큰을 저장하는 방법처럼 하지만 해당 자료구조의 경우 유효기간(TTL) 설정을 지원하지 않습니다. 따라서 여러 방안을 모색해 보았고, 최종적으로 다음과 같은 방안들을 구상했습니다.
저는 며칠 간 찾아보면서 1-2 혹은 2번 방법으로 눈길이 가는데, 혹시 여러분들은 어떻게 생각하시는지 궁금합니다! |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 5 replies
-
저는 1-2번 방법이 좋아 보입니다! |
Beta Was this translation helpful? Give feedback.
-
Sorted Set이라는 자료구조가 있군요! 새로운 내용 배워갑니다 👍 생각몇가지 생각이 들어 정리해서 공유드립니다. 제안해준 방식 내에서1-1 번의 경우 현재 무중단배포 환경이 아닐 뿐더러 서버를 다시 배포할 때 마다(WAS가 다시뜰 때 마다) 인기 게시글이 초기화될것 같아요 😅 혹시 Redis에 ex) var hotArticles = hotArticleRepository.findAll();
new TreeSet(hotArticles);
... 궁금증다만 한가지 궁금한 점이 생겼어요~!
해당 문구에서 TTL을 사용하고자 하는 목적이 보이지 않는데 인기 게시글이 조회수 많은 순서와 어떤 차이점이 있나요? 만약 아니라면 RDB에 있는 article 중 최근 10개의 게시글을 조회하고 hit 기준으로 정렬하는게 낫지 않나 싶네요. ex) // sudo code라서 named Query 문법은 안맞을 수 있습니다.
List<Article> articles = articleRepository.findAllTop10ByOrderByCreatedAt();
getOrderedHotArticles(articles)
... Sorted SetSorted Set의 만료시간 설정은 뭔가 어렵군요.. java Level에서 TTL 설정이나 Event Publishing 혹은 pub/sub 구조와 expired 등등의 키워드로부터 관련된 방안을 얻을 수 있을까 싶지만 아직 미지의 영역이기도 하고 그렇게까지 했을 때 되려 redis에서 불러오는 것 보다 효율적일지는 모르겠네요. |
Beta Was this translation helpful? Give feedback.
사용자가 1억명이라면?
이라는 생각은 정말 좋은 학습 원동력이 되는 것 같습니다 👍실시간이라는 개념이 정말 어려운 것 같아요
진짜 실시간을 원한다면 hit(조회수 증가)가 동시에 이뤄지는 순간도 있을거고 1초마다 인기 게시글 순위가 달라지고 마치 자동차 경주보다 빠르게 순위가 변경되는
실시간 인기 게시물
서비스가 될 것 같네요!조회수에 TTL을 적용한다는 발상도 정말 좋은 발상인 것 같아요. 나중에 해당 생각이 이벤트 발행으로 이어진다면 조금 더 명확한 인사이트를 얻을 수 있지 않을까 싶네요
하지만 여기서 지금 말씀드리고싶은건 현실적으로
실시간 인기 게시물 기능이 필요한가?
입니다.서비스 적으로 실시간 인기 게시물을 구현할 만큼의 트래픽이 발생하지 않을 뿐더러 들이는 공수 대비 트래픽을 받지 못하는 경우 그것대로 아쉬울 것 같다고 생각되네요 😅
따라서 현재 제안드리는 바는 2번으로 서비스에 적용해본 뒤 bench mark를 확인하여 I/O 속도가 정말 우려한 만큼 유의미한 성능 이슈가 발생하는지 확인해보는 것을 추천드려봅니다.
Redis에서 읽고, 정렬하는게 과연 유의미할 정도의 Timeout을 내는가? 를 직접 두눈으로 확인해보시죠!
원한다면 Stage 서버에 데이터 1억건을 넣고 RDB로 조회해보는 경험도 해보는게 재밌을 것 같네요