강의

멘토링

커뮤니티

Inflearn コミュニティ Q&A

s1121238291 のプロフィール画像
s1121238291

投稿した質問数

Spring Bootで実際に作りながら学ぶ大規模システム設計 - キャッシュ戦略

Bloom Filter - Split - 実装

Split 전략 강의 중 질문 있어요

作成

·

48

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 도 원래 그런건지..
제 질문 의미가 전달될지는 모르겠지만.. 명확하게 개념 정리가 되지 않아 질문드립니다

spring-bootredisbackend시스템-디자인cache

回答 2

1

kuke님의 프로필 이미지
kuke
インストラクター

SPRING님, 안녕하세요!

 

어 이거 해결 처리되어 있어서 답변을 놓쳤군요. (제가 잘못 눌렀었는지..?!)

이미 해결이 되신걸까요?

 

답변 드려보면, Split 전략은 자동으로 여러 개의 데이터를 넣도록 확장하기 위한 전략이 아닙니다.

Split 전략은 Redis 단일 키 크기의 한계를 해결하기 위함이지,

n=1000으로 만들었는데 2000개를 넣으면, 당연히 단일 BloomFilter와 동일하게 오차율이 급격하게 증가하게 됩니다.

단일 Bloom Filter에 1억 개의 데이터를 관리하고자 한다면,

Redis 단일 키에 대한 저장 크기 한계로 인해 실패하지만,

Split 전략으로 인해 여러 개의 키(split)로 분산 되어 거대한 Bloom Filter를 관리할 수 있게 되는 것입니다!

물리적으로는 여러 개의 키로 Bloom Filter가 분할되지만, 논리적으로는 1개의 거대한 Bloom Filter를 이루는 것입니다.

SPRING님의 프로필 이미지
SPRING
質問者

Split 강의를 들은 후, Sub Filter 강의를 듣기 전에 질문을 남겼었는데 Sub Filter 강의를 듣고난 후에 False Positive 발생 확률이 줄어들어 제가 해결로 처리했습니다! 답변 감사합니다!

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 발생 확률을 낮출 수 있습니다.

참고 링크

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

s1121238291 のプロフィール画像
s1121238291

投稿した質問数

質問する