Ip2Region的Java本地实现

news2025/1/18 7:29:13

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

一、知识介绍

ip2region.xdb 即离线 IP 数据管理框架和定位库,免费。
数据格式:城市Id|国家|区域|省份|城市|ISP
特点
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 = "1.202.176.226";
		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 数据

参考文档

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

北极星指标体系

北极星指标体系 每个产品都有很多指标,每个指标都反映了对应业务的经营情况。但是在实际业务经营中,却要求我们在不同的产品阶段寻找到合适的指标,让这个指标可以代表当前产品阶段的方向和目标,让这个指标不仅对业务经营团队,而且对产品的用户、对产品的价值都能有很好的…

多智能体集群协同控制笔记(1):线性无领航多智能体系统的一致性

对于连续时间高阶线性多智能体系统的状态方程为&#xff1a; x˙i(t)Axi(t)Bui(t),i1,2..N\dot {\mathbf{x}}_i(t)A\mathbf{x}_i(t)B\mathbf{u}_i(t),i1,2..N x˙i​(t)Axi​(t)Bui​(t),i1,2..N 下标iii代表第iii个智能体&#xff0c;ui(t)∈Rq1\mathbf{u}_i(t)\in R^{q \time…

【vulhub漏洞复现】Thinkphp 2.x 任意代码执行

一、漏洞详情影响版本 thinkphp 2.x但是由于thinkphp 3.0版本在Lite模式下没有修复该漏洞&#xff0c;所以也存在该漏洞漏洞原因&#xff1a;e 和 /e模式匹配路由&#xff1a;e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; /e 可执行模式&#xff0c…

vue入门

一、准备 本文是基于HBuilderX工具来讲解的。 1、工具 HBuilderX 2、 二、介绍 Vue是一个做网页的框架。 一个网页都是由多个模块&#xff08;组件&#xff09;拼成的。而Vue的组件化技术正式应用了这个思想。 三、创建项目 使用HBuilderX 创建项目。 1、创建空白项目…

【联机对战】微信小程序联机游戏开发流程详解

现有一个微信小程序叫中国象棋项目&#xff0c;棋盘类的单机游戏看着有缺少了什么&#xff0c;现在给补上了&#xff0c;加个联机对战的功能&#xff0c;增加了可玩性&#xff0c;对新手来说&#xff0c;实现联机游戏还是有难度的&#xff0c;那要怎么实现的呢&#xff0c;接下…

MySQL表的增删查改(基础)

gitee:博客中的所有操作整合新增语法:insert [into] table_name values(value_list)[案例] 创建一个学生表进行数据插入1.1单行数据全列插入[提示]我们可以想在记事本上写下命令,让后复制到数据库客户端,这样可以在出错的时候进行快速修改.同时为了美观和明了,我们可以进行适当…

15个Spring扩展点,一般人知道的不超过5个!

Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内部则是一片惊涛骇浪&#xff0c;汪洋一片。Spring Boot更是封装了Spring&#xff0c;遵循约定大于配置&#xff0c;加上自动装配的机制。很多时候我们只要引用了一个…

苹果认证MFI学习

MFi是"Made for iPhone/iPod/iPad“的缩写。 MFi包含一系列技术或标准&#xff0c;你所开发的配件&#xff0c;要符合这个标准&#xff0c;才能够苹果设备如手机所认可&#xff0c;才能得到授权在市场销售。 比如蓝牙数据传输&#xff0c;就需要符合iAP2协议&#xff0c…

统计学习方法学习笔记——概论(一)

# 文章内容来自学习李航老师的《统计学习方法》后的总结&#xff0c;相当于学习笔记&#xff0c;若有不正确的地方还请大家指正。# 所需先验知识&#xff1a;概率论与数理统计、线性代数一、 统计学习概述可能有些小伙伴没有听过统计学习&#xff0c;但是我相信机器学习大家一定…

智慧物业管理系统【源码好优多】

