ip2region
一、介绍
在移动互联网的应用中,经常需要根据用户的位置信息等做一些用户侧信息的统计分析。而要拿到用户的位置信息,一般有两个方法: GPS 定位的信息和用户 IP 地址。由于每个手机都不一定会打开 GPS,而且有时并不太需要太精确的位置(到城市这个级别即可),所以根据 IP 地址入手来分析用户位置是个不错的选择。 要做到这个功能得需要一个 IP 和地理位置的映射关系库,并依赖这个库启动一个 IP 转地理位置的服务。而 ip2region 来分析映射关系库的设计以及 IP 如何快速转换成地理位置。
二、使用上手
1、引入库
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
码云的地址:https://gitee.com/lionsoul/ip2region
2、下载ip2region.db文件
下载地址:https://gitee.com/lionsoul/ip2region/blob/master/data/ip2region.db
首先从以上地址下载ip2region.db文件。下载文件后将下载的文件添加到项目的resoure路径下
3、使用上手
public static String getCityInfo(String ip) throws Exception {
DbSearcher searcher = null;
Method method = null;
InputStream inputStream = null;
try {
ClassPathResource resource = new ClassPathResource("/ip2region.db");
inputStream = resource.getInputStream();
byte[] dbBinStr = IoUtil.readBytes(inputStream);
DbConfig config = new DbConfig();
searcher = new DbSearcher(config, dbBinStr);
method = searcher.getClass().getMethod("memorySearch", String.class);
} catch (IOException | DbMakerConfigException | IORuntimeException | NoSuchMethodException | SecurityException e) {
log.error(e.getMessage());
e.printStackTrace();
} finally {
if (inputStream != null) {
inputStream.close();
}
}
return ((DataBlock) method.invoke(searcher, ip)).getRegion();
}
在查询IP时有三种算法,分别是:
- memory算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。
method = searcher.getClass().getMethod("memorySearch", String.class);
- binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。
method = searcher.getClass().getMethod("binarySearch", String.class);
- b-tree算法:基于btree算法,基于ip2region.db文件,不需要载入内存,单词查询在0.x毫秒级别,比binary算法更快。
method = searcher.getClass().getMethod("btreeSearch", String.class);
4、注意事项
ip2region 并发使用
-
全部binding的各个search接口都不是线程安全的实现,不同线程可以通过创建不同的查询对象来使用,并发量很大的情况下,binary和b-tree算法可能会打开文件数过多的错误,请修改内核的最大允许打开文件数(fs.file-max=一个更高的值),或者使用持久化的memory算法。 -
memorySearch接口,在发布对象前进行一次预查询(本质上是把ip2region.db文件加载到内存),可以安全用于多线程环境。
注:ip2region 并发使用内容摘自于码云,如果想了解更多可以自行搜索
5、输出内容含义
输出内容实例:|中国|华南|广东省|广州市|电信
分别代表国家、区域、省份、市和运营商。无数据区域默认为0。
|