v3.6.0
- ip2region.js npm 包支持:
npm install ip2region.js --save
- javascript binding (nodejs / typescript) 提供了对 IPv6 的查询支持,具体使用文档请参考 javascript Binding,测试方式如下:
➜ javascript git:(master) node tests/search.app.js --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, ioCount: 2, took: 158.64 μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, ioCount: 14, took: 256.98 μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, ioCount: 21, took: 241.755 μs}
ip2region>>
- 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜ javascript git:(master) node tests/bench.app.js --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Searcher: {"version": IPv6, "dbPath": ../../data/ip2region_v6.xdb, "handle": 21, "vectorIndex": 524288 "cBuffer": null}
Bench finished, {cachePolicy: vectorIndex, total: 34159862, took: 963.9443019528878 s, cost: 28.21862400828457 μs/op}
3415.9 万个 IPv6 平均查询耗时为 28.2
微秒/次。
v3.5.1-release
- C binding 修改通过了 msvc 的编译运行。
- Rust maker 提供了 IPv6 的生成支持,详细文档请参考 Rust Maker,使用方式如下:
# ipv6
./target/release/maker --src=../../../data/ipv6_source.txt --dst=./target/ipv6.xdb --ip-version v6
# ipv4
./target/release/maker --src=../../../data/ipv4_source.txt --dst=./target/ipv4.xdb --ip-version v4
- Golang / Java maker 优化 IP 段的合并逻辑,对于自定义字段生成 xdb 的情况能提供更好的压缩效果,以社区
v4-基础版
的 3.4G 的 商业数据不同版本的 xdb 大小对比如下:
版本 | 优化前 | 优化后 | 瘦身率 |
---|---|---|---|
满载版 | 349M | 266M | 23.7% |
标准版 | 325M | 241M | 25.8% |
精简版 | 324M | 69M | 78.7% |
v3.5.0-release
- Rust binding 增加了
NoCache
/VectorIndex
/FullMemory
三种缓存策略的完整实现。 - Rust binding 提了 IPv6 的查询支持,具体使用文档请参考 Rust Binding,测试方式如下:
$ cd binding/rust
$ ./target/release/searcher --xdb='../../data/ip2region_v6.xdb' query
ip2region xdb searcher test program, type `quit` or `Ctrl + c` to exit
ip2region>> 2001:5:4::
region: Ok("荷兰|北荷兰省|阿姆斯特丹|专线用户"), took: 284.80775ms
ip2region>> 2001::
region: Ok("美国|加利福尼亚州|洛杉矶|专线用户"), took: 12.75µs
ip2region>> 2001:5:6::
region: Ok("荷兰|北荷兰省|阿姆斯特丹|专线用户"), took: 52.958µs
ip2region>> 2001:5:5::
region: Ok("比利时|弗拉芒大区|泽勒|专线用户"), took: 123.375µs
ip2region>>
- Rust 增加了标准的原始数据/xdb 的 bench 测试,方便开发者测试查询性能,验证 xdb 文件的有效性,测试方式如下:
$ cd binding/rust/example
$ cargo build -r
## 通过 data/ip2region_v4.xdb 和 data/ipv4_source.txt 进行 ipv4 的 bench 测试:
$ RUST_LOG=debug ../target/release/searcher --xdb='../../../data/ip2region_v4.xdb' bench '../../../data/ipv4_source.txt'
## 通过 data/ip2region_v6.xdb 和 data/ipv6_source.txt 进行 ipv6 的 bench 测试:
$ RUST_LOG=debug ../target/release/searcher --xdb='../../../data/ip2region_v6.xdb' bench '../../../data/ipv6_source.txt'
- Java/Golang maker 生成过程中的允许空
region
信息方便自定义字段的的指定,有些字段的值确实为空。
v3.4.0-release
- lua_c binding 提供了对 IPv6 的查询支持,具体使用文档请参考 Lua_c Binding,测试方式如下:
➜ lua_c git:(master) lua ./search_test.lua --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, io_count: 2, took: 63μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, io_count: 14, took: 55μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, io_count: 21, took: 127μs}
ip2region>>
- 因为接入的最新的 c binding 并且使用的自动
region
内存管理,所以适用于任意长度的地域信息的查询。 - 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜ lua_c git:(master) ✗ lua ./bench_test.lua --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Bench finished, {cachePolicy: vectorIndex, total: 34159862, took: 829.008 s, cost: 23.176 μs/op}
3415.9 万个 IPv6 平均查询耗时为 23.1
微秒/次。
v3.3.0-release
- C binding 提供了对 IPv6 的查询支持,具体使用文档请参考 C Binding,测试方式如下:
➜ c git:(master) ./xdb_searcher search --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, io_count: 2, took: 42 μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, io_count: 21, took: 121 μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
- 使用
xdb_region_buffer_t
来管理 region 信息的存储,即支持旧的基于固定栈内存的存储方式,可以减少运行时的内存碎片,也支持新的按需自动内存分配来适应各种地域信息,使用方式如下:
#include "xdb_api.h"
// 1, 通过指定一块内存来创建 region_buffer
char buffer[512];
xdb_region_buffer_t region;
int err = xdb_region_buffer_init(®ion, buffer, sizeof(buffer));
if (err != 0) {
// 初始化失败
printf("failed to init region buffer width errcode=%d", err);
return;
}
// 2,通过指定 NULL 来创建 region_buffer,让其自动按需分配内存
xdb_region_buffer_t region;
int err = xdb_region_buffer_init(®ion, NULL, 0);
if (err != 0) {
// 初始化失败
printf("failed to init region buffer width errcode=%d", err);
return;
}
// 备注:在每次调用 search 完成 IP 定位信息的查询后,你需要手动调用函数来释放内存 .
// search 函数使用未经清理的 region 信息会报错。
xdb_region_buffer_free(®ion);
- 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜ c git:(fr_c_ipv6) ✗ ./xdb_searcher bench --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Bench finished, {cache_policy: vectorIndex, total: 34159862, took: 857.750s, cost: 24 μs/op}
341.59 万个 IPv6 平均查询耗时为 24 微秒/次。
v3.2.0-release
- PHP binding 提供了对 IPv6 的查询支持,具体使用文档请参考 PHP Binding,测试方式如下:
➜ php git:(master) php search_test.php --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb file: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, ioCount: 2, took: 0.03223 ms}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, ioCount: 21, took: 0.06592 ms}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, ioCount: 14, took: 0.05078 ms}
- php binding 实现引入了命名空间
\ip2region\xdb
来进行管理,将具体的实现封装到了四个核心类,具体如下:
类名 | 描述 |
---|---|
Util | 全部的工具类函数都封装在这个类中,例如:parseIP / loadHeader / loadVectorIndex 等等。 |
IPv4 / IPv6 | IP版本管理类,拆异化的 IPv4/IPv6 管理。 |
Searcher | xdb 查询的具体实现封装,主要提供了 search(string) 和 searchByBytes(bytes) 两个查询接口。 |
- PHP 使用引入方式如下:
// 引入 xdb 类包,require 或者 autoload 对应的 class.
require 'xdb/Searcher.class.php';
// use 申明
use \ip2region\xdb\Util;
use \ip2region\xdb\{IPv4, IPv6};
use \ip2region\xdb\Searcher;
// 类的使用请参考 php binding 的 ReadMe
- 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜ php git:(master) php bench_test.php --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Bench finished, {cachePolicy: vectorIndex, total: 34159862, took: 1587s, cost: 0.046 ms/op}
341.6万个 IPv6 平均查询耗时为 46 微秒/次。
v3.1.0-release
- Java maker 添加连续 IP 段的自动检测和合并,实现和 golang maker 一样的自动压缩效果。
- Java maker 添加 IPv6 xdb 生成的支持,使用方式如下:
// IPv4
java -jar target/ip2region-maker-3.0.0.jar --src=../../data/ipv4_source.txt --dst=./ip2region_v4.xdb --version=ipv4
// IPv6
java -jar target/ip2region-maker-3.0.0.jar --src=../../data/ipv6_source.txt --dst=./ip2region_v6.xdb --version=ipv6
- Java binding 提供了对 IPv6 查询的支持,具体使用文档请参考:Java binding,测试方法如下:
➜ java git:(fr_java_ipv6) ✗ java -jar target/ip2region-3.1.0.jar search --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> 240e:3b7:3272:d8d0:db09:c067:8d59:539e
{region: 中国|广东省|深圳市|家庭宽带, ioCount: 14, took: 424 μs}
IPv6 支持版本的 Maven 坐标如下:
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>3.1.0</version>
</dependency>
v3.0.0-release
- XDB 存储引擎提供了对 IPv6 的支持,同时仓库的 data/ 下提供一份 1.8G+ 的精确到城市级别的 ipv6_source.txt 和一份生成好的 ip2region_v6.xdb 文件。
- Golang maker 提供了对 IPv6 xdb 的生成支持,使用方式如下:
# ipv4
./xdb_maker gen --src=../../data/ipv4_source.txt --dst=./ip2region_v4.xdb --version=ipv4
# ipv6
./xdb_maker gen --src=../../data/ipv6_source.txt --dst=./ip2region_v6.xdb --version=ipv6
- Golang binding 提供了对 IPv6 查询的支持,具体使用文档请参考 Golang binding,测试方式如下:
➜ golang git:(master) ✗ ./xdb_searcher search --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> 240e:87c:892:ffff:ffff:ffff:ffff:ffff
{region: 中国|广东省|深圳市|专线用户, ioCount: 12, took: 130.294µs}
ip2region>>
- IPv4 数据定位信息格式调整为 " 国家 | 省份 | 城市 | ISP",去掉了之前为 0 的区域字段,便于和 IPv6 的数据格式保持一致,使用开源版本的 IPv4 数据的小伙伴记得调整获取字段的小标。