如何匹配最大数据的IP地址?

我正在处理分析,为了find我使用maximind数据的用户的位置。

目前我正在使用kuno使用ip地址获取位置信息。

例如:

input是ip地址(1.0.0.0)

产量是位置(澳大利亚)

问题

kuno使用.dat.csv文件使用ip获取位置。 我的应用程序应该假设处理1000请求/秒。 每个请求应该获取位置信息,所以打开.dat.csv文件1000次抛出错误,性能有些不足。

所以我决定将数据(csv)文件移植到redis数据库。

以下是CSV文件的格式:

 Start ip, End ip, Location "1.0.0.0","1.0.0.255","Australia" "1.0.1.0","1.0.3.255","China" "1.0.4.0","1.0.7.255","Australia" "1.0.8.0","1.0.15.255","China" "1.0.16.0","1.0.31.255","Japan" "1.0.32.0","1.0.63.255","China" 

有两件事我感到困惑

  1. 如何通过匹配开始和结束IP地址find给定IP地址的范围?

  2. 使用redis db来达到这个目的是很好的方法吗?

任何帮助或build议是伟大的。

如果混淆,我已经准备好解释了

使用Redis这是一个好主意。

假设您只处理IPV4地址,则可以使用IP地址的三个第一部分。 在寻找国家时,看起来最后一部分并不重要。

我想你可以将所有的数据存储在一个独特的redissorting集中。 价值将是国家的名字。 并将得分结束IP地址转换为十进制。

举例来说:

 "1.0.0.0","1.0.0.255","Australia" 1.0.0 ==> score = 1x256x256 + 0 x 256 + 0, gives you a score of 65536 for Australia 

在名为“countries”的Redissorting集中注册此项:

 ZADD countries 65536 "Australia@65536" 

Nb:我将分数与国家名称连接起来,以确保存储的值是唯一的。 它将允许为每个国家注册多个IP范围。

 1.0.1 ==> score = 1x256x256 + 0 x 256 + 1, ie score = 65537 for China ZADD countries 65537 "China@65537" 

澳大利亚1.0.7 ==>分数= 65543

1.0.15 ==>得分= 65551中国

等等…

当你想检查给定的IP地址,应用相同的algorithm。 例如,如果你想find1.0.5.23的国家,你计算得分

 1x65536 + 0x256 + 5 = 65541 

现在你向Redis发出一个请求:

 ZRANGEBYSCORE countries 65541 +inf LIMIT 0 1 

它会返回给你第一个值,分数至less等于65541.这是国家的名字(当然,你将不得不放弃返回的string的最后一部分)。

search的性能取决于sorting集中的项目数量。 如果N是这个数字,search的时间复杂度将是O(Log(N))。

我不知道你的集合中的项目数量(即IP范围的数量),但是如果你有任何性能问题,你可以将数据拆分成多个有序集合。

使用IP地址的第一部分作为sorting设置键的一部分(国家:1将IP地址的数据从1.0.0.0存储到1.255.255.255,国家:2将IP地址的数据从2.0.0.0存储到2.255 .255.255等)。

然后使用与上面相同的原理,但是从结束IP地址的第二部分和第三部分计算得分,并查看与第一部分对应的已sorting集合。