根据IP获取城市 ip2region 支持java nodejs php python golang
原创 Blackbird 发表于:2022-08-05 22:43:28
  阅读 :61   收藏   编辑

github 地址

https://github.com/lionsoul2014/ip2region

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

java 实现

https://github.com/lionsoul2014/ip2region/tree/master/binding/java

ip2region.xdb 下载地址

https://github.com/lionsoul2014/ip2region/tree/master/data

public static final String IP_DATA_BASE_PATH = System.getProperties().getProperty("user.home") + File.separator + "res" + File.separator + "ip2region.xdb";

  public static void main(String[] args) {

    // 1、从 dbPath 加载整个 xdb 到内存。
    byte[] cBuff;
    try {
      cBuff = Searcher.loadContentFromFile(IP_DATA_BASE_PATH);
    } catch (Exception e) {
      System.out.printf("failed to load content from `%s`: %s\n", IP_DATA_BASE_PATH, 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;
    }
    String ip = "124.77.254.115";
    // 3、查询
    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);
    }

    // 4、关闭资源 - 该 searcher 对象可以安全用于并发,等整个服务关闭的时候再关闭 searcher
    // searcher.close();

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

image.png