Optimize the README DOC
This commit is contained in:
parent
d60515dad6
commit
ac86979872
181
README.md
181
README.md
|
|
@ -1,11 +1,15 @@
|
|||
ip2region - 最自由的ip地址查询库,ip到地区的映射库,提供Binary,B树和纯内存三种查询算法,妈妈再也不用担心我的ip地址定位。
|
||||
# Ip2region是什么?
|
||||
|
||||
### 1. 前言:
|
||||
ip2region重点在于<b>研究ip数据的存储设计和各种语言的查询实现</b>,并没有原始ip数据的支撑,数据来源请参考下面的描述,升级数据需要很多IP的支撑并且会对原始平台造成一定量的请求压力,本项目不保证及时的数据更新,没有也不会有商用版本,你可以使用自定义的数据导入ip2region进行自定义查询的实现。
|
||||
ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。
|
||||
|
||||
### 2. 99.9%准确率,定时更新:
|
||||
|
||||
数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比纯真啥的准确一些。<br />
|
||||
|
||||
|
||||
# Ip2region核心特性
|
||||
|
||||
### 99.9%准确率
|
||||
|
||||
数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真IP定位准确一些。<br />
|
||||
ip2region的数据聚合自以下服务商的开放API或者数据(升级程序每秒请求次数2到4次): <br />
|
||||
01, >80%, 淘宝IP地址库, [http://ip.taobao.com/](http://ip.taobao.com/) <br />
|
||||
02, ≈10%, GeoIP, [https://geoip.com/](https://geoip.com/) <br />
|
||||
|
|
@ -13,80 +17,67 @@ ip2region的数据聚合自以下服务商的开放API或者数据(升级程序
|
|||
<b>备注:</b>如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。
|
||||
|
||||
|
||||
### 3. 标准化的数据格式:
|
||||
### 标准化的数据格式
|
||||
|
||||
每条ip数据段都固定了格式:_城市Id|国家|区域|省份|城市|ISP_
|
||||
每条ip数据段都固定了格式:]
|
||||
```
|
||||
_城市Id|国家|区域|省份|城市|ISP_
|
||||
```
|
||||
|
||||
只有中国的数据精确到了城市,其他国家只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家。
|
||||
(请忽略前面的城市Id,个人项目需求)
|
||||
只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家(请忽略前面的城市Id,个人项目需求)。
|
||||
|
||||
### 4. 体积小:
|
||||
|
||||
生成的数据库文件ip2region.db只有1.5M(1.2版本前是3.5M)
|
||||
### 体积小
|
||||
|
||||
### 5. 多查询客户端的支持,0.0x毫秒级别的查询
|
||||
包含了全部的IP,生成的数据库文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过8MB。
|
||||
|
||||
|
||||
### 查询速度快
|
||||
|
||||
全部的查询客户端单次查询都在0.x毫秒级别,内置了三种查询算法
|
||||
|
||||
1. memory算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。
|
||||
2. binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。
|
||||
3. b-tree算法:基于btree算法,基于ip2region.db文件,不需要载入内存,单词查询在0.x毫秒级别,比binary算法更快。
|
||||
|
||||
任何客户端b-tree都比binary算法快,当然memory算法固然是最快的!
|
||||
|
||||
|
||||
### 多查询客户端的支持
|
||||
|
||||
已经集成的客户端有:java、C#、php、c、python、nodejs、php扩展(php5和php7)、golang、rust、lua、lua_c。
|
||||
|
||||
提供了两种查询算法,响应时间如下:
|
||||
客户端/binary算法/b-tree算法/Memory算法:
|
||||
c#/0.x毫秒/0.x毫秒/0.x毫秒
|
||||
java/0.x毫秒/0.x毫秒/0.1x毫秒 (使用RandomAccessFile)
|
||||
php/0.x毫秒/0.1x毫秒/0.1x毫秒
|
||||
c/0.0x毫秒/0.0x毫秒/0.00x毫秒(b-tree算法基本稳定在0.02x毫秒级别)
|
||||
python/0.x毫秒/0.1x毫秒/未知
|
||||
lua/0.x毫秒/0.x毫秒/0.x毫秒
|
||||
lua_c/0.0x毫秒/0.0x毫秒/0.00x毫秒
|
||||
|
||||
任何客户端b-tree都比binary算法快,当然Memory算法固然是最快的!
|
||||
##### 已有的binding
|
||||
适用语言 | 开发语言 | 开发状态 | binary查询耗时 | b-tree查询耗时 | memory查询耗时
|
||||
:-: | :-: | :-: | :-: | :-: | :-:
|
||||
[c](binding/c) | c | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[c#](binding/c#) | c# | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[golang](binding/golang) | golang | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[java](binding/java) | java | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[lua](binding/lua) | lua | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒
|
||||
[lua](binding/lua_c) | c | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[nginx](binding/nginx) | c | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[nodejs](binding/nodejs) | nodejs | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒
|
||||
[php](binding/php) | php | 已完成 | 0.x毫秒 | 0.1x毫秒 | 0.1x毫秒
|
||||
[php](binding/c) | c | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[php](binding/c) | c | 已完成 | 0.0毫秒 | 0.0x毫秒 | 0.00x毫秒
|
||||
[python](binding/c) | python | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒
|
||||
[rust](binding/c) | rust | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒
|
||||
|
||||
maven仓库地址:
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.lionsoul</groupId>
|
||||
<artifactId>ip2region</artifactId>
|
||||
<version>1.7.2</version>
|
||||
</dependency>
|
||||
```
|
||||
nuget安装命令
|
||||
```shell
|
||||
Install-Package IP2Region
|
||||
```
|
||||
|
||||
### 6. 测试程序:
|
||||
C#、Node.js、lua_c的测试请具体参考文件夹中README.md 说明。
|
||||
|
||||
java:
|
||||
```shell
|
||||
cd binding/java
|
||||
ant all
|
||||
java -jar ip2region-{version}.jar ./data/ip2region.db
|
||||
```
|
||||
|
||||
php:
|
||||
```shell
|
||||
php binding/php/testSearcher.php ./data/ip2region.db
|
||||
```
|
||||
# ip2region快速测试
|
||||
|
||||
c:
|
||||
请参考每个binding下的README说明去运行cli测试程序,例如C语言的demo运行如下:
|
||||
```shell
|
||||
cd binding/c/
|
||||
gcc -g -O2 testSearcher.c ip2region.c
|
||||
./a.out ../../data/ip2region.db
|
||||
```
|
||||
|
||||
python:
|
||||
```shell
|
||||
python binding/python/testSearcher.py ./data/ip2region.db
|
||||
```
|
||||
|
||||
lua:
|
||||
```shell
|
||||
cd binding/lua/
|
||||
lua testSearcher.lua ../../data/ip2region.db
|
||||
```
|
||||
|
||||
均会看到如下界面:
|
||||
会看到如下cli界面:
|
||||
```shell
|
||||
initializing B-tree ...
|
||||
+----------------------------------+
|
||||
|
|
@ -98,19 +89,60 @@ p2region>> 101.105.35.57
|
|||
2163|中国|华南|广东省|深圳市|鹏博士 in 0.02295 millseconds
|
||||
```
|
||||
|
||||
输入ip地址开始测试,第一次会稍微有点慢,在运行命令后面接入binary,memory来尝试其他算法,建议使用b-tree算法,速度和并发需求的可以使用memory算法。
|
||||
|
||||
具体集成请参考不同客户端的测试源码。
|
||||
输入IP地址开始测试,第一次会稍微有点慢,在运行命令后面接入binary,memory来尝试其他算法,建议使用b-tree算法,速度和并发需求的可以使用memory算法,具体集成请参考不同binding下的测试源码。
|
||||
|
||||
|
||||
### 7. 如何生成ip2region.db文件
|
||||
|
||||
|
||||
# ip2region安装
|
||||
|
||||
具体请参考每个binding下的README文档,以下是一些可用的快捷安装方式:
|
||||
|
||||
### maven仓库地址
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.lionsoul</groupId>
|
||||
<artifactId>ip2region</artifactId>
|
||||
<version>1.7.2</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### nodejs
|
||||
```
|
||||
npm install node-ip2region --save
|
||||
```
|
||||
|
||||
### nuget安装
|
||||
```shell
|
||||
Install-Package IP2Region
|
||||
```
|
||||
|
||||
### php composer
|
||||
```shell
|
||||
# 插件来自:https://github.com/zoujingli/ip2region
|
||||
composer require zoujingli/ip2region
|
||||
```
|
||||
|
||||
|
||||
|
||||
# ip2region 并发使用
|
||||
|
||||
1. 全部binding的各个search接口都<b>不是</b>线程安全的实现,不同线程可以通过创建不同的查询对象来使用,并发量很大的情况下,binary和b-tree算法可能会打开文件数过多的错误,请修改内核的最大允许打开文件数(fs.file-max=一个更高的值),或者使用持久化的memory算法。
|
||||
|
||||
2. memorySearch接口,在发布对象前进行一次预查询(本质上是把ip2region.db文件加载到内存),可以安全用于多线程环境。
|
||||
|
||||
|
||||
|
||||
|
||||
# ip2region.db的生成
|
||||
|
||||
从1.8版本开始,ip2region开源了ip2region.db生成程序的java实现,提供了ant编译支持,编译后会得到以下提到的dbMaker-{version}.jar,对于需要研究生成程序的或者更改自定义生成配置的请参考${ip2region_root}/maker/java内的java源码。
|
||||
|
||||
|
||||
从ip2region 1.2.2版本开始里面提交了一个dbMaker-{version}.jar的可以执行jar文件,用它来完成这个工作:
|
||||
* 1, 确保你安装好了java环境(不玩Java的童鞋就自己谷歌找找拉,临时用一用,几分钟的事情)
|
||||
* 2, cd到${ip2region_root}/maker/java,然后运行如下命令:
|
||||
|
||||
1. 确保你安装好了java环境(不玩Java的童鞋就自己谷歌找找拉,临时用一用,几分钟的事情)
|
||||
2. cd到${ip2region_root}/maker/java,然后运行如下命令:
|
||||
|
||||
```shell
|
||||
java -jar dbMaker-{version}.jar -src 文本数据文件 -region 地域csv文件 [-dst 生成的ip2region.db文件的目录]
|
||||
|
|
@ -120,8 +152,8 @@ java -jar dbMaker-{version}.jar -src 文本数据文件 -region 地域csv文件
|
|||
# ip2region.db文件的目录:是可选参数,没有指定的话会在当前目录生成一份./data/ip2region.db文件
|
||||
```
|
||||
|
||||
* 3, 获取生成的ip2region.db文件覆盖原来的ip2region.db文件即可
|
||||
* 4, 默认的ip2region.db文件生成命令:
|
||||
3. 获取生成的ip2region.db文件覆盖原来的ip2region.db文件即可
|
||||
4. 默认的ip2region.db文件生成命令:
|
||||
|
||||
```shell
|
||||
cd ${ip2region_root}/java/
|
||||
|
|
@ -130,10 +162,15 @@ java -jar dbMaker-1.2.2.jar -src ./data/ip.merge.txt -region ./data/global_regio
|
|||
# 会看到一大片的输出
|
||||
```
|
||||
|
||||
* 5, 数据库文件的结构和原理请阅读 @冬芽 的blog:[“ip2region数据库文件的结构和原理”](http://dongyado.com/tool/2016/08/18/structure-of-ip2region-database-file/)
|
||||
|
||||
|
||||
### 8. 其他备注
|
||||
* 1, 全部binding的各个search接口都<b>不是</b>线程安全的实现,不同线程可以通过创建不同的查询对象来使用。
|
||||
* 2, memorySearch接口,在发布对象前进行一次预查询,可以安全用于多线程环境。
|
||||
* 3, ip2region交流分享,微信:lionsoul2014,QQ:1187582057
|
||||
|
||||
# 相关备注
|
||||
|
||||
### 声明
|
||||
ip2region重点在于<b>研究IP数据的存储设计和各种语言的查询实现</b>,并没有原始IP数据的支撑,数据来源请参考上面的描述,升级数据需要很多IP的支撑并且会对原始平台造成一定量的请求压力,本项目不保证及时的数据更新,没有也不会有商用版本,你可以使用自定义的数据导入ip2region进行自定义查询的实现。
|
||||
|
||||
### 技术交流
|
||||
1. 数据库文件的结构和原理请阅读 @冬芽 的blog:[“ip2region数据库文件的结构和原理”](http://dongyado.com/tool/2016/08/18/structure-of-ip2region-database-file/)
|
||||
2. ip2region交流分享,微信:lionsoul2014(请备注ip2region),QQ:1187582057(很少关注)
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ version = "*"
|
|||
|
||||
取消上面 toml 的 `# features = ["lazy"]` 行的注释即可使用,其 api 是 `memory_search` 和 `memory_search_ip`。
|
||||
|
||||
只是目前 DB 足有3.2M,还是有些感人的。
|
||||
只是目前 DB 只有3.2M,还是有些感人的。
|
||||
|
||||
关键的一行是 `features = ["lazy"]` ,不需要则可以注释或者删掉。
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue