Как проверить, находится ли IP между заданными диапазонами IP - PullRequest
3 голосов
/ 10 июля 2019

У меня 40 диапазонов IP-адресов, как показано на рисунке ниже, необходимо найти сведения об IP-адресах с этими диапазонами IP-адресов.

Check IP's Image here

Как эффективно это сделать в течение 5 мс.Какую БД необходимо использовать для хранения данных и запросов?

Попробовал следующими способами.

  1. Я пробовал использовать следующее решение, но оно будет эффективно сМассив в памяти, мне нужно найти 40 недостающих строк, поэтому он не будет эффективным.

  2. Также пробовал с MongoDB, Хранил все 40 недостающих строк в коллекции mongo, использовал запросы $gte и $lte.Но это время отклика составляет более 150 мс с локальным сервером Монго.Для меня время отклика должно быть меньше 5 мс.

1 Ответ

3 голосов
/ 10 июля 2019

Эта модель моделирования данных используется многими пользователями Aerospike. Эффективный способ сделать это состоит в том, чтобы иметь ваши от и до столбцов IP-адресов в 32-битном целочисленном формате и от и до имеют общие первые 24 бита.

например: от: 1.0.0.0 до: 1.0.0.255 - сохранить как 32-битные целые. Вы просматриваете эту запись с ее первичным ключом, который вы установите в качестве общего 24-битного значения. то есть 1.0.0 как 24-битное целое число. Так что, если вы хотите посмотреть 1.0.0.21 ... вы просто ищите данные в первичном ключе "1.0.0".

В Aerospike такое чтение может производиться с точностью до миллисекунды.

В вашем случае ваши диапазоны не соответствуют. Итак, у вас есть два варианта - 1 - воссоздать ваши данные в 24-битном общем формате, как я упоминал выше, это приведет к тому, что некоторые строки станут множественными, но поиск будет очень быстрым. Например, от: 1.0.0.0 до: 1.0.1.255 будут разделены с теми же остатками данных на 1.0.0.0 - 1.0.0.255 и 1.0.1.0 - 1.0.1.255. Это означает большее общее количество записей, что не является проблемой для Aerospike - вы можете легко хранить миллиарды записей, не влияя на задержку чтения отдельных записей.

Или вы можете использовать вторичный индексный запрос для "from" - вашего ip> from и добавить выражение фильтра предикатов, где ваш ip равен https://www.aerospike.com/docs/guide/predicate.html Это будет немного медленнее, чем первый метод, который я описал, но все равно может быть менее 5 мсек - вам придется проверить и посмотреть.

...