카테고리 없음

최상의 해결책은 1백만 개의 집합 교집합을 찾는 것입니다. Redis, Mongo, 기타 에 대해 어떻게 생각하세요?

스택큐힙리스트 2023. 11. 1. 23:13
반응형

안녕하세요 모두들, 그리고 미리 감사드립니다.
저는 NoSQL 게임에 새로 입문한 초보자입니다만, 현재 다니고 있는 회사에서는 대용량 데이터의 집합 비교를 맡아 과업을 부여했습니다.


저희 시스템은 고객 태그 집합과 대상 태그 집합을 갖고 있습니다.
태그는 8자리 숫자입니다.

고객 태그 집합은 최대 300개의 태그를 가지지만 평균적으로 100개의 태그를 가지고 있습니다.

대상 태그 집합은 최대 300개의 태그를 가지지만 평균적으로 40개의 태그를 가지고 있습니다.


미리 계산하는 것은 선택지가 아닙니다. 우리는 약 10억 사용자의 잠재 고객 기반을 목표로 하고 있기 때문입니다.


(이 태그들은 계층 구조를 가지고 있으므로 하나의 태그를 가지고 있다는 것은 그 태그의 부모 및 조상 태그를 모두 가지고 있다는 것을 의미합니다. 일단 이 정보는 고려하지 않습니다.)


고객이 사이트에 접속했을 때, 가능한 빠르게 그들의 태그 집합을 백만 개의 대상 태그 집합과 교차 비교해야 합니다. 고객 집합은 대상 집합의 모든 요소를 포함해야 일치합니다.

내가 옵션을 탐색하고 있는데 Redis의 집합 교집합이 이상적인 것 같습니다. 그러나 인터넷에서 한백만 개의 태그 집합을 보관하는 데 필요한 RAM 크기가 얼마나 필요한지 알 수 없었습니다. 교차 부분은 아주 빠를 것 같지만 Redis로 이런 해결책이 가능한 것일까요.


이러한 방식은 힘겨운 방식이며 비효율적입니다. 또한 이런 유형의 문제가 과거에 어떻게 처리되었는지 제안을 얻기 위해 이 질문을 사용하고 싶었습니다. 이전에 언급했듯이 태그는 트리에 저장됩니다. 가능한 해결책으로 Mongodb도 살펴보기 시작했습니다.


다시 한번 감사합니다

답변 1

교차 작업은 효율적입니다. Redis는 집합의 기수에 따라 집합을 정렬하고 가장 기수가 작은 집합부터 시작하기 때문입니다.


이제 고객 태그 집합에 모든 태그를 가진 대상 태그 집합을 찾는 반대 작업을 실행해야한다는 것을 이해했습니다. 역색인은 여전히 도움이 될 수 있습니다.


여기에 예시를 더러운 의사 코드로 제시합니다:


1- 고객 태그 집합 받기 (1 2 3 4라고 가정)
2- SUNIONSTORE tmp tag:1 tag:2 tag:3 tag:4
=> 결과는 최소한 하나의 태그를 고객과 공유하는 대상 태그 집합의 목록입니다.
3- tmp에서 t를 반복 (선택된 대상 태그 집합에 대해 반복)
n = SCARD tgt:t (대상 태그 집합의 기수)
intersect = SINTER customer tgt:t
if n == len(intersect), 해당 대상 태그 집합과 일치합니다.

그래서 고객 태그 세트를 1백만개의 대상 태그 세트와 테스트할 필요가 없습니다. 리버스 인덱스를 신뢰하여 검색 범위를 수용 가능한 수준으로 제한할 수 있습니다.

답변 2

1백만 개의 집합 중에서 1개의 원소를 찾는 최상의 방법 - Redis, MongoDB, 그 외에도 다른 해결책 있을까요? 이 주제에 대해 SEO를 고려하여 한국어로 글을 쓰겠습니다.
---
집합 연산은 대규모 데이터 처리 시 중요한 작업입니다. 특히, 1백만 개의 원소가 포함된 집합에서 1개의 원소를 찾아야 할 때는 효율적인 솔루션이 필요합니다. 이러한 요구 사항을 충족시키기 위해 Redis와 MongoDB를 비교해 보고, 다른 해결책에 대해서도 알아보겠습니다.
Redis는 일기 기반의 비관적 잠금 처리를 기반으로 한 메모리 내 데이터 구조 서버입니다. 데이터는 메모리에 저장되어 매우 빠른 성능을 제공합니다. 따라서 Redis는 집합 연산에 있어서 효과적인 선택입니다. 1백만 개의 집합에서 1개의 원소를 찾을 때, Redis는 O(1) 복잡도로 상수 시간에 해당 원소를 찾을 수 있습니다. 이는 Redis가 순간적으로 대량의 데이터를 처리할 수 있다는 것을 의미합니다. 또한, Redis는 비관적 잠금 처리를 사용하여 동시성 문제를 회피할 수 있으며, 주어진 집합의 교집합을 찾는 데에도 훌륭한 성능을 보여줍니다.
MongoDB는 문서 지향적인 NoSQL 데이터베이스이며, 확장성과 유연성을 제공합니다. MongoDB는 일정한 속도와 가용성을 유지하면서 데이터를 저장하고 검색할 수 있으며, 따라서 대규모 데이터베이스 작업에 잘 적용될 수 있습니다. MongoDB를 사용하여 1백만 개의 집합에서 1개의 원소를 찾을 때, 적절한 쿼리로 해당 원소를 찾는 데 최적화된 구조를 설계할 수 있습니다. MongoDB는 B-트리 인덱스를 사용하여 검색 성능을 향상시킬 수 있으며, 모든 데이터를 메모리 내에 보관하지는 않지만, 적절한 인덱스 구성과 함께 위 복잡도 O(log N)을 줄일 수 있습니다.
그 외에도 다른 해결책으로는 Memcached, Cassandra, Elasticsearch 등 다양한 옵션이 있습니다. 이들은 각각 다른 특징과 장점을 지닙니다. Memcached는 분산 메모리 객체 캐시 시스템으로, 빠른 응답 시간과 높은 확장성을 제공합니다. Cassandra는 분산형 NoSQL 데이터베이스로, 빠른 쓰기 성능과 확장성, 고가용성을 특징으로 합니다. Elasticsearch는 검색 및 분석 엔진으로, 실시간 검색 기능과 대용량의 데이터 처리를 용이하게 합니다.
결론적으로, 1백만 개의 집합 중 1개의 원소를 찾는 가장 좋은 방법은 사용 사례와 요구 사항에 따라 다를 수 있습니다. Redis와 MongoDB는 각각 자신의 장점과 특징을 갖고 있어, 집합 연산에 적합한 선택일 수 있습니다. 그 외에도 Memcached, Cassandra, Elasticsearch 등 다른 해결책을 고려하여 최적의 성능을 얻을 수 있습니다. 하지만 최종 선택은 데이터 양, 응답 속도, 가용성, 확장성과 같은 요인들을 종합적으로 고려하여 결정해야 합니다.
이에 따라, 1백만 개의 집합에서 1개의 원소를 찾는 최상의 해결책은 사용자의 필요에 따라 다양할 수 있으며, Redis, MongoDB와 같은 기술들은 매우 효과적인 선택이 될 수 있습니다. 조건에 따라 다른 데이터베이스 시스템을 고려하여 최고의 성능을 달성할 수 있도록 노력해야 합니다.

반응형