Есть алфавит, к примеру '01234567890abcdef'
И вместо 1 производится инкремент по алфавиту. Т.е. если стоял символ 'b' после инкремента будет символ 'c', декремент (во время удаления) все делает наоборот.
Это не самое лучшее решение. У меня было другое, где значения отделялись знаком, к примеру запятой. Но оно было очень медленным.
Ну тут разницы нет. Конвертирование никто не отменял. Другое дело, что с большими числами напрямую не поработать, поэтому crc32 мне здорово помог. Я пробовал различные манипуляции с разными хешами и лучшей уникальности/производительности добиться не смог.
Кстати, рост памяти во время проверки только из-за наполнения массива ошибок. Его размер равен половине размера выборки. Без него Bloom потребляет почти ничего.
Скорость не проверял, хотя уверен, что работает гораздо быстрее. Уникальность на уровне 62-64%. Есть подозрение, что это из-за использования crc32 в качестве преобразования строка -> число.
Вот код теста.
Вообще не вижу смысла использовать, даже если работает быстрее, т.к. тогда уже лучше использовать расширение фильтра Блума написанное на C. Но как дополнительный вариант можно добавить.
Я думал об этом. Как минимум памяти это съест гораздо больше. А вот о возможности задавать в виде ключа строку различных кодировок я не уверен. Разве что и там хеширование использовать.
В общем, я проверю.
Поправьте, если я чего-то не понял.
Количество хеш-функций определяется из 2-х условий: количества объектов в выборке и вероятности «ложноположительного» срабатывания. Mrrl прав. Число хеш-функций крайне мало по сравнению с количеством объектов. И основную память занимает как раз битовая строка.
Тут уже встает вопрос насколько такой кэш подходит Вашему приложению. Если select/total > 90%, я считаю эту стратегию верной и самой простой.
Поясните, чем плох дроп кеша, даже массовый (в пределах тега)?
Менять префиксы не самый лучший способ. Их необходимо где-то хранить. Также некоторые системы при перезаполнении пула, могут просто отказаться работать (старые версии APC, к примеру).
Другой вариант, это бэкграундое перестроение кеша. Когда Вы заранее знаете, что Вы храните и перестраиваете по затронутым тэгам, а пока кеш не перестроен, отдаете старый контент.
Пример, кеширование запросов в БД через ORM. В большей части ORM есть модели, к модели можно привязать определенные префикс. Модель выполняет разнообразные запросы с различными параметрами и все отправляет в кэш со своим префиксом.
Когда наступает момент изменения данных в БД, касающихся определенной модели, мы точно не знаем, какие именно кеши эти данные затронули и сбрасываем кеши объединенные префиксом или тэгом. Многие системы позволяют искать по префиксу (главное, чтобы он был уникальный и не затрагивал лишних данных).
Но, к примеру Memcached не позволяет, поэтому я лично знаю костыль, когда дополнительно используется noSQL решение в добавок Memcached для хранения ключей по тегам.
Реализацию с БД привел только как абстрактный пример.
И вместо 1 производится инкремент по алфавиту. Т.е. если стоял символ 'b' после инкремента будет символ 'c', декремент (во время удаления) все делает наоборот.
Это не самое лучшее решение. У меня было другое, где значения отделялись знаком, к примеру запятой. Но оно было очень медленным.
Из Википедии
Вот код теста.
Вообще не вижу смысла использовать, даже если работает быстрее, т.к. тогда уже лучше использовать расширение фильтра Блума написанное на C. Но как дополнительный вариант можно добавить.
В общем, я проверю.
Тем более примеры потребления памяти в тексте приведены. Я просто не совсем понял, что конкретно имел в виду Igorbek
Количество хеш-функций определяется из 2-х условий: количества объектов в выборке и вероятности «ложноположительного» срабатывания. Mrrl прав. Число хеш-функций крайне мало по сравнению с количеством объектов. И основную память занимает как раз битовая строка.
Хеш функция приведена в тексте:
Поясните, чем плох дроп кеша, даже массовый (в пределах тега)?
Менять префиксы не самый лучший способ. Их необходимо где-то хранить. Также некоторые системы при перезаполнении пула, могут просто отказаться работать (старые версии APC, к примеру).
Другой вариант, это бэкграундое перестроение кеша. Когда Вы заранее знаете, что Вы храните и перестраиваете по затронутым тэгам, а пока кеш не перестроен, отдаете старый контент.
Пример, кеширование запросов в БД через ORM. В большей части ORM есть модели, к модели можно привязать определенные префикс. Модель выполняет разнообразные запросы с различными параметрами и все отправляет в кэш со своим префиксом.
Когда наступает момент изменения данных в БД, касающихся определенной модели, мы точно не знаем, какие именно кеши эти данные затронули и сбрасываем кеши объединенные префиксом или тэгом. Многие системы позволяют искать по префиксу (главное, чтобы он был уникальный и не затрагивал лишних данных).
Но, к примеру Memcached не позволяет, поэтому я лично знаю костыль, когда дополнительно используется noSQL решение в добавок Memcached для хранения ключей по тегам.
Реализацию с БД привел только как абстрактный пример.