강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

SPRING님의 프로필 이미지
SPRING

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 캐시 전략

Bloom Filter - Split - 구현

Split 전략 강의 중 질문 있어요

작성

·

9

0

@Slf4j
@SpringBootTest
class SplitBloomFilterRedisHandlerTest extends RedisTestContainerSupport {

    @Autowired
    SplitBloomFilterRedisHandler splitBloomFilterRedisHandler;

    @Test
    void mightContain() {
        SplitBloomFilter splitBloomFilter = SplitBloomFilter.create("testId", 1000, 0.01);

        List<String> values = IntStream.range(0, 1000).mapToObj(idx -> "value" + idx).toList();
        for (String value : values) {
            splitBloomFilterRedisHandler.add(splitBloomFilter, value);
        }

        for (String value : values) {
            boolean result = splitBloomFilterRedisHandler.mightContain(splitBloomFilter, value);
            assertThat(result).isTrue();
        }

        for (int i = 0; i < 1000; i++) {
            String value = "notAddedValue" + i;
            boolean result = splitBloomFilterRedisHandler.mightContain(splitBloomFilter, value);
            if (result) {
                log.info("value={}", value);
            }
        }
    }
}

 

 

위 코드는 SplitBloomFilterRedisHandlerTest 인데요.

강의 중 코드입니다

 

1000 크기에 0.01 오차율의 Bloom Filter 를 만들고

1000개의 데이터를 넣고 False Positive 까지 검증해보는 코드인데요.

질문입니다
Split 전략을 배우기 전에
순수한 Bloom Filter 구현 강의에서도 위와 동일한 테스트 코드가 있는데요

이 때, 순수한 Bloom Filter 의 한계로써
생성한 Bloom Filter 크기를 초과하여 데이터를 넣으면 비트 1이 많아져 오차율이 증가하고
그로 인해 False Positive 데이터가 많이 조회되는 현상을 살펴보거든요.

그리고 그 해결책으로
처음부터 큰 Bloom Filter 를 만드는 것 이외에
Split / Sharding / Sub Filter 전략이라고 말씀하시는데요

근데 위 Split 전략의 테스트 코드에서

BloomFilter 크기는 1000으로 만들고

데이터를 훨씬 초과하여 2000개 만들어 넣어보면
순수한 Bloom Filter 때처럼 False Positive 데이터가 많이 조회됩니다.


저는 PC 가 느려서 False Positive 를 1000번으로 조회하였고
오차율 (0.01) 에 의하면 약 10개의 False Positive 가 나와야 하는데

데이터 1000개를 저장했을 때는 오차율에 맞게 8개로 떨어지는데
데이터 2000개를 저장했을 때는 오차율을 훨씬 넘어갑니다

제가 코드를 잘못 따라 친건지.. Split 도 원래 그런건지..
제 질문 의미가 전달될지는 모르겠지만.. 명확하게 개념 정리가 되지 않아 질문드립니다

답변 1

0

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

제시해주신 질문에 대해 답변 드리겠습니다.

SplitBloomFilter의 개념과 동작

SplitBloomFilter는 기본적으로 Bloom Filter의 한계를 극복하기 위해 고안된 전략입니다. 일반 Bloom Filter에서는 용량을 초과할 경우, 설정한 오차율이 훨씬 초과하게 됩니다. 이 때문에 SplitBloomFilter는 큰 용량의 Bloom Filter를 여러 개의 작은 서브 필터로 나누어 관리함으로써 공간 효율성을 높이고 초기 설정된 오차율을 유지하려는 전략을 취합니다.

질문의 핵심: False Positive 증가

질문하신 내용에서, 예상대로 Split 전략을 적용하더라도 개별 Split 필터의 용량을 초과하면 오차율이 증가하며 False Positive 비율이 높아질 수 있습니다. 이는 개별 Split 필터가 각각의 Bloom Filter로 동작하며, 용량 초과 시 False Positive가 증가하는 현상에서 자유롭지 않기 때문입니다.

해결 방안

  1. 적절한 용량 설정: Split 전략을 적용할 때, 각 서브 필터의 용량을 설정하여 데이터의 최대 삽입 개수를 잘 관리해야 합니다. 즉, 총 데이터 개수를 여러 서브 필터에 적절히 분배해야 합니다.
  2. Sub Filter 추가: 데이터를 보다 많은 수로 분산해야 할 경우, 서브 필터의 개수를 늘려주면 용량 초과 시 False Positive 발생 확률을 낮출 수 있습니다.

참고 링크

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

SPRING님의 프로필 이미지
SPRING

작성한 질문수

질문하기