Ответы пользователя по тегу Redis
  • Как одновременно запустить 1500 ботов, выполняющих http запросы?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если с PHP, то я бы делал это в Swoole: там и свои таблицы-в-памяти, и корутины, чтобы «сон» не тормозил остальных, — и вообще полезный опыт.

    P.S. не надо заниматься спамом, накрутками и прочим абьюзерством!
    Ответ написан
    2 комментария
  • Есть ли быстрое хранилище с возможностью подписаться на обновления?

    Redis Pub/Sub вполне подойдёт, наверное.
    Ответ написан
    Комментировать
  • Массовое сравнение сток, поиск пересечений, каким инструментом воспользоваться?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    примерно объёмы инфы:
    100к слов (по 10 символов) в «первом множестве» — это примерно 1Mb
    150к текстов по 50 слов по 10 символов в слове это 75Mb
    Т.е. всё весьма компактно.

    Искать наверное стоит программой, в оперативке.

    Сначала проиндексировать тексты. Составить словарь, где ключ – слово, значение – массив индексов текстов, где оно встречается.

    Затем искать среди ключей этого словаря слова из первого множества.

    Можно ещё сократить/ускорить, если работать не с самими словами, а только с целыми индексами. Любое слово класть в Set (где значения уникальны) и далее работать с индексом слова в этом наборе.
    Ответ написан
    2 комментария
  • Стоит ли использовать Redis как брокер сообщений?

    У Redis есть две возможности, имеющие отношение к «сообщениям»:
    1. Pub/Sub – паттерн «издатели/подписчики» – сообщение сразу же, как отправили, доставляется всем подписчикам
    2. Lists – списки – просто структура данных в памяти. В «хвост» добавляются новые задачу, рабочие разбирают задачи из «головы».


    Redis Pub/Sub – это доставка сообщений в (почти) реальном времени, но никак не очередь сообщений. Пропустили сообщение, не приняли, подписались позже — не в курсе того, что было. Laravel, разумеется, работает с Redis PubSub.

    Redis Lists можно использовать как хранилище для очередей задач – с командой блокирующего чтения (напр. BLPOP) это больше похоже на *.MessageQueue. См. очереди в Laravel. Команда Redis BLPOP – блокирующая, ждёт появления в списке нового элемента и эксклюзивно его выхватывает. Можно несколько «рабочих» процессов подвесить к одному Redis'у. Будут висеть и ждать появления задач. Кто-то из них получит очередную задачу и займётся её обработкой.
    Ответ написан
    4 комментария
  • Как измерить размер данных, находящихся в кеше Redis?

    Есть команда INFO memory — покажет сколько памяти занимает весь сервер со всеми данными.

    Ещё может помочь MEMORY USAGE key чтобы посмотреть, сколько памяти занимает конкретный ключ.
    Ответ написан
    Комментировать
  • Как организовать обработку больших объемов данных?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Несколько не связанных идей:
    1. хранить каждую «последовательность» (набор) из 500000 (не важно, сколько) чисел как картинку с 1-битным цветом, 3873*3873px, чтобы покрыть диапазон 0..15e6. Будет 15 млн. таких картинок. Черный пиксель - число, белый - нет числа. Картинки можно накладывать и смотреть, насколько потемнело ) Но в цифре это делать неэффективно, вот если бы аналогом..
    2. хранить последовательность как бинарную строку, где включённые биты означают выбранное число. 15e6 бит примерно 1875e3 байт =~1.9Mb на набор. 1875e3 * 15e6 = 28125e9 байт =~28Тб
    3. хранить как бинарный файл по 3 байта (24 бита) на число. 0–15 млн прекрасно уместятся: 224 = 16 777 216. См. php функции pack() / unpack(). Один набор 500000 * 3 = 1.5Мб, 15млн наборов 22.5Тб
    4. Не хранить всё. Полное покрытие диапазона 0..15 млн. идеально подобранными диапазонами по 500 тыс. потребует всего 30 таких диапазонов.
    5. Гипотеза. Если все выборки действительно случайны, можно брать любые N, они окажутся хуже «настоящего» максимума лишь незначительно.
    6. «Расчеты одной последовательности идут долго порядка 3-х минут» 180 секунд * 15e6 = 27e8 секунд, это почти 86 лет. А вы за несколько дней собирались как-то?

    Ответ написан
    1 комментарий
  • Как правильно создать бинарную строку в php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Я бы бил на байты, и работал с битами и отдельными символами:

    $ar = [0, 2, 3, 7, 8];
    
    $maxValue = max( $ar);
    if( $maxValue >= pow(2, 32)) {
    	return; // больше, чем влезет в один ключ в Redis
    }
    
    $maxBytes = ceil( $maxValue / 8);
    $bin = str_repeat( chr(0x0), $maxBytes);
    foreach($ar AS $bitNumber) {
    	$byteNumber = floor( $bitNumber / 8); // в каком символе строки этот бит окажется
    	$addon = 1 << ( 7 - $bitNumber % 8);  // каков этот бит в своем байте (Redis слева направо)
    	$byteChar = substr( $bin, $byteNumber, 1); // получаем этот символ из нашей строки
    	$byteChar = chr( $addon | ord( $byteChar)); // обновляем символ очередным битом
    	$bin = substr_replace( $bin, $byteChar, $byteNumber, 1); // вставляем обновленный символ в строку
    }
    // return $bin; // строка готова для Redis'а.
    
    // проверка
    for( $i=0; $i<strlen($bin); $i++) printf( "%08b", ord(substr($bin,$i,1)));
    echo PHP_EOL;
    Ответ написан
    Комментировать