如何检查 IP 是否在给定的 IP 范围内?

How to check if an IP falls between a given ip ranges?

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

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

尝试了以下方法。

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

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

许多 Aerospike 用户都在使用这种数据建模模式。有效的方法是让你的 fromto 列 32 位整数格式的 ip 地址,以及 from 有共同的前 24 位。

例如:从:1.0.0.0 到:1.0.0.255 - 存储为 32 位整数。您使用其主键查找此记录,您将其设置为通用的 24 位值。即 1.0.0 作为 24 位整数。所以如果你想查找 1.0.0.21 ...你只需继续查找“1.0.0”主键中的数据。

在 Aerospike 上,这种读取可以达到 sub-millisecond 性能。

在您的情况下,您的范围不一致。因此,您有两个选择 - 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 < to,同样是您的 ip,from,to all 为 32 位 int 格式如果找到,这将 return 恰好返回一条记录。请参阅 https://www.aerospike.com/docs/guide/predicate.html 这将比我描述的第一种方法慢一点,但仍可能低于 5 毫秒 - 您将必须测试并查看。

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