离线 IP 定位 10 微秒级响应:ip2region 多语言实战与选型
【免费下载链接】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
你以为定位一次 IP 要几十毫秒?ip2region 的实测响应是 10 微秒量级。它是一个完全离线的 IP 定位库兼 IP 数据管理框架:IPv4/IPv6 双协议,xdb 二进制数据文件随仓库自带,查询不依赖任何外部服务,数据不出机器。
项目速览
它的核心是 xdb 这种紧凑的二进制存储格式:仓库自带 IPv4 与 IPv6 的原始数据和编译好的 xdb 文件,查询结果形如国家|省份|城市|ISP|国家码,中国大陆地区为中文,海外为英文。生成 xdb 时会自动合并相邻 IP 段、对相同区域信息去重压缩,亿级数据段都能容纳。和在线 API 类方案相比,它有两个记忆点:一是全程本地运行,无网络依赖、延迟稳定在微秒级;二是数据可完全定制,region 字段可以追加 GPS、邮编、国际区域码等自己的业务字段,整个框架可以直接当 IP 数据管理系统用。ip2region 的多语言绑定覆盖 Go、Java、Python、Rust、C/C++、PHP、Lua、C#、Erlang、Nginx 等 15 种语言,xdb 生成工具链同样提供多语言版本。
典型用法:ip2region 缓存策略选型
ip2region 缓存策略选型主要看两件事:并发量和内存预算。三种策略的取舍如下:
| 缓存策略 | 内存占用 | 查询速度 | 适用场景 |
|---|---|---|---|
| FileOnly | 最低 | 较慢(多一次磁盘 IO) | 内存敏感、低频查询 |
| VectorIndex | 固定 512KiB | 快(百微秒内) | 多数业务的默认选择 |
| Content | 等于 xdb 文件大小 | 最快(微秒级) | 高频查询、内存充足 |
按场景对号入座:
- 高并发网关、风控场景:用 Go 的
service查询服务(v3.11.0 起提供),内置 searcher 池、API 并发安全、自动识别 v4/v6,官方推荐优先使用。 - 技术栈不在 Go 里:到
binding/下挑对应语言绑定,思路一致——选缓存策略,再指定 xdb 路径。 - 内存紧张、偶尔查一次:FileOnly 策略,纯文件查询,不占额外内存。
- 查询高频、内存充足:Content 策略,整个 xdb 载入内存,全内存查询。
一句话结论:多数业务直接选 VectorIndex 就够,剩下两类场景再按需切换。
核心操作路径:跑通 ip2region 离线查询
拿数据文件,选一个缓存策略
git clone https://gitcode.com/GitHub_Trending/ip/ip2regionip2region xdb 数据文件都在data/目录:ip2region_v4.xdb(约 11MB)、ip2region_v6.xdb(约 37MB),以及原始数据ipv4_source.txt/ipv6_source.txt。选定策略后注意:版本参数必须与 xdb 文件匹配,v4 文件配v4,不匹配时查询会直接报错。
写最小查询代码(以 Python 为例)
import ip2region.util as util import ip2region.searcher as xdb with open("../../data/ip2region_v4.xdb", "rb") as f: v_index = util.load_vector_index(f) searcher = xdb.new_with_vector_index( util.version_from_name("v4"), "../../data/ip2region_v4.xdb", v_index) print(searcher.search("114.114.114.114")) searcher.close()在binding/python目录下运行即可,返回形如国家|省份|城市|ISP|国家码的字符串。其他语言的等价写法见binding/下各自的 README。
进阶与边界
如果你遇到下面几种情况,再回来看这一节。
- 并发场景:优先用带 searcher 池的查询服务,池大小按实际并发设置,每次查询从池里借 searcher,用完归还。Go 示例:
v4c, _ := service.NewV4Config(service.VIndexCache, "data/ip2region_v4.xdb", 20) v6c, _ := service.NewV6Config(service.VIndexCache, "data/ip2region_v6.xdb", 20) ip2region, _ := service.NewIp2Region(v4c, v6c) region, _ := ip2region.Search("113.92.157.29")注意 BufferCache 策略下是单实例并发安全查询,池数量会被忽略。
- IPv6:换
ip2region_v6.xdb、version 改v6即可,API 不变;Go 的 service 用法里 v4/v6 双配置,一个入口查两种地址。 - 批量查询:没有专门的批量 API,循环调用即可。单次成本在微秒级,批量的瓶颈通常不在查询本身,而在 IO 和内存布局。
- 自定义数据:想在 region 里追加业务字段,或用自己的数据源重建库,走
maker/下的多语言生成工具链重新产出 xdb。
上线前检查清单 ✅
- 服务启动时执行一次 xdb 校验(如
util.verify_from_file),确认 searcher 与数据文件版本匹配;校验别放进每次查询的热路径 - 确认
data/ipv4_source.txt等原始数据是可用版本,必要时用 maker 工具链重新生成 xdb - 抽几个真实业务 IP 查询并人工核对结果
- 跑一遍绑定自带测试,如在
binding/python下执行python search_test.py --db=../../data/ip2region_v4.xdb - 高并发服务压测一次,确认 searcher 池大小与缓存策略匹配实际 QPS
延伸阅读
- Go 查询客户端文档:service 查询服务与三种缓存策略的完整说明
- Python 查询客户端文档
- Go xdb 生成工具:自定义数据与重新生成 xdb
- IPv4 原始数据
- 核心查询实现
对 xdb 数据结构、数据更新机制有疑问,或踩过有意思的坑,欢迎通过项目 Issue 参与讨论。
【免费下载链接】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),仅供参考