• ip2region.xdb通过ip获得地址


    ip2region xdb java 查询客户端实现

    • 「使用方式」

    引入maven仓库:

    <dependency>
        <groupId>org.lionsoul</groupId>
        <artifactId>ip2region</artifactId>
        <version>2.6.4</version>
    </dependency>
     
    • 「完全基于文件的查询」

    package com.demo;

    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 = "G:\\IdeaProjects\\ip2region-test\\src\\main\\java\\com\\demo\\ip2region.xdb";
    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、查询
    String ip = "1.2.3.4";
    try {

    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 对象单独使用。
    }
    }
     
    • 「缓存VectorIndex索引」

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

    import org.lionsoul.ip2region.xdb.Searcher;
    import java.io.*;
    import java.util.concurrent.TimeUnit;
    
    public class SearcherTest1 {
        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、查询
           String ip = "1.2.3.4";
            try {
                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);
            }
    
            // 备注:每个线程需要单独创建一个独立的 Searcher 对象,但是都共享全局的制度 vIndex 缓存。
        }
    }
     
    • 「缓存整个xdb数据」

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

    package com.example.demo;
    import org.lionsoul.ip2region.xdb.Searcher;

    import java.util.concurrent.TimeUnit;

    public class SearcherTest2 {
    public static void main(String[] args) {
    String dbPath = "G:\\IdeaProjects\\demo\\src\\main\\resources\\ip2region.xdb";

    // 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、查询
    String ip = "1.2.3.4";
    try {

    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);
    }

    // 备注:并发使用,用整个 xdb 数据缓存创建的查询对象可以安全的用于并发,也就是你可以把这个 searcher 对象做成全局对象去跨线程访问。
    }
    }
    
    

    完全基于文件的查询

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

     

    gitee地址

    https://gitee.com/chenjie950907/ip2region-test
     
  • 相关阅读:
    一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录
    MySQL复制表的方式以及原理和流程
    Python里面如何拷贝一个对象
    python中*args,**kwargs
    Python删除list里面的重复元素的俩种方法
    Python是如何进行内存管理
    python中lambda函数
    python中filter(),reduce()函数
    python中map()函数用法
    重磅发布:阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16493953.html
Copyright © 2020-2023  润新知