如何快速上手ip2region:离线IP地址定位库的完整指南
【免费下载链接】ip2regionIp2region is an offline IP-to-Region localization library and IP data management framework with both IPv4 and IPv6 supports, 10-microsecond level query efficiency, xdb search client for many programming languages项目地址: https://gitcode.com/GitHub_Trending/ip/ip2region
ip2region 是一个离线 IP 地址定位库与数据管理框架,同时支持 IPv4 与 IPv6,全内存缓存下单次查询响应为 10 微秒级,提供 14 种主流语言的 xdb 搜索客户端,全程无需联网。
ip2region 适合谁:三个真实场景
这一节帮你判断自己是否对号入座,看完两分钟就能确定要不要继续读下去。
- 日志溯源陌生 IP:安全运营拿到一条告警,需要把日志里的 IP 批量翻译成"国家|省份|城市|运营商",不想依赖在线接口。
- 离线环境做风控:内网、私有化部署环境没有外网出口,IP 定位只能走本地库文件。
- 批量处理地址数据:给百万级 IP 列表补区域字段,按 CSV 逐行过一遍 xdb 即可,微秒级查询不会拖慢整个任务。
核心亮点速览
看完这张表,你就有了 ip2region 能力边界的整体印象:哪些是它自带的,哪些数字可以直接写进方案。
| 特性 | 说明 |
|---|---|
| 离线查询 | 内置 data/ip2region_v4.xdb、data/ip2region_v6.xdb,断网可用 |
| 10 微秒级查询 | content 全缓存策略下单次查询 10μs 级;file 策略(纯磁盘)也保持百微秒内 |
| 双协议统一接口 | 同一 API 同时查 IPv4 和 IPv6,返回统一格式 |
| 三级缓存策略 | file / vectorIndex(固定 512KiB)/ content,速度与内存可权衡 |
| 14 种语言绑定 | Golang、Java、Python、C、C++、Rust、PHP、JS 等均有搜索客户端 |
| 可管理自定义数据 | xdb 支持上亿行 IP 分段,区域字段可追加 GPS、邮编等自定义内容 |
定位精度为城市级,中国区域为中文、海外为英文,字段格式固定为国家|省份|城市|运营商|ISO-alpha2码。
支持的编程语言与代码入口
这一节不逐语言讲解,只告诉你每种语言的核心代码入口在哪,点进去直接看实现。
- Go:binding/golang/xdb/searcher.go
- Java:binding/java/src/main/java/org/lionsoul/ip2region/xdb/Searcher.java
- Python:binding/python/ip2region/searcher.py
- C:binding/c/xdb_searcher.c
- C++:binding/cpp/src/search.cc
- C#:binding/csharp/IP2Region.Net/XDB/Searcher.cs
- Rust:binding/rust/ip2region/src/searcher.rs
- JavaScript:binding/javascript/searcher.js
每种语言目录下都有独立的README.md,含该语言的 API 说明和测试程序用法。
从零跑通:三步最小可用流程
跟着做,大约五分钟可以拿到第一条定位结果。
第 1 步:获取项目
git clone https://gitcode.com/GitHub_Trending/ip/ip2region cd ip2region数据文件data/ip2region_v4.xdb已随仓库提供,克隆完即可直接查询,无需先生成。
第 2 步:选择初始化方式
各语言创建 searcher 时都要指定一种缓存策略,本质是"速度 ↔ 内存"的权衡:
- QPS 不高、内存敏感 →
file:不缓存,每次查询走磁盘随机读; - 大多数服务场景 →
vectorIndex:固定 512KiB 内存缓存向量索引,省一次磁盘 IO,平均查询控制在 100 微秒内(推荐默认值); - 高 QPS、内存宽裕 →
content:整个 xdb 文件载入内存,无磁盘 IO,稳定 10 微秒级,内存占用等于文件大小。
第 3 步:跑通第一段查询
以 Python 为例,用vectorIndex策略查询 v4 数据:
import io import ip2region.util as util import ip2region.searcher as xdb db_path = "data/ip2region_v4.xdb" handle = io.open(db_path, "rb") header = util.load_header(handle) version = util.version_from_header(header) v_index = util.load_vector_index(handle) handle.close() searcher = xdb.new_with_vector_index(version, db_path, v_index) print(searcher.search("8.8.8.8")) print(searcher.search("114.114.114.114")) searcher.close()预期输出形如美国|加利福尼亚|山景城|Google。返回空字符串表示该 IP 在数据中没有记录,属于正常情况。
进阶玩法(按需选读)
批量查询提速
什么时候需要:一次性给十万级 IP 列表补区域字段,逐条查也嫌慢或想压低耗时。
searcher 实例可以复用,创建一次后循环调用search即可;批量任务建议直接用content策略并预热后再计数:
c_buffer = util.load_content(handle) searcher = xdb.new_with_buffer(version, c_buffer) for ip in ip_list: # 循环复用同一个 searcher regions.append(searcher.search(ip))注意:util.load_content会把整个 xdb 读进内存,内存峰值 ≈ 文件大小 × 1,数据文件很大时先确认机器内存余量。
并发安全与搜索器池
什么时候需要:多线程/多协程服务里共享一个 searcher 会出现竞态,需要每线程一个实例。
Java 绑定的 SearcherPool 内置了借还机制(Golang 的service包同样提供):
Config config = Config.custom() .setXdbPath("data/ip2region_v4.xdb") .setCachePolicy(Config.VIndexCache) .setSearchers(10) .asV4(); SearcherPool pool = SearcherPool.create(config); Searcher searcher = pool.borrowSearcher(); try { String region = searcher.search("114.114.114.114"); } finally { pool.returnSearcher(searcher); // 必须归还 }注意:borrowSearcher在池耗尽时会阻塞,setSearchers的并发数要按你的线程模型设定,不要无限放大。
验证与自检
这一节给你两个可执行的检查入口,用来确认前面的流程没走偏。
- 功能验证:运行 binding/python/search_test.py,交互提示
ip2region>>下输入127.0.0.1,预期看到{region: ..., ioCount: N, took: X μs},region 非空且 took 在百微秒量级即正常。 - 性能基准:运行 binding/python/bench_test.py 跑一轮基准测试,对比 file / vectorIndex / content 三种策略的耗时,确认选定的缓存策略符合你的性能预期。
- Java 侧可直接跑 SearcherTest.java,预期全部断言通过。
深入阅读地图
| 资源 | 什么时候看它 |
|---|---|
| README_zh.md | 官方总文档,含 xdb 结构、查询流程等技术说明 |
| data/README.md | 了解 xdb 文件与原始数据ipv4_source.txt的字段格式 |
| maker/golang/README.md | 需要用自己的数据生成/更新 xdb 时(另含 Java、Python、C#、Rust、C++ 版 maker) |
| binding/nginx/ | 想在 Nginx 层直接按请求 IP 输出区域变量时 |
| data/sample/ | 查看 IP 分段、数据修复示例,配合 maker 编辑数据用 |
现在你可以把 ip2region 的 xdb 文件直接接进日志平台、风控规则引擎或数据 ETL 流水线,在断网环境里稳定输出城市级的 IP 定位结果。
【免费下载链接】ip2regionIp2region is an offline IP-to-Region localization library and IP data management framework with both IPv4 and IPv6 supports, 10-microsecond level query efficiency, xdb search client for many programming languages项目地址: https://gitcode.com/GitHub_Trending/ip/ip2region
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考