简介 《智慧物业》一个免费开源的基于java的物业管理系统。未来将涵盖停车、安保、客服、工单、收费、财务、办公自动化等模块&#xff0c;构建一个软硬件一体的智慧物业解决方案。 功能 系统内置功能&#xff1a; 资产管理 商业区管理、楼栋管理、商铺管理、商铺租售 缴费…

【数电基础】——组合逻辑电路

目录 1.大纲 2.组合逻辑电路的特点 3.组合逻辑电路分析步骤 4.组合逻辑电路设计 5.组合逻辑电路中的竞争和冒险&#xff08;重要&#xff09; 6.怎样消除竞争冒险现象 7.常用的MSI组合逻辑器件 1.加法器 1.一位半加器 2.一位全加器 2.数据选择器 1.二选一数据选择器&#x…

spring容器,@Bean 与 @Component 用在同一个类上,会怎么样?

疑虑背景疑虑描述最近&#xff0c;在进行开发的过程中&#xff0c;发现之前的一个写法&#xff0c;类似如下以我的理解&#xff0c;Configuration 加 Bean 会创建一个 userName 不为 null 的 UserManager 对象&#xff0c;而 Component 也会创建一个 userName 为 null 的 UserM…

第七章 分词器:Text Analysis

1、分词器认知基础 1.1 基本概念 分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。 1.2 分词发生时期 分词器的处理过程发生在 Index Tim…

【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…

ICV光子盒:2023全球量子通信与安全产业发展展望

近日&#xff0c;全球著名的前沿科技咨询机构ICV与国内专注量子领域的行业研究机构光子盒&#xff0c;联合发布了2023全球量子通信与安全产业发展展望。报告主要从技术进展、产业生态、公司分析、网络建设、投资概况、政策发布、产业预测、展望观点的几方面对2023全球量子通信与…

【Java】Java进阶学习笔记(三)—— 面向对象(多态)

【Java】Java进阶学习笔记&#xff08;三&#xff09;—— 面向对象&#xff08;多态&#xff09;一、多态的概念1、多态的优点2、多态存在的三个必要条件3、多态中的成员特点4、重写方法的快捷键二、多态的转型1、向上转型2、向下转型3、代码示例4、转型的异常类型转换异常ins…

无线蓝牙耳机哪个品牌延迟低?玩游戏延迟低的蓝牙耳机推荐

无线蓝牙耳机因为摆脱了线的束缚&#xff0c;在使用上会更便捷&#xff0c;不少人喜欢戴蓝牙耳机玩游戏&#xff0c;但又怕蓝牙耳机有延迟。正因为蓝牙耳机摆脱了线的束缚&#xff0c;在信号传输的过程中难免产生延迟。那么&#xff0c;无线蓝牙耳机哪个品牌延迟低&#xff1f;…

【Linux】程序员的易筋经——冯诺依曼体系结构

文章目录&#x1f449;冯诺伊曼体系结构&#x1f448;概念内存的重要性&#x1f449;操作系统&#xff08;Operating System&#xff09;&#x1f448;概念目的定位特征发展和分类运行机制体系结构&#x1f449;冯诺伊曼体系结构&#x1f448; 概念 下图是描述冯诺依曼体系结…

6天重建一遍中国台湾省,三维模型还可以这样做!

说起三维模型&#xff0c;大家脑海中显现的大多是一个可通过电子屏幕进行全方位展示的立体物体。一般来说&#xff0c;所显示的物体既可以是现实世界的实体&#xff0c;也可以是通过想象所创作的虚构物体。 而实景三维正是镜像作用于现实世界真实化表达的新兴技术&#xff0c;是…

Java中的过滤器和拦截器

Java中的过滤器和拦截器 一.应用场景 拦截器应用场景 拦截器本质上是面向切面编程&#xff08;AOP&#xff09;&#xff0c;符合横切关注点的功能都可以放在拦截器中来实现&#xff0c;主要的应用场景包括&#xff1a; 登录验证&#xff0c;判断用户是否登录。权限验证&…