【问题标题】:How to check if an IP falls between a given ip ranges?如何检查 IP 是否在给定的 IP 范围之间?
【发布时间】:2019-07-10 07:54:28
【问题描述】:

我有 40 个缺少如下图所示的 IP 范围,需要查找具有该 IP 范围的 IP 详细信息。

如何在 5ms 时间内高效完成。需要使用哪个数据库来存储数据和查询?

尝试了以下方法。

  1. 我已经尝试过以下解决方案,但它对内存中的数组会很有效,我需要在 40 行中找到缺失的行,所以它不会很有效。

  2. 还尝试使用 MongoDB,在 mongo 集合中存储了所有 40 个缺少的行,使用了 $gte$lte 查询。但是本地 mongo 服务器的响应时间超过 150 毫秒。对我来说,响应时间应该小于 5ms。

【问题讨论】:

  • IP 字段是否已编入索引? gte,lte应该比较快?在光标上使用 explain() 来查看 mongo 决定做什么。
  • 是的,IP 字段已编入索引。我添加了更多字段 start 和 end 来收集,这两个字段是上图 from 和 to from 的副本。但是startend 保存IP 字符串fromto 转换后的整数,按照上述第1 点解决方案。并使用这些 start 和 end 两个使用 $lte 和 $gte 进行查询。

标签: node.js database mongodb aerospike flash-memory


【解决方案1】:

许多 Aerospike 用户都在使用这种数据建模模式。有效的方法是让你的 fromto 列 IP 地址为 32 位整数格式,以及 fromto 有共同的前 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 毫秒 - 您必须测试并查看。

11/21/19 更新 - 还有另一种可能更简单的方法。使用 to 字段作为 32 位整数作为记录的主键。创建另一条记录,内存命名空间,作为所有“to”条目的排序列表 - 在您的情况下为 400,000 - 这将适合一条记录。使用 LIST 类型,相对索引按值搜索并返回相对索引 0,这将返回正确的 to 值,这也是您的主键。然后,您可以使用它检索整个记录。两次读取,应该在 5ms 以内。

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 2017-05-28
    • 2011-01-09
    • 2014-09-16
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多