再见iptaobao全网显示IP归属地快用这个开源库( 三 )


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中做个测试

再见iptaobao全网显示IP归属地快用这个开源库

文章插图
完全基于文件的查询
ip属地国内的话 , 会展示省份,国外的话,只会展示国家 。可以通过如下图这个方法进行进一步封装,得到获取IP属地的信息 。
再见iptaobao全网显示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 stringip2region binary xdb file path --cache-policy stringcache 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 stringip2region binary xdb file path --src stringsource ip text file path --cache-policy stringcache 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=https://www.pyjctjgg.com/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版本
如若觉得有用,欢迎收藏 点赞 , 如遇到什么问题,欢迎留言讨论