看到很多网站提供IP地址查询的服务,当时就想如此庞大的IP数据库,如何做才能做到适合互联网的高并发呢?
后来在网上突然发现了有些网友发布的全球IP数据库包,下下来也不大,文本文件有10多M,大约有36W+数据,然后看了看文件的格式,就想把他导入数据库看看,然后利用数据库简单的查了查我们所在地的IP地址信息是否准确,效率还挺高,0.00s就出结果了,然后我就用随机生成ip地址的方式进行测试,发现每秒也就查询200~500次,这个时候MySQL符合已经很重。这样肯定不行啊,对于大量的互联网请求根本无法满足,如果是集群对于这种小的程序又没有必要。
然后就又想到了文件,然后利用找到的原始文件,然后对里面的格式进行了调整,准备使用Java的RandomAccessFile对文件直接查找,由于IP地址信息是按照顺序进行排序的,所以我把所有的ip转换成了int类型,然后利用二分法进行查找
public String search(String ip) {
RandomAccessFile raf = new RandomAccessFile("E:/aa/city/ips.txt", "r");
long seek = IPConvert.IP2Long(ip);
int index = 0;
int start = 0;
int end = 25133;
String address = null;
IpA ipa;
while (true) {
try {
index = start + ((end - start) / 2);
raf.position(index * 56);
ipa = new IpA();
ipa.setFromip(readFromip(mbb));
ipa.setToip(readToip(mbb));
if (ipa.getFromip() <= seek && ipa.getToip() >= seek) {
address = readAddress(mbb);
break;
} else if (ipa.getFromip() > seek && start != index) {
end = index;
} else if (ipa.getToip() < seek) {
start = index + 1;
if(start >= 25133) {
address = "不存在该ip地址";
break;
}
} else {
address = "不存在该ip地址";
break;
}
} catch (IOException ex) {
Logger.getLogger(FileDB.class.getName()).log(Level.SEVERE, null, ex);
}
}
return address;
}
这样利用随机生成的ip地址串进行测试,发现速度有了明细的提升,查询的次数可以达到2000+,其实这个时候自己还是挺高兴的,毕竟发现速度提升了很多,但是后来在网上发现,有人利用C语言写的查找IP地址的算法,每秒的查询次数可以达到10000+,当时心里一下就感觉到,跟他们的差距这么大,人家用一台计算机完成的工作,我至少要用5台。。
所以我只能在去寻找更好的办法,如果再想提升性能,现在已经使用二分法了,已经基本上是最快的搜索算法,肯定不能通过这个突破了,然后就想到了内存,将数据放到内存中,岂不可以极大的提高查询的速度。而且IP数据库的数据量也不是太大,最多10M+,那也占用不了多少内存,然后我就尝试着将这个ip的文本文件映射到内存中,使用的同样是二分法查找,这一次,在我用随机生成的ip地址测试时,竟然达到了10W+,哈哈,终于达到他们的水平,也说明java的性能也不必C差多少啊,完全可以满足我们的需求了,java好东西啊。。。当然他们那时候用的计算机性能可能没有我的性能好,但是这样的结果我已经比较满意了,起码可以和他们的相当了。
当然我的IP文件还有一些可以优化的地方,但是到这里可以先告一段落了,优化无止境。。。。。。
结束!
分享到:
相关推荐
Java ip 地址排序Java ip 地址排序Java ip 地址排序Java ip 地址排序
本篇文章将分享一个利用Java实现根据IP地址获取地理位置的简单示例,主要使用了QQ在线接口,同时提到了其他如新浪、淘宝等提供的接口作为替代选项。 首先,我们来看一下核心的Java代码。这段代码定义了一个`...
在Java编程环境中,实现IPv6地址查询涉及到网络编程和数据库操作。IPv6是互联网协议的第六版,相较于IPv4提供了更大的地址空间,以应对互联网设备数量的急剧增长。本项目利用ZX公网IPv6库(版本20120916)来执行IPv6...
在Java编程中,获取IP地址是...总之,`IpUtils`是一个方便的Java工具类,它简化了IP地址的处理,使得开发者可以更专注于业务逻辑而不是网络底层的细节。通过深入学习和使用这个类,可以提高我们处理IP相关问题的效率。
根据给定的文件信息,我们可以总结出以下关于“IP查询归属地”以及使用Java进行IP地址查询的关键知识点: ### IP地址基础知识 IP地址是互联网协议(Internet Protocol)地址的简称,用于唯一标识网络上的设备。它由...
在实际应用中,开发者可以通过编程语言(如Python、Java等)读取这个CSV文件,根据IP地址查询相应的国家信息。这在网站统计、广告定向、内容过滤等领域都有广泛应用。同时,由于是轻量级版本,可能只包含部分国家或...
通过IP地址查询所在省市,基于qqwry.dat(可通过百度下载最新qqwry.dat文件来更新)。 代码已经简化过,直接调用静态方法即可返回地区信息(传入IP为参数)。 使用时只需要把唯一工具类:IpLocationTool.java(无...
本项目名为“IP地址管理器”,采用Java语言进行实现,主要关注于IP地址的过滤、开通和关闭功能。这涉及到网络编程、数据结构、多线程以及可能的数据库操作等多个知识点。 首先,我们需要理解IP地址的基本概念。IP...
在Java语言中,可以使用各种算法和技巧来实现IP地址网段计算。下面是一个示例代码,展示了如何使用Java语言计算IP地址网段。 知识点1:IP地址网段计算的基本概念 IP地址网段计算的基本概念是使用子网掩码来计算出...
总结起来,"纯JAVA实现修改本地IP(swing界面版)"项目涉及到了Java编程、Swing GUI设计、IP地址处理、文件I/O、事件处理、多线程以及错误处理等多个核心知识点。通过这个项目,开发者不仅可以提升Java编程技能,也能...
标题中的“根据IP地址获取经纬度”是指在Java编程环境下,通过特定的库或API来实现从IP地址解析出地理位置的经纬度坐标。这通常涉及到网络编程和地理信息系统(GIS)的技术。描述中提到的Java工程是实现这个功能的一...
### Java获取IP地址知识点解析 在本篇文章中,我们将深入探讨如何使用Java语言来获取IP地址。这是一项在网络编程中非常基础且重要的技能,能够帮助开发者了解客户端或服务器的网络位置信息。以下是对给定文件中的...
总结来说,Java中根据IP获取国家和地区名称涉及的技术点包括:使用`InetAddress`处理IP地址、理解IP地址库的结构和查询机制、以及选择和使用合适的第三方库或服务进行IP定位。在实际应用中,应确保IP库的及时更新,...
根据Ip地址获取归属地,需要用到ip库,我这里用到的是QQWry.dat
简易java查询IP归属地示例代码。 面向中国大陆地区的 手机号码、电话号码、IP地址 归属地查询库。 IP地址库来源于 [ip2region](http://git.oschina.net/lionsoul/ip2region)。 手机号码段和电话号码区号信息来源于 ...
在Java编程语言中,获取IP地址是一项常见的任务,特别是在网络编程和服务器开发中。这个程序虽然界面简单,但核心功能强大,它能够帮助开发者获取指定域名对应的IP地址。以下是关于这个话题的一些详细知识点: 1. *...
在IT行业中,网络编程是不可或缺的一部分,而与之相关的任务之一就是识别和处理IP地址。在Java编程中,我们有时需要获取一个IP地址所对应的具体地理位置,例如省份、城市等信息。这通常需要借助特定的IP数据库,如...
这些数据库提供了高效且准确的IP地址到地理位置的映射,使得开发者能够在不依赖在线服务的情况下进行IP地址解析。 首先,GeoIP2是由MaxMind公司提供的一个强大的IP位置数据库。它包含了全球范围内的IPv4和IPv6地址...
实现IP反查地址的功能,通常会依赖于IP库或服务,如MaxMind的GeoIP数据库。GeoIP数据库包含了全球IP地址与地理位置的映射关系,包括国家、地区、城市等信息。在Java中,我们可以使用开源库如`geoip-api-java`来访问...
在Java中进行IP地址匹配与验证,既可以通过编写复杂的正则表达式实现精确的模式匹配,也可以利用内置的`java.net.InetAddress`类进行更为简洁高效的处理。选择哪种方式取决于具体的应用场景和个人偏好。无论采用何种...