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 对象做成全局对象去跨线程访问。
}