Сканирование ключей со скриптом lua в узле - PullRequest
1 голос
/ 12 февраля 2020

Я пытался получить все ключи от Redis, используя сканирование, но также избегал использования счетчика. Проблема в том, что при большом количестве ключей (например, 1000000) сканирование SCAN 0 MATCH * выполняется намного медленнее, чем:

KEYS *

или

SCAN 0 MATCH * COUNT 1000000

Я прочитал статью говорят, чтобы использовать Lua для лучшей производительности. Кто-нибудь может мне помочь в этом вопросе? Я хочу использовать Lua для сканирования всех ключей, количество ключей которых превышает 1M. Я использую пакет redis npm.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Нашли родственное решение. Пожалуйста, go через эту ссылку . Использование ключей не рекомендуется, а также, если вы go просматриваете документацию, вы можете это увидеть. Хотя здесь дано представление, но это ради понимания более глубоких знаний, и ничего более. Лучше всего использовать Lua Script, который рекомендуется, а также производительность действительно хорошая. И если вы увидите комментарии, вы также узнаете о разнице, я думаю. Производительность для KEY, SCAN, Lua Сценарий:

  • KEYS: самый быстрый метод
  • SCAN: ~ в 1,5 раза медленнее
  • SCAN с lua : ~ В 2,4 раза медленнее
  • SCAN с lua и дополнительными проверками: ~ в 4,3 раза медленнее
  • КЛЮЧИ с lua: ~ в 18 раз медленнее

Для мне было довольно сложно понять синтаксис Lua. Итак, вот код, помогающий понять синтаксис.

Сканирование без счета в Lua Сценарий:

local ans, has, cursor = {}, {}, "0";
repeat
    local t = redis.call("SCAN", cursor, "MATCH", KEYS[1], "COUNT", 1000000000);
    local list = t[2];
    for i = 1, #list do
        local s = list[i];
        if has[s] == nil then has[s] = 1; ans[#ans + 1] = s; end;
    end;
    cursor = t[1];
until cursor == "0";
return #ans; --or return ans;
0 голосов
/ 12 февраля 2020

Использование SCAN с COUNT 1000000 будет несколько хуже, чем использование KEYS.

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

Значение по умолчанию равно 10. Это означает, что команда вернет более или менее 10 ключей, может быть меньше, если ключи редко заполнены в слотах ha sh или отфильтрованы по шаблону MATCH. Это может быть больше, если некоторые ключи имеют общий слот ha sh. В любом случае, выполненная работа пропорциональна параметру COUNT.

Это не означает, что команда KEYS (или SCAN с большим числом COUNT) запрещена. Если вы согласны с тем, что ваш сервер заблокирован на время, необходимое для запуска, go вперед.

См. Есть ли рекомендуемое значение COUNT для команды SCAN / HSCAN в REDIS? для получения дополнительной информации и примера Lua.

В Это можно объединить две отдельные БД (например, db0, db1), работающие в одном экземпляре Redis (6379), в одну отдельную БД (db0)? и Как мне получить все наборы в redis? Я опубликовал примеры того, как использовать SCAN в скрипте Lua для достижения пользовательских требований.

Вы можете найти Redi c `SCAN`: как сохранить баланс между новыми ключами что может совпасть и обеспечить конечный результат за разумное время? интересно.

Как использовать Lua в Redis с node.js: при выполнении команды redis eval для запуска сценария Lua в nodeJS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...