ip地址归属地数据库,

  ip地址归属地数据库,

  00-1010简介:Java如何以99.9%的准确率获取IP属地Ip2region开源项目:多查询客户端支持Ip2region V2.0特性ip2region xdb java查询客户端在IDEA中实现了一个测试编译测试程序查询测试台测试。

  00-1010细心的朋友应该发现,近期,继新浪微博之后,头条、腾讯、Tik Tok、知乎、Aauto Quicker、小红书等各大平台相继推出了“网络用户IP地址显示功能”。海外用户显示国家,而国内用户显示省份。而且这个显示是不能关闭的,归属是强制的。

  作为技术人员,那!这个功能怎么实现?

  00-1010主要分为以下几个步骤:

  通过HttpServletRequest对象获取用户的IP地址。要通过IP地址获取对应的省市,需要先写一个IP获取工具类,因为每个用户的请求都会在请求头中携带被请求的IP地址。

  使用这种方法,用户的IP地址是从请求头中获得的。

  目前在我做的项目中,还需要获取IP地址所属的省市。我用淘宝IP库。

  地址:ip.taobao.com/

  原始请求源代码如下:

  您可以在日志文件中看到许多针对用户问题的超过max qps的请求。

  

目录

Ip2region开源项目,github地址:github.com/lionsoul201…

 

  目前已经更新到v2.0,是一个离线的IP地址位置数据库和IP位置数据管理框架。10微秒的查询效率必须提供很多主流编程语言的xdb数据生成和查询客户端实现。

  00-1010 data聚合了一些知名的ip到地名查询提供商的数据。这些是他们官方的准确率。经过测试,比经典的纯IP定位更准确。2IPRegion的数据聚合自以下服务商的开放API或数据(升级程序的请求次数为每秒2到4次):01,80%,淘宝IP地址数据库,ip.taobao.com/ 02, 10%,GeoIP,geoip.com/ 03, 2%,纯IP数据库,www.cz88.net/备注:如果以上开放API或数据不给开放数据,ip2region将停止数据更新服务。

  00-1010集成的客户端有:java,C#,php,C,python,nodejs,php扩展(php5和php7),golang,rust,lua,lua_c,nginx。

  绑定描述了开发状态。二进制查询需要时间。b树查询需要时间。内存查询需要时间。cANSC c绑定已完成0.0xms 0.0xms 0.00x c#c# 绑定已完成0.x毫秒0.x毫秒0.1x毫秒golanggolang绑定已完成0.x毫秒0.x毫秒0.1x毫秒javajava绑定已完成0.x毫秒0.x毫秒0.1x毫秒lua实现的绑定已完成0.x毫秒0.x毫秒0.x毫秒lua_clua的C扩展已完成0.00xms 0.00xms 0.00xms nginx的C扩展已完成0 . 0 xms 0 . 0 xms nodejsnodejs php5_extphp5的ms c扩展已完成0.0xms 0.0x mm .秒0.00x毫秒php7_extphp7 c扩展已完成0.0毫秒0.0x毫秒0.00x毫秒pythonpython绑定已完成0.x毫秒0.x毫秒rustrust绑定已完成0.x毫秒0.x毫秒0.x毫秒。

  00-1010 1.标准化数据格式

  每个ip数据段的地区信息有一个固定的格式:国家地区省市ISP。只有中国的大部分数据精确到城市,其他国家的部分数据只能位于全国,前后所有选项均为0。

  2.重复数据删除和压缩

  Xdb格式

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

  3、极速查询响应

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

  vIndex 索引缓存 :使用固定的 512KiB 的内存空间缓存 vector index 数据,减少一次 IO 磁盘操作,保持平均查询效率稳定在10-20微秒之间。xdb 整个文件缓存:将整个 xdb 文件全部加载到内存,内存占用等同于 xdb 文件大小,无磁盘 IO 操作,保持微秒级别的查询效率。4、极速查询响应

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

  

 

  

ip2region xdb java 查询客户端实现

使用方式引入maven仓库:

 

  

<dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>2.6.4</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`: %sn", 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): %sn", ip, e); } // 3、备注:并发使用,每个线程需要创建一个独立的 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`: %sn", 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`: %sn", 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): %sn", ip, e); } // 备注:每个线程需要单独创建一个独立的 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`: %sn", dbPath, e); return; } // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 Searcher searcher; try { searcher = Searcher.newWithBuffer(cBuff); } catch (Exception e) { System.out.printf("failed to create content cached searcher: %sn", 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): %sn", ip, e); } // 备注:并发使用,用整个 xdb 数据缓存创建的查询对象可以安全的用于并发,也就是你可以把这个 searcher 对象做成全局对象去跨线程访问。 }}

 

  

IDEA中做个测试

 

  完全基于文件的查询

  ip属地国内的话,会展示省份,国外的话,只会展示国家。可以通过如下图这个方法进行进一步封装,得到获取IP属地的信息。

  

 

  下面是官网给出的命令运行jar方式给出的测试demo,可以理解下

  

 

  

编译测试程序

通过 maven 来编译测试程序。

 

  

# cd 到 java binding 的根目录cd binding/java/mvn compile package

然后会在当前目录的 target 目录下得到一个 ip2region-{version}.jar 的打包文件。

 

  

 

  

查询测试

可以通过 java -jar ip2region-{version}.jar search 命令来测试查询:

 

  

➜ java git:(v2.0_xdb) ✗ java -jar target/ip2region-2.6.0.jar searchjava -jar ip2region-{version}.jar search [command options]options: --db string ip2region binary xdb file path --cache-policy string cache policy: file/vectorIndex/content

例如:使用默认的 data/ip2region.xdb 文件进行查询测试:

 

  

➜ java git:(v2.0_xdb) ✗ java -jar target/ip2region-2.6.0.jar search --db=../../data/ip2region.xdbip2region xdb searcher test program, cachePolicy: vectorIndextype quit to exitip2region>> 1.2.3.4{region: 美国0华盛顿0谷歌, ioCount: 7, took: 82 μs}ip2region>>

输入 ip 即可进行查询测试,也可以分别设置 cache-policy 为 file/vectorIndex/content 来测试三种不同缓存实现的查询效果。

 

  

 

  

bench 测试

可以通过 java -jar ip2region-{version}.jar bench 命令来进行 bench 测试,一方面确保 xdb 文件没有错误,一方面可以评估查询性能:

 

  

➜ java git:(v2.0_xdb) ✗ java -jar target/ip2region-2.6.0.jar benchjava -jar ip2region-{version}.jar bench [command options]options: --db string ip2region binary xdb file path --src string source ip text file path --cache-policy string cache policy: file/vectorIndex/content

例如:通过默认的 data/ip2region.xdb 和 data/ip.merge.txt 文件进行 bench 测试:

 

  

➜ java git:(v2.0_xdb) ✗ java -jar target/ip2region-2.6.0.jar bench --db=../../data/ip2region.xdb --src=../../data/ip.merge.txtBench finished, {cachePolicy: vectorIndex, total: 3417955, took: 8s, cost: 2 μs/op}

可以通过分别设置 cache-policy 为 file/vectorIndex/content 来测试三种不同缓存实现的效果。 @Note: 注意 bench 使用的 src 文件要是生成对应 xdb 文件相同的源文件。

 

  到这里获取用户IP属地已经完成啦,这篇文章介绍的v2.0版本,有兴趣的小伙伴可以登录上门的github地址了解下v1.0版本

  更多关于java获取IP归属地全网显示的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 关系型数据库与非关系型数据库简介一样吗,关系型数据库非关系型数据库有哪些
  • 关系型数据库与非关系型数据库简介一样吗,关系型数据库非关系型数据库有哪些,关系型数据库与非关系型数据库简介
  • 关于redis数据库入门详细介绍图片,redis数据库的使用,关于Redis数据库入门详细介绍
  • 使用php连接mysql数据库,php连接数据库的方法
  • 使用php连接mysql数据库,php连接数据库的方法,一文详解PHP连接MySQL数据库的三种方式
  • 什么是分库分表,为什么要进行分库分表-,分库分表的区别,数据库分库分表是什么,什么情况下需要用分库分表
  • vb中adodb连接数据库,
  • treeview控件绑定数据,wpf treeview数据绑定,详解TreeView绑定数据库
  • sql的多表查询,数据库如何实现多表查询
  • SQL数据库的图形管理界面工具是,sql图形界面创建数据库
  • SQL数据库的图形管理界面工具是,sql图形界面创建数据库,SQLServer2019 数据库的基本使用之图形化界面操作的实现
  • sql数据库定时备份怎么弄,mysql 定期备份
  • sql数据库定时备份怎么弄,mysql 定期备份,MySQL 数据库定时备份的几种方式(全面)
  • sqlserver的nvarchar和varchar,数据库varchar和nvarchar
  • sqlserver的nvarchar和varchar,数据库varchar和nvarchar,SQL中varchar和nvarchar的基本介绍及其区别
  • 留言与评论(共有 条评论)
       
    验证码: