如何检查一个IP地址是否在给定的IP地址范围内?

3
我有40个IP范围,就像下面的图片一样,需要找到与这些IP范围相关的IP详细信息。

Check IP's Image here

如何在5毫秒内高效完成。需要使用哪个数据库来存储和查询数据?
尝试了以下几种方法:
1. 我已经尝试了以下解决方案,但它只适用于内存数组,我需要在40万行中查找,所以它不够高效。 - 如何使用node js检查给定IP是否落在给定IP范围内 2. 还尝试了MongoDB,将所有40万行存储在mongo集合中,使用$gte和$lte查询。但是本地mongo服务器的响应时间超过150ms。对我而言,响应时间应该小于5ms。

IP字段是否被索引?gte,lte应该相对较快吗?在游标上使用explain()来查看Mongo决定做什么。 - Plancke
Yahh,IP字段已经被索引了。我已经添加了两个字段start和end到集合中,这两个字段是上面图片中from和to的复制品。但是startend保存了根据上述方案1转换为整数的IP字符串fromto。并且使用这些start和end,我们可以使用$lte和$gte进行查询。 - Sudhakar Reddy Kamireddy
1个回答

4
这种数据建模方式被许多Aerospike用户使用。有效的方法是将您的fromto列的IP地址以32位整数格式存储,并且fromto有相同的前24位。例如:from: 1.0.0.0 to: 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 < to,再次您的IP,from,to都以32位int格式呈现,如果找到,则返回正好一个记录。请参见https://www.aerospike.com/docs/guide/predicate.html。这将比我描述的第一种方法慢一点,但仍然可以在5毫秒以下 - 您需要测试并查看。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接