inflearn logo
강의

講義

知識共有

2026年!バックエンド開発者のためのRedis実践ガイド:基礎から実務パターンまで

인기 게시판 목록(Sorted set)

解決済みの質問

14

wellsohn05277891

投稿した質問数 1

0

안녕하세요.

인기 게시판 목록 기능을 Redis의 Sorted Set을 활용해 좋아요 순으로 정렬하는 방식으로 구현하다 고민이 생겨 질문하게 되었습니다.

먼저 잦은 데이터 변경을 고려해서 Sorted Set의 member에는 게시판 ID만 저장하고, score에는 좋아요 수를 저장하도록 했습니다.

하지만 목록을 생성하기 위해서는 제목, 생성일 같은 부가 정보가 필요한데 이 데이터를 얻는 효율적인 방식에 대해 고민이 생겨 질문을 드리게 되었습니다. AI에게 도움을 받아 2가지 방법을 생각해보았는데 현실성이 있는지 판단 부탁 드립니다.



  1. Redis + RDB 조합


    • Redis ZSet에서 상위 10개의 ID 목록을 먼저 조회합니다.

    • 해당 ID 목록을 가지고 RDB에 WHERE id IN (...) 쿼리를 날려 상세 데이터를 가져옵니다.

    • 데이터베이스의 IN 쿼리는 순서를 보장하지 않기 때문에 애플리케이션에서 Redis가 준 ID 순서대로 리스트를 다시 재정렬하여 반환합니다.

제가 생각하기에는 인기 게시판 목록을 조회할 때마다 RDB의 ORDER BY 부하를 줄이려다 오히려 애플리케이션 단에서 정렬과 DB 조회가 일어나다 보니 얻는 것보다는 잃는 게 많은 구조가 아닌지 고민이 됩니다.

  1. Redis Sorted Set + Hash 조합

이 방식은 DB에 부하를 줄일 수 있지만 데이터가 자주 변하게 된다면 레디스에서 데이터를 자주 변경해야 되어 메모리에 큰 부하를 줄 수 있을 것 같아 고민이 되는 것 같습니다.

아키텍처 redis

回答 2

1

codingpe

안녕하세요.
Redis로 좋아요를 관리해야 될 수준으로 트래픽이 많은가 보네요.

둘 중 하나를 고른다면 1번을 추천드립니다.

2번 방법은 얻는 것에 비해 복잡성이 너무 커 보이네요.

1번으로 했을 때, RDB에서 가져온 10개를 어플리케이션에서 다시 정렬하는 방법과 DB쿼리할 때 정렬하는 방법 둘 중에서 하나를 사용하시면 될 거 같아요.

(1) 어플리케이션에서 최종 정렬
Redis 에서 받은 순서 기준으로 Map을 생성해서 RDB 조회 결과를 Map기준으로 최종 정렬

(2) RDB 쿼리할 때 정렬 요청
MySQL의 경우 ORDERBY FIELD(id,...) 형태로 쿼리
(MySQL이 아니라면 해당 DB에 맞는 정렬 쿼리 사용)

(1), (2) 중에서 선택
- FIELD 는 표준 쿼리가 아니기 때문에 다른 RDB와의 호환성 문제가 있음
- 만을 RDB가 어떤것이든 상관 없이 동작하도록 하고 싶을 경우 (1)번 방법인 어플리케이션에서 최종 정렬함

조회된 게시물 수가 10개 이기 때문에 이 정도를 다시 정렬하는 것은 거의 비용이 들지 않습니다.
실제로 실무에서 많이 사용하는 형태입니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 손명진님.

Redis의 Sorted Set과 다른 자료구조들을 사용하여 인기 게시판 목록 기능을 구현하려고 하시군요. 이러한 시스템 설계에서는 성능과 효율성, 그리고 데이터의 정확성 사이의 균형을 잡는 것이 매우 중요합니다. 제안하신 두 가지 접근 방식에 대해 각각 장단점을 설명드리겠습니다.

1. Redis + RDB 조합

  • 장점:

    • RDBMS를 활용하면 데이터의 영속성이 보장되고, 복잡한 쿼리 기능을 활용할 수 있습니다.
    • Redis에서 상위 N개의 ID만 조회하므로 Redis의 부하는 비교적 적습니다.
  • 단점:

    • IN 쿼리를 사용하더라도 데이터베이스 부하가 발생할 수 있습니다.
    • 애플리케이션에서의 추가적인 정렬 작업은 성능을 저하시키는 요인이 될 수 있습니다.

이 방법은 조회빈도가 매우 높거나, 데이터 변경이 자주 일어날 때 부하를 줄이는 데 한계가 있을 수 있습니다. 데이터 일관성 보장 측면에서는 안정적이지만, 성능 최적화를 신경 써야 합니다.

2. Redis Sorted Set + Hash 조합

  • 장점:

    • Redis 내에서 모든 작업을 처리할 수 있어 무척 빠릅니다.
    • DB 접근 없이 빠른 조회가 가능하므로, 트래픽이 많은 경우 유리합니다.
  • 단점:

    • Redis의 메모리를 효율적으로 사용해야 하며, 데이터가 변경될 때마다 Redis 상태 업데이트가 필요합니다.
    • Redis 서버 장애 시, 데이터 유실 위험이 존재할 수 있습니다.

이 방법은 주로 고성능 실시간 서비스에서 많이 쓰이며, Redis가 모든 데이터 관리 및 조회를 담당하게 됩니다. 다만, Redis 메모리 사용과 데이터 일관성에 대한 신경을 많이 써야 합니다.

추천 방식

정확한 선택은 시스템의 특성과 요구 사항에 따라 다릅니다. 두 방법 모두 현실적이고 실용적이긴 합니다.

  • 트래픽이 많고 실시간 접근이 필요한 경우: Redis Sorted Set + Hash 조합을 고려해 볼 수 있습니다. 특히, 메모리 용량이 충분하고, Redis의 고가용성을 보장할 준비가 되어있다면 이 방식이 더 적합합니다.

  • 데이터 일관성과 복잡한 쿼리 처리가 더 중요할 경우: Redis + RDB 조합이 더 적합할 수 있습니다. 데이터베이스를 통한 영속성 확보와 풍부한 쿼리 기능을 활용할 수 있습니다.

추가적으로 이와 유사한 사례를 다룬 게시물인 레디스로 대기큐 구현 질문를 참고하시면 좋은 참고가 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

테스트 코드 작성 시 DTO 새로 작성하는 이유가 궁금합니다.

0

16

1

운영환경에 적용해볼 수 없을때...고민입니다 ㅠㅠ

0

45

1

rabbitmq에 configservice 연결에 대해 질문있습니다.

0

38

1

Int 값들 null 처리

0

27

1

db table 관련질문

0

30

1

현업에서 prisma relationMode는 사용안하나요?

0

36

1

19강 15_2) 템블릿에 List가 없는경우는 어떻게 해야되나요?

0

35

1

15강 12-3) 값 제출후 mysql 저장이 안됩니다.

0

43

2

Nat Gateway

0

41

2

레디스로 재고 관리

0

58

2

Lock 해제 문의 드립니다.

0

59

2

레디스로 대기큐 구현 질문

0

91

2

API LIMIT

0

63

1

캐시 무효화

0

53

2

Redis와 Kafca의 Pub/Sub 차이

0

68

2

너무 흥미진진합니다..

1

73

2

순위가 동률일 때의 처리에 대해 질문드립니다.

0

88

2

Redlock 알고리즘 관해 궁금한게 있습니다!

0

107

2

좋아요/조회수 카운팅 병목현상에 대해서 궁금한점이 있습니다.

0

83

2

백엔드 서버 코드 변경에서 프론트엔드 서버가 값을 파싱하지 못하는 문제

0

119

1

강사님 GETDEL 관련해서 질문 있습니다

0

134

2

비밀번호를 걸고 실행된 레디스 서버에 lua 스크립트를 등록하는 경우

0

113

2

보안 설정을 한 수강생들은 Connection Settings에 비밀번호를 넣어야 추가되네요

0

90

2

Redis Container 해킹

0

136

1