Использование фильтра Bloom

Я изо всех сил стараюсь понять полезность фильтра цветения. Я получаю свою основную логику, сжатие пространства, быстрый поиск, ложные срабатывания и т.д. Я просто не могу превратить эту концепцию в реальную ситуацию как полезную. Одним из часто используемых приложений является использование цветных фильтров в веб-кешировании. Мы используем фильтр цветения, чтобы определить, находится ли данный URL в кеше или нет. Почему бы нам просто не получить доступ к кешу, чтобы определить это? Если мы получим "да", нам все равно нужно перейти в кеш для получения веб-страницы (чего может и не быть), но в случае нет, мы могли бы получить тот же ответ, используя кеш (который, вероятно, оптимизирован для быстрого поиска в любом случае?).

Ответ 1

Фильтры Bloom предназначены для ситуаций, когда ложный негатив - очень плохая вещь, и допустим ложный положительный результат.

Например, предположим, что вы создаете веб-браузер и имеете известный черный список мошеннических веб-сайтов. Ваш черный список массивный - в сотнях гигабайт - поэтому вы не можете отправить его в браузере. Однако вы можете сохранить его на своих серверах. В этом случае вы можете отправить браузер с фильтром Bloom соответствующего размера, который содержит все URL-адреса. Перед посещением сайта вы просматриваете его в фильтре. Затем, если вы получите ответ "нет", вам гарантируется, что URL-адрес не внесен в черный список и может просто посещать сайт. Если вы получите ответ "да", сайт может быть злым, поэтому вы можете заставить браузер вызвать ваш главный сервер, чтобы получить реальный ответ. Важным является тот факт, что вы можете сэкономить огромное количество вызовов на сервере, не жертвуя при этом точностью.

Идея кэша похожа на эту настройку. Вы можете запросить фильтр, чтобы увидеть, находится ли страница в кеше. Если вы получите ответ "нет", вам гарантировано, что он не кэшируется и может выполнить дорогостоящую операцию по извлечению данных из основного источника. В противном случае вы можете проверить кеш, чтобы увидеть, действительно ли он там. В редких случаях вам может потребоваться проверить кеш, увидеть, что его нет, а затем извлечь из основного источника, но вы никогда не будете случайно пропустить что-то действительно в кеше.

Надеюсь, это поможет!

Ответ 2

Блум-фильтры могут быть полезны, если выполняются оба следующих условия:

  • False Negative неприемлемо
  • Стоимость поиска дорогая относительно стоимости поиска в Bloom Filter.

Первый момент довольно прост. Вторая точка обычно становится значимой, когда фильтр Bloom может быть хранящиеся в первичной памяти, но фактический поиск может приводить к ударам базы данных, которые могут быть очень "дорогостоящими" относительно выполняя некоторое количество хэшей на клавише, за которым следует поиск в памяти (т.е. фильтр Bloom).

Если выполняется только один из вышеуказанных критериев, то фильтры Bloom не являются лучшим решением проблемы.

Экономия возникает, когда можно устранить дорогостоящий поиск, потому что известно, что нет возможности получить соответствие. Это значение первой точки - Bloom Filters не генерируют ложные негативы, поэтому, если совпадение не найдено в фильтре, нет смысла перейти к следующему, более дорогостоящему шагу, к извлечению данных, связанных с ключом.

Когда фильтр попадает в хит, требуется дорогостоящий поиск, чтобы проверить хит (исключить ложный результат) и получить связанные данные. Здесь есть возможность не найти ничего из-за ложного позитива, и поэтому фильтр необходимо настроить для минимизации этого риска до приемлемого уровня. Функциональный фильтр Bloom должен иметь низкий коэффициент ложного срабатывания, поэтому общая стоимость поиска остается низкой.

Теперь, если, как вы говорите, ваш кеш уже оптимизирован для быстрого поиска, тогда утилита фильтра Bloom может быть запрограммирована.

Ответ 3

проблема в том, что ваш пример не так велик.

в веб-кеше, если URL-адрес отсутствует, вы все равно должны сделать дорогостоящий вызов в сети, поэтому сохранение доступа к диску не имеет большого значения. так что вы правы, чтобы задать вопрос (и комментарий Диего Баша не очень хорошо продумано, imho).

поэтому я пошел искать, почему вы использовали этот пример. и выясняется, что в статье в википедии упоминается, что в кеш-кэше используются фильтры цветения. но они не используются так, как вы описали. вместо этого они используются, чтобы решить, какой кеш выбрать из набора распределенных кэшей. и они используются в основном для экономии места (потому что кальмар может кэшировать много объектов, поэтому в противном случае эти таблицы были бы очень большими). ​​

для получения дополнительной информации о фильтрах кальмаров и цветков см. http://wiki.squid-cache.org/SquidFaq/CacheDigests

в противном случае, другой ответ здесь, из templatetypedef, в порядке - проверка на наличие плохих сайтов - гораздо лучший пример.