Все еще стоит использовать фильтр Блума, если ваша база данных уже делает? - PullRequest
1 голос
/ 22 апреля 2020

Я читал в нескольких местах, что некоторые базы данных используют фильтры Блума для поиска соответствия при запросах к базе данных. В моем примере я использую Postgresql, который является одной из этих баз данных.

Мой вопрос возникает, когда я говорю о реализации фильтра Блума с Redis, который имеет модуль, который позволяет использовать фильтр Блума при вводе член в наборе. (Имейте в виду сложность процесса поиска, не извлекая это значение с диска)

Теперь преимущество использования Redis заключается в хранении значений в памяти, которые при попытке получить это значение более производительны по сравнению с поиск его в rdbms, потому что это значение хранится на диске.

В моем примере, скажем, я проверяю, существует ли уже имя пользователя, стоит ли по-прежнему использовать Redis в решении памяти с фильтром Блума против просто проверка с помощью Postgresql запроса?

Мой поток выглядит примерно так:
CheckIfUserExsits() // using Redis bloom filter
If TRUE then confirm with rdbms // do to x% probability of false positive nature of bloom filter
If rdbms == MATCH then reply with "User does exist"
Else don't check rdbms at all // do to 0% probability of false negative nature of bloom filter

Предполагается, что этот поток будет более предварительным, потому что вы не запрашиваете rdbms и делаете это быстро с помощью поиска в памяти, возвращая false более эффективно.

Однако, поскольку все, что меня волнует, это то, существует ли член или нет , чтобы повысить производительность при ответе false, шаг Redis действительно помогает? Потому что, если Postgresql уже запрашивает таблицу с использованием фильтра Блума, производительность должна быть относительно высокой.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Не добавляйте Redis, если у вас нет проблем с производительностью. Он добавляет второе хранилище данных, и разработка будет значительно замедлена и будет появляться больше ошибок, потому что каждое изменение данных должно быть синхронизировано между ними.

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

Где Redis может быть полезен при кэшировании «производных» данных, т. Е. Всего, на что база данных и ваше приложение потратили значительное время.

Фильтры Блума похожи: используйте их, когда вам нужны сотни тысяч поисков каждую секунду. Но по умолчанию используется ваша существующая база данных. Postgres способен на довольно приличную производительность - я был удивлен этим несколько раз.

Оптимизировать только после измерения и выявления проблемы.

0 голосов
/ 22 апреля 2020

Я читал в нескольких местах, что некоторые базы данных используют фильтры Блума для поиска соответствия при запросах к базе данных. В моем примере я использую Postgresql, который является одной из этих баз данных.

Не могли бы вы предоставить ссылки на то, что вы читали?

PostgreSQL действительно имеет цветение фильтруйте расширение типа индекса (в "contrib"), но индекс должен быть создан явно, и он не будет полезен в любом случае. Для каждого отдельного ряда он отвечает на вопрос «удовлетворяет ли этот ряд определенным условиям». Он не отвечает на вопрос «удовлетворяет ли какая-либо строка в этой таблице этому единственному условию».

PostgreSQL также имеет структуру данных языка C для внутреннего использования, но опять же ваше требование не одна из тех вещей, для которых он используется.

Фильтры Блума того типа, который вы хотите, было бы трудно реализовать из-за модели PostgreSQL ACID / MV CC и ее модели хранения.

Если вам это действительно нужно (и я сомневаюсь, что вам это нужно), тогда использование redis кажется хорошим инструментом для работы. Но как вы будете держать их в курсе c?

...