Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
bf_* и md6_* в директорию с исходниками модуля и заинкудить заголовочные файлы bf_*.h.
$ gcc -shared -fPIC bf_*.c md6_*.c -o libbloom.so
$ cat > libtest.c
#include "bf_types.h"
#include "bf_ops.h"
#include <stdio.h>
void main() {
if (bf_create(1,1))
puts("OK");
}
<CTRL+D>
$ gcc -L. -o libtest libtest.c -lbloom
$ LD_LIBRARY_PATH=. ./libtest
OK
bf_create() и bf_destroy(), использующие общую память.Redis ограничивает длину битового поля в 512 мегабайт. Все реализации, которые я смог найти (1, 2) рассчитаны на использование только одного ключа Redis. Это ограничивает размер фильтра.
На данный момент эти библиотеки есть не для всех языков и платформ разработки.
Почему бы просто не запатчить redis с целью поддержки более длинных битовых полей?
1) В redis есть журнал операций — соотвественно если инстанс редиса прибить он восстановит из журнала все последние записи. В вашем случае могут потерятся записи за последние 300 секунд.По умолчанию в Redis-е AOF выключен, но да — функция стоящая. В моём случае реализовать её довольно просто, не нужно даже точно помнить позицию, откуда проигрывать — есть только одна операция и она идемпотентная. Меня сдерживает от реализации только тот факт, что при постоянном большом наплыве добавляемых элементов и длительной просадке дисковой производительности возникнет ситуация, что или будет разрастаться буфер записи бинлога, или придётся задерживать операции добавления. Так можно получить SIGKILL от OOM Killer-а в ситуации, когда в общем-то можно нормально работать.
2) В redis имеется репликация, если один инстанс ляжет — приложение может сходить в другой.Не так просто, чтобы записать в слэйв что-то, нужно сначала разорвать его репликацию с упавшим мастером.
Принимая это всё во внимание, можно надёжно организовать кластеризацию параллельной записью в сразу несколько фильтров.
$ cat > batch.txt GET /check?e=123 HTTP/1.1 Host: localhost GET /check?e=456 HTTP/1.1 Host: localhost $ nc 0 8889 < batch.txt HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Date: Wed, 06 Jul 2016 14:53:23 GMT Content-Length: 8 MISSING HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Date: Wed, 06 Jul 2016 14:53:23 GMT Content-Length: 8 MISSING
Фильтр Блума для веб-разработчиков