再见iptaobao全网显示IP归属地快用这个开源库( 二 )


0.1x毫秒
0.1x毫秒
php5_ext
php5的c扩展
已完成
0.0x毫秒
0.0x毫秒
0.00x毫秒
php7_ext
php7的c扩展
已完成
0.0毫秒
0.0x毫秒
0.00x毫秒
python
python bindng
已完成
0.x毫秒
0.x毫秒
0.x毫秒
rust
rust binding
已完成
0.x毫秒
0.x毫秒
0.x毫秒
Ip2region V2.0 特性 1、标准化的数据格式
每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家 , 后前的选项全部是0 。
2、数据去重和压缩
xdb 格式生成程序会自动去重和压缩部分数据,默认的全部 IP 数据,生成的 ip2region.xdb 数据库是 11MiB,随着数据的详细度增加数据库的大小也慢慢增大 。
3、极速查询响应
即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别,可通过如下两种方式开启内存加速查询:
vIndex 索引缓存 :使用固定的 512KiB 的内存空间缓存 Vector index 数据,减少一次 IO 磁盘操作,保持平均查询效率稳定在10-20微秒之间 。xdb 整个文件缓存:将整个 xdb 文件全部加载到内存,内存占用等同于 xdb 文件大小 , 无磁盘 IO 操作,保持微秒级别的查询效率 。4、极速查询响应
v2.0 格式的 xdb 支持亿级别的 IP 数据段行数 , region 信息也可以完全自定义,例如:你可以在 region 中追加特定业务需求的数据,例如:GPS信息/国际统一地域信息编码/邮编等 。也就是你完全可以使用 ip2region 来管理你自己的 IP 定位数据 。
ip2region xdb java 查询客户端实现使用方式引入maven仓库:
org.lionsoulip2region2.6.4完全基于文件的查询import org.lionsoul.ip2region.xdb.Searcher;import java.io.*;import java.util.concurrent.TimeUnit;public class SearcherTest {public static void main(String[] args) {// 1、创建 searcher 对象String dbPath = "ip2region.xdb File path";Searcher searcher = null;try {searcher = Searcher.newWithFileOnly(dbPath);} catch (IOException e) {System.out.printf("failed to create searcher with `%s`: %sn", dbPath, e);return;}// 2、查询try {String ip = "1.2.3.4";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): %sn", ip, e);}// 3、备注:并发使用,每个线程需要创建一个独立的 searcher 对象单独使用 。}}缓存VectorIndex索引我们可以提前从 xdb 文件中加载出来 VectorIndex 数据 , 然后全局缓存,每次创建 Searcher 对象的时候使用全局的 VectorIndex 缓存可以减少一次固定的 IO 操作,从而加速查询 , 减少 IO 压力 。
import org.lionsoul.ip2region.xdb.Searcher;import java.io.*;import java.util.concurrent.TimeUnit;public class SearcherTest {public static void main(String[] args) {String dbPath = "ip2region.xdb file path";// 1、从 dbPath 中预先加载 VectorIndex 缓存,并且把这个得到的数据作为全局变量 , 后续反复使用 。byte[] vIndex;try {vIndex = Searcher.loadVectorIndexFromFile(dbPath);} catch (Exception e) {System.out.printf("failed to load vector index from `%s`: %sn", dbPath, e);return;}// 2、使用全局的 vIndex 创建带 VectorIndex 缓存的查询对象 。Searcher searcher;try {searcher = Searcher.newWithVectorIndex(dbPath, vIndex);} catch (Exception e) {System.out.printf("failed to create vectorIndex cached searcher with `%s`: %sn", dbPath, e);return;}// 3、查询try {String ip = "1.2.3.4";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): %sn", ip, e);}// 备注:每个线程需要单独创建一个独立的 Searcher 对象,但是都共享全局的制度 vIndex 缓存 。}}缓存整个xdb数据我们也可以预先加载整个 ip2region.xdb 的数据到内存,然后基于这个数据创建查询对象来实现完全基于文件的查询 , 类似之前的 memory search 。