仓库链接:https://github.com/fsmuzqhybe21945/ip2region

以下内容来源于仓库本身的README。

Ip2region 是什么


ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。v1.0 旧版本: v1.0版本入口

Ip2region 特性


1、标准化的数据格式

每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。

2、数据去重和压缩

xdb 格式生成程序会自动去重和压缩部分数据,默认的全部 IP 数据,生成的 ip2region.xdb 数据库是 11MiB,随着数据的详细度增加数据库的大小也慢慢增大。

3、极速查询响应

即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别,可通过如下两种方式开启内存加速查询:

  1. vIndex 索引缓存 :使用固定的 512KiB 的内存空间缓存 vector index 数据,减少一次 IO 磁盘操作,保持平均查询效率稳定在10-20微秒之间。

  1. xdb 整个文件缓存:将整个 xdb 文件全部加载到内存,内存占用等同于 xdb 文件大小,无磁盘 IO 操作,保持微秒级别的查询效率。

4、IP 数据管理框架

v2.0 格式的 xdb 支持亿级别的 IP 数据段行数,region 信息也可以完全自定义,例如:你可以在 region 中追加特定业务需求的数据,例如:GPS信息/国际统一地域信息编码/邮编等。也就是你完全可以使用 ip2region 来管理你自己的 IP 定位数据。

使用方式


maven 仓库:

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

完全基于文件的查询

import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.util.concurrent.TimeUnit;public class SearcherTest {public static void main(String[] args) {// 1、创建 searcher 对象String dbPath = "ip2region.xdb file path";Searcher searcher = null;try {searcher = Searcher.newWithFileOnly(dbPath);} catch (IOException e) {System.out.printf("failed to create searcher with `%s`: %s\n", dbPath, e);return;}// 2、查询try {String ip = "1.2.3.4";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);} catch (Exception e) {System.out.printf("failed to search(%s): %s\n", ip, e);}// 3、关闭资源searcher.close();// 备注:并发使用,每个线程需要创建一个独立的 searcher 对象单独使用。}
}

缓存 VectorIndex 索引

我们可以提前从 xdb 文件中加载出来 VectorIndex 数据,然后全局缓存,每次创建 Searcher 对象的时候使用全局的 VectorIndex 缓存可以减少一次固定的 IO 操作,从而加速查询,减少 IO 压力。

import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.util.concurrent.TimeUnit;public class SearcherTest {public static void main(String[] args) {String dbPath = "ip2region.xdb file path";// 1、从 dbPath 中预先加载 VectorIndex 缓存,并且把这个得到的数据作为全局变量,后续反复使用。byte[] vIndex;try {vIndex = Searcher.loadVectorIndexFromFile(dbPath);} catch (Exception e) {System.out.printf("failed to load vector index from `%s`: %s\n", dbPath, e);return;}// 2、使用全局的 vIndex 创建带 VectorIndex 缓存的查询对象。Searcher searcher;try {searcher = Searcher.newWithVectorIndex(dbPath, vIndex);} catch (Exception e) {System.out.printf("failed to create vectorIndex cached searcher with `%s`: %s\n", dbPath, e);return;}// 3、查询try {String ip = "1.2.3.4";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);} catch (Exception e) {System.out.printf("failed to search(%s): %s\n", ip, e);}// 4、关闭资源searcher.close();// 备注:每个线程需要单独创建一个独立的 Searcher 对象,但是都共享全局的制度 vIndex 缓存。}
}

缓存整个 xdb 数据

我们也可以预先加载整个 ip2region.xdb 的数据到内存,然后基于这个数据创建查询对象来实现完全基于文件的查询,类似之前的 memory search。

import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.util.concurrent.TimeUnit;public class SearcherTest {public static void main(String[] args) {String dbPath = "ip2region.xdb file path";// 1、从 dbPath 加载整个 xdb 到内存。byte[] cBuff;try {cBuff = Searcher.loadContentFromFile(dbPath);} catch (Exception e) {System.out.printf("failed to load content from `%s`: %s\n", dbPath, e);return;}// 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。Searcher searcher;try {searcher = Searcher.newWithBuffer(cBuff);} catch (Exception e) {System.out.printf("failed to create content cached searcher: %s\n", e);return;}// 3、查询try {String ip = "1.2.3.4";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);} catch (Exception e) {System.out.printf("failed to search(%s): %s\n", ip, e);}// 4、关闭资源 - 该 searcher 对象可以安全用于并发,等整个服务关闭的时候再关闭 searcher// searcher.close();// 备注:并发使用,用整个 xdb 数据缓存创建的查询对象可以安全的用于并发,也就是你可以把这个 searcher 对象做成全局对象去跨线程访问。}
}

Java 根据IP地址获取城市(ip2region)V2版本相关推荐

  1. java根据ip地址获取城市地域信息

    java根据ip地址获取城市地域信息 这里提供两个公开的接口,一个是阿里的,一个是新浪的 http://ip.taobao.com/service/getIpInfo.php?ip=123.139.9 ...

  2. Java 根据IP地址获取城市(ip2region)

    根据IP地址获取城市(ip2region) Ip2region是什么? Ip2region特性 99.9%准确率 标准化的数据格式 体积小 查询速度快 多查询客户端的支持 maven集成 小坑 Ip2 ...

  3. java 根据ip地址获取城市_Java 根据ip地址获取当前城市

    maxmind免费数据库maven位置:用来获取所要用的数据库文件(GeoLite2-City.mmdb) org.elasticsearch geolite2-databases 20151029 ...

  4. java使用高德地图根据IP地址获取城市

    话不多说!直奔主题 既然是根据IP,首先肯定是先要获取IP地址的,以下代码是获取IP地址,部署到服务器上去后会获取到公网的IP不是服务器的本机IP:是通过HttpServletRequest获取 注: ...

  5. 前端获取自己所在的ip_前端使用js根据ip地址获取城市地理位置

    标签: 前端使用js根据ip地址获取城市地理位置 一.使用js根据ip获取地址位置 1.在html页面,加入如下代码: var cityCode=returnCitySN.cid; document. ...

  6. 根据ip地址获取城市名的几种方法

    2019独角兽企业重金招聘Python工程师标准>>> 在某些场景下,可能需要用到根据ip地址获取ip所对应的城市名. 貌似腾讯.百度等开放接口已经失效或者免费服务接口关闭等原因,很 ...

  7. java 根据IP地址获取地理位置

    来源:http://www.ipplus360.com/tech/api/ 来源:http://blog.csdn.net/Cryhelyxx/article/details/40862101 精确查 ...

  8. java通过ip地址获取相应对应的城市

    发现了一比较好的本地ip对应地址的库资源文件--做一下笔记. 官方网站 https://dev.maxmind.com/geoip/geoip2/geolite2/ 这里提供了免费的库文件,还有很好的 ...

  9. JAVA根据IP地址获取省份城市和经纬度(可获取国家名称 淘宝高德API如果是国外IP获取到的为空)

    所需jar包maven地址: <!-- 根据ip获取位置 --><dependency><groupId>com.maxmind.geoip2</groupI ...

  10. 【转载】 java根据ip地址获取详细地域信息

    互联网有很多接口可以实现通过ip查询到具体的位置,如下: 通过淘宝IP地址库获取IP位置 1. 请求接口(GET):http://ip.taobao.com/service/getIpInfo.php ...

最新文章

  1. Swift中页面跳转与传值:
  2. 如何找到SAP ECC事务码升级到S4HANA后对应的新事务码
  3. Socket编程知识必学/SELECT 编程
  4. Know more about Cache Buffer Handle
  5. spring 上下文_一次性教你彻底理解 Spring容器和应用上下文!
  6. 《高并发Oracle数据库系统的架构与设计》一1.4 本章小结
  7. C#/VB.NET与西门子PLC进行ModbusTcp通信
  8. 静态代码块、非静态代码块和构造方法
  9. ES6、7学习笔记(尚硅谷)-1-ES5的一些
  10. C程序设计语言(KR)笔记
  11. conda install labelimg 预定标签类别
  12. 批量识别PDF文件(图片类型)中的文字
  13. 如何选择和使用现货白银
  14. cpu天梯图2022年11月 cpu排行榜天梯图2022
  15. mysql查询出的数据转换为数字,关于sql:在MySQL查询中将文本转换为数字
  16. tx2 can通信之开机自动加载can模块
  17. mysql如何重复数据合并_mysql合并相同字段,不同的拼接在起后
  18. 模型修饰在无人机航测实景三维模型生产中的应用——以DP-Modeler软件为例
  19. RxJava2基础总结(二)
  20. 如何获得高质量的外链

热门文章

  1. html中怎么接着水平线后面,html水平分割线怎么设置?html水平分割线的代码示例讲解...
  2. Combiner和Partitioner
  3. 关于讨厌的浏览器缓存问题尤其是safari浏览器缓存
  4. HTTP状态 500 - 内部服务器错误 类型 异常报告,初学servlet遇到的问题
  5. 生动的SDN基础内容介绍(一)--SDN基础结构
  6. [问题汇总] Linux重启网卡报错 Job for network.service failed
  7. 中文自然语言处理--手动构建词袋模型
  8. 计算机存储器之逻辑地址和物理地址转换详解
  9. Java的类加载过程
  10. Java构造器、构造方法、new对象