Ip2Region的Java本地实现

最近有个需求是将ip地址转换为对应的行政区划,存入数据库,在网上查阅相关资料,有ip2Region实现方案,记录下来,方便备查。

一、知识介绍

ip2region.xdb 即离线 IP 数据管理框架和定位库,免费。
数据格式:城市Id|国家|区域|省份|城市|ISP
数据文件xdb:在码云中可下载(data目录-ip2region.xdb
优点
1)官方称99.9%数据准确率,数据聚合自淘宝/纯真/GeoIP的开放API或者数, 只有中国的数据精确到了城市。
2)毫秒级响应,支持多种方式调用,可内网使用。
缺点
1)没有第三级县级的区划。
2)转换出来省有的是简称,如内蒙古,而非内蒙古自治区。
3)数据更新速度,db或xdb数据包形式,未对外提供自定义更新方案。

二、程序调用

第一步、引入依赖
本次使用的版本是 2.7.0

<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>2.7.0</version>
</dependency>

第二步、定义结果bean
定义结果bean对象,存放结果集,即IpRegionCommon

@Data
public class IpRegionCommon {
    
    
	/**
	 * 国家
	 */
	private String country;
	/**
	 * 地区
	 */
	private String region;
	/**
	 * 省
	 */
	private String province;
	/**
	 * 市
	 */
	private String city;
	/**
	 * 运营商
	 */
	private String isp;
}

第三步、测试调用
简单的读取文件,主要分为三步
1)创建 searcher 对象
2)调用方法查询
3)关闭资源
单元测试的代码如下所示,仅供参考。

@Test
public void testIp2Region() {
    
    
	// 数据文件路径
	String dbPath = "/home/admin/ip2region.xdb";
	// 1、创建 searcher 对象
	Searcher searcher = null;
	try {
    
    
		searcher = Searcher.newWithFileOnly(dbPath);
	} catch (IOException e) {
    
    
		System.out.printf("创建对象失败,错误信息为: %s\n", e);
		return;
	}

	// 2、调用方法查询
	try {
    
    
		String ip = "183.247.152.98";
		long sTime = System.nanoTime();
		String region = searcher.search(ip);
		long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
		System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
		System.out.printf("{region: %s}\n", JsonUtils.parseObject(this.getReginResult(region)));
	} catch (Exception e) {
    
    
		System.out.printf("调用程序出错,错误信息为: %s\n", e);
	}

	// 3、关闭资源
	try {
    
    
		searcher.close();
	} catch (IOException e) {
    
    
		e.printStackTrace();
	}
}

/**
 * 功能:转换结果
 * @param region
 * @return
 */
public IpRegionCommon getReginResult(String region) {
    
    
	IpRegionCommon info = new IpRegionCommon();
	// 国家|区域|省份|城市|ISP
	String[] split = StringUtils.split(region, "|");
	info.setCountry(split[0]);
	info.setRegion(split[1]);
	info.setProvince(split[2]);
	info.setCity(split[3]);
	info.setIsp(split[4]);
	return info;
}

执行结果,如下图所示。

在这里插入图片描述
在参考文档 gitee 中提供三种实现方式,写的很好,推荐!
1)完全基于文件的查询
2)缓存 VectorIndex 索引
3)缓存整个 xdb 数据

纯真IP数据库

优点:
免费、更新频率较高,国内IP地址准确率较高,可以解压出数据。
缺点:
数据没有按省市区拆分,
软件运行界面如下图所示。
在这里插入图片描述

参考文档

【1】https://gitee.com/lionsoul/ip2region/tree/master/binding/java

猜你喜欢

转载自blog.csdn.net/u012190388/article/details/129265051