如何匹配最大数据的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"
有两件事我感到困惑
-
如何通过匹配开始和结束IP地址find给定IP地址的范围?
-
使用
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集合。