- 浏览: 205387 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
kvchoi:
归纳的很好。
全方位的技术服务及相关技术解决方案(纯java解决方案) -
allen.lei:
服务器端如果要向某个客户端发送消息是否是需要服务端通过一个Ma ...
纯Java的高性能长连接RPC解决方案 -
ayanami001:
请问分布式事务是如何处理的
纯Java的高性能长连接RPC解决方案 -
lalahei:
前来膜拜。。
Summercool-Web框架简介 (二) -
尹鹏波:
背景是透明的gif 处理之后背景就变黑色了是什么情况?
gif图片压缩(纯java实现,不依赖第三方类库)
我的官方微博:www.weibo.com/vanwelldotcn
我的官方扣群:102934900
笔者现在主要从事移动互联网相关的一些架构工作,并且负责现在公司内部的平台架构的搭建,那么做移动互联网就一定会涉及到移动终端的IP访问记录,并跟据IP进行定向的广告投放。
比如现在通地IP可以直接获取IP所对应的省份,那么数据结构应该如下:
IP | 省份
上面只是笔者模拟的一个表结构,那么具体的IP对应省份,是对终端客户登录时后台DB保存的记录;但是服务器端的IP库,肯定是如下的一个IP段结构
IP开始段 | IP结束段 | 省份
笔者通过H2内存数据库加载了上面的IP库,然后进行了压力测试;结果发现,在压力大的情况下性格会下降的非常厉害,其实笔记收集到的IP库大小只有40多W行数据而已,50M的数据量。
在这种情况下,笔者就通过另一种方法实现了IP库段的查询,性能达到了20W+TPS,只是在奔腾双核的机器下面的测试结果,思路如下:
1.通过TreeMap实现
2.以IP库的起始段为key(IP库的IP地址转化成long型)
3.取出比目标IP小,离的最近的IP对应[key值]
4.然后将查找到的value值和目标IP值进行范围比较
5.符合则对应此IP段,不符合则未查找到IP库对应的范围地址
RangeRow.java
public class RangeRow<T extends Comparable, V> implements Serializable { private static final long serialVersionUID = -289623726849550889L; private T begin; private T end; private V value; private Object attachment; public T getBegin() { return begin; } public void setBegin(T begin) { this.begin = begin; } public T getEnd() { return end; } public void setEnd(T end) { this.end = end; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } public Object getAttachment() { return attachment; } public void setAttachment(Object attachment) { this.attachment = attachment; } }
IpProvinceRow.java
public class IpProvinceRow extends RangeRow<Long, String> { private static final long serialVersionUID = 8411106544005822554L; private String city; public String getCity() { return city; } public void setCity(String city) { this.city = city; } }
RangeSearchEngine.java
public class RangeSearchEngine<T extends Comparable, V> { private TreeMap<T, RangeRow<T, V>> cache = new TreeMap<T, RangeRow<T, V>>(); @SuppressWarnings("unchecked") public V getValue(T key) { // RangeRow<T, V> row = getRow(key); if (row == null) { return null; } // T end = row.getEnd(); if (end == null) { return null; } if (end.compareTo(key) > 0) { return row.getValue(); } return null; } public RangeRow<T, V> getRow(T key) { if (key == null) { return null; } // Entry<T, RangeRow<T, V>> entry = cache.floorEntry(key); if (entry == null || entry.getValue() == null) { return null; } // return entry.getValue(); } public void putAll(Map<T, RangeRow<T, V>> map) { cache.putAll(map); } public RangeRow<T, V> put(RangeRow<T, V> row) { return cache.put(row.getBegin(), row); } public RangeRow<T, V> remove(T key) { return cache.remove(key); } public void clear() { cache.clear(); } public TreeMap<T, RangeRow<T, V>> getCache() { return cache; } public TreeMap<T, RangeRow<T, V>> setCache(TreeMap<T, RangeRow<T, V>> newCache) { if (newCache == null) { throw new NullPointerException(); } // TreeMap<T, RangeRow<T, V>> before = cache; cache = newCache; // return before; } }
IpProvinceSearchEngine.java
public class IpProvinceSearchEngine extends RangeSearchEngine<Long, String> { public static final String SPLITER = "\\|"; // private Logger logger = LoggerFactory.getLogger(getClass()); /** * @Title: load * @Description: 载入Ip库文件 * @author Administrator * @param dataFile * @throws FileNotFoundException * @throws IOException * @return void 返回类型 */ public void load(String dataFile) throws FileNotFoundException, IOException { TreeMap<Long, RangeRow<Long, String>> map = new TreeMap<Long, RangeRow<Long, String>>(); BufferedReader file = new BufferedReader(new FileReader(dataFile)); try { // String content = null; while ((content = file.readLine()) != null) { String[] parts = content.split(SPLITER); if (parts.length < 3) { logger.warn("parse line failed, " + content); continue; } // try { IpProvinceRow row = new IpProvinceRow(); row.setBegin(Long.valueOf(parts[0])); row.setEnd(Long.valueOf(parts[1])); row.setValue(parts[2]); // if (parts.length > 3) { row.setCity(parts[3]); } // map.put(row.getBegin(), row); } catch (Exception e) { logger.warn("parse row failed:" + content); } } // setCache(map); } finally { try { file.close(); } catch (IOException e) { } } } /** * @Title: getProvince * @Description: 获取省份信息 * @author Administrator * @param @param ip * @param @return 设定文件 * @return String 返回类型 */ public String getProvince(String ip) { // long intIp = convertIpToLong(ip); // return getValue(intIp); } /** * @Title: convertIpToLong * @Description: 转换Ip为256进制整数 * @author Kolor * @param ip * @return long */ public static long convertIpToLong(String ip) { String[] checkIp = ip.split("\\.", 4); long intIp = 0; for (int i = 3, j = 0; i >= 0 && j <= 3; i--, j++) { intIp += Integer.parseInt(checkIp[j]) * Math.pow(256, i); } return intIp; } public static void main(String[] args) throws FileNotFoundException, IOException { String file = "C:\\Users\\Administrator.PC-20110801LBXQ\\Desktop\\ip\\ip.data"; IpProvinceSearchEngine engine = new IpProvinceSearchEngine(); // long beginTime = System.currentTimeMillis(); engine.load(file); long endTime = System.currentTimeMillis(); System.out.println("load cost " + (endTime - beginTime)); // System.out.println(engine.getProvince("202.101.15.61")); } }
附件中是已经收集好的IP库,不能保证最全,但是已经比较全了。:)
希望大家喜欢这个工具类,比较实用;且性能较高,希望有同样数据段查找的数量有限的需求也可以采用类似的方案。
- ip_data.zip (2.4 MB)
- 下载次数: 802
评论
2 楼
dragonsoar
2013-02-05
Sunny_kaka 写道
不知道有没有比较好和稳定的查询ip和对应省份关系的web service服务?
有了这个就不和web service了吧?这个多快啊,web service要走网络很慢的了吧
1 楼
Sunny_kaka
2013-02-04
不知道有没有比较好和稳定的查询ip和对应省份关系的web service服务?
发表评论
-
对导购平台的应用架构的猜想
2013-03-12 12:43 2376一、导购应用架构如下图: 1. 导购一共分成前端和后台两个 ... -
summercool-ddl框架简介 (二)
2013-01-13 21:57 7286简介:轻量封装Ibatis3 因为本 ... -
全方位的技术服务及相关技术解决方案(纯java解决方案)
2013-01-07 11:05 53031.技术产品及应用产品体系架构图 2.成熟的高性能We ... -
mysql一个表存多少数据才是性能最高的
2012-11-28 16:43 11062我的官方微博:www.weibo.com/vanwell ... -
Summercool-Web框架简介 (九)
2012-11-14 14:41 2272简介:轻量封装Spring MVC ... -
gif图片压缩(纯java实现,不依赖第三方类库)
2012-07-13 02:02 17718笔者之前一直是在做电子商务系统的架构工作 ... -
Summercool-Web框架简介 (八)
2012-03-30 20:36 5240简介:轻量封装Spring MVC ... -
Summercool-Web框架简介 (七)
2012-03-26 23:08 2818简介:轻量封装Spring MVC ... -
Summercool-Web框架简介 (六)
2012-03-26 18:11 4286简介:轻量封装Spring MVC ... -
Summercool-Web框架简介 (五)
2012-03-22 21:13 5348简介:轻量封装Spring MVC ... -
Summercool-Web框架简介 (四)
2012-03-22 14:16 3819简介:轻量封装Spring MVC ... -
Summercool-Web框架简介 (三)
2012-03-15 11:24 2890简介:轻量封装Spring MVC ... -
Summercool-Web框架简介 (二)
2012-03-08 16:20 3880简介:轻量封装Spring MVC ... -
Summercool-Web框架简介 (一)
2012-03-08 12:53 10726简介:轻量封装Spri ... -
java打印问题!(请教)
2006-09-20 13:59 7303请问一下! 我们公司现在有这样的需求,就是自动打印excel ...
相关推荐
java根据ip获取国家、地区名称,附带ip库 java根据ip获取国家、地区名称,附带ip库
标题中的“ip查询库java版(含IP地址库)”指的是一个Java实现的IP查询库,它包含了一个IP地址数据库,可以用于根据输入的IP地址获取对应国家、地区和详细地址等信息。这样的库在Web应用、网络安全分析或者网络日志...
在Java编程中,根据IP地址获取国家和地区名称是一项常见的需求,尤其在数据分析、网络监控或者用户定位等场景中。...在实际应用中,应确保IP库的及时更新,以及处理可能出现的查询失败和异常情况。
本文将围绕“Java常用IP匹配”这一主题,深入探讨IP地址的基本概念、正则表达式在IP匹配中的应用,以及如何利用Java内置库进行IP地址的验证与解析。 ### IP地址基础 IP地址(Internet Protocol Address)是互联网...
Java 实现 IP 数据包分析是一项涉及网络编程与协议解析的技术工作。在 Java 中,我们可以使用 `java.net` 包中的 Socket 和 Datagram 类来处理网络通信,但这些类并不直接支持 IP 层的数据包操作。因此,要进行 IP ...
总结起来,"纯JAVA实现修改本地IP(swing界面版)"项目涉及到了Java编程、Swing GUI设计、IP地址处理、文件I/O、事件处理、多线程以及错误处理等多个核心知识点。通过这个项目,开发者不仅可以提升Java编程技能,也能...
在Java编程环境中,读取纯真IP地址数据库是一项常见的任务,尤其对于需要进行IP定位或者网络管理的应用来说。纯真IP数据库(通常称为QQWRY或IPSeeker)是一个包含了全球IP地址及其对应地理位置信息的数据库,它由一...
本主题聚焦于如何利用Java编程语言结合QQ纯真IP库来获取用户地址。QQ纯真IP库是一个广泛使用的IP数据库,它包含了大量IP地址与其对应的地理位置信息,主要由腾讯公司维护和更新,确保数据的准确性和时效性。 首先,...
本篇文章将分享一个利用Java实现根据IP地址获取地理位置的简单示例,主要使用了QQ在线接口,同时提到了其他如新浪、淘宝等提供的接口作为替代选项。 首先,我们来看一下核心的Java代码。这段代码定义了一个`...
本资源提供了一个基于Java实现的工具类,用于全球范围内的IP信息查询,并且包含了一个IP库文件,用于存储大量的IP地址及其对应的信息。下面我们将详细探讨这个工具类的可能实现、IP库的结构以及如何进行测试。 首先...
本项目名为“IP地址管理器”,采用Java语言进行实现,主要关注于IP地址的过滤、开通和关闭功能。这涉及到网络编程、数据结构、多线程以及可能的数据库操作等多个知识点。 首先,我们需要理解IP地址的基本概念。IP...
本主题聚焦于使用Java语言解析“纯真IP库”来获取对应的中文省市及运营商信息,这是一种常见的网络数据处理任务。截至2014年10月,这个IP库包含了当时的最新数据。 “纯真IP库”是一个包含全球IP地址信息的数据库,...
实现IP反查地址的功能,通常会依赖于IP库或服务,如MaxMind的GeoIP数据库。GeoIP数据库包含了全球IP地址与地理位置的映射关系,包括国家、地区、城市等信息。在Java中,我们可以使用开源库如`geoip-api-java`来访问...
本文将深入探讨如何利用Java编程语言实现对IP和TCP协议数据包的拦截与分析,以便获取IP地址的详细信息。 首先,我们需要理解IP(Internet Protocol)和TCP(Transmission Control Protocol)的基本概念。IP协议负责...
在这种背景下,Java开发者可能需要处理“动态换IP限制 IP频繁限制”的问题。本文将深入探讨如何在Java环境中应对这类限制,以确保合法的爬虫或者服务请求能够正常进行。 首先,我们需要理解IP限制的工作原理。通常...
在Java编程中,判断一个IP地址是内网IP(私有IP)还是公网IP(全局IP)是一项常见的任务,尤其在网络编程和服务器配置中。内网IP通常用于局域网内部通信,而公网IP则是互联网上的唯一标识。下面将详细探讨如何实现这...
在Java编程中,我们有时需要获取一个IP地址所对应的具体地理位置,例如省份、城市等信息。这通常需要借助特定的IP数据库,如“纯真IP数据库”(QQWry.Dat),它包含了大量IP地址及其地理位置的映射关系。本文将详细...
为了实现这一功能,开发者通常会利用IP数据库,如QQwry IP库,它包含了全球IP地址与地理位置的对应关系。本文将深入探讨如何使用Java结合QQwry IP库来获取IP地址的详细地理信息。 首先,我们需要了解IP地址的基本...