Ip2region|离线IP地址定位,10微秒出结果
【免费下载链接】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
很多做风控、广告投放和 CDN 的同学都绕不开一个需求:IP地址定位。ip2region 是一个完全离线的 IP 定位库加 IP 数据管理框架,IPv4 和 IPv6 都支持,单次查询能做到 10 微秒级别。它不需要联网调第三方接口,把 xdb 数据文件放进项目里就能查,适合想省掉在线查询成本、又要扛住高并发的后端和开发者。
它到底能干什么:离线IP查询快到什么程度
微秒级完成一次IP定位查询
纯基于 xdb 文件的查询,单次响应也在 10 微秒级别。开启 vIndex 索引缓存会占用固定 512KiB 内存缓存向量索引,省掉一次磁盘 IO,平均查询效率保持在 100 微秒以内;把整个 xdb 文件读进内存后,内存占用就等于文件大小,查询稳定在 10 微秒级别,这个真香。
亿级IP段自动合并与压缩
xdb 数据格式能承载亿级别的 IP 数据段行数。生成程序会自动检查并完成相连 IP 段的合并,同时对相同地域信息做去重和压缩,最终数据文件比原始数据小得多,库大小始终可控。
自定义region存储业务数据
内置数据的 region 格式是国家|省份|城市|ISP|iso-alpha2-Code,但字段完全允许自定义,你可以往 region 后面追加 GPS 信息、国际统一地域编码、邮编等。换句话说,ip2region 不只是查询库,还能当自己的 IP 定位数据管理框架用。
统一接口同时查IPv4和IPv6
xdb 提供版本兼容的查询实现,一套统一 API 同时支持 IPv4 和 IPv6 数据,返回统一格式。双栈服务不用维护两套查询逻辑,代码里也不用自己判断协议版本。
多语言客户端一览
| 语言 | 查询 | 数据生成 | 备注 |
|---|---|---|---|
| Golang | ✓ | ✓ | 提供双协议并发安全查询服务 |
| Java | ✓ | ✓ | 提供并发安全查询服务 |
| Python | ✓ | ✓ | 生成器仅支持 IPv4 |
| Rust | ✓ | ✓ | |
| C | ✓ | — | C99/POSIX 实现 |
| C++ | ✓ | ✓ | |
| C# | ✓ | ✓ | 生成器仅支持 IPv4 |
| PHP | ✓ | — | 仅查询客户端 |
| JavaScript | ✓ | — | Node.js / TypeScript |
| Lua / Lua C | ✓ | — | 纯 Lua 与 C 扩展两种实现 |
| Erlang | ✓ | — | |
| Nginx | ✓ | — | 以扩展模块形式集成 |
| Cangjie | ✓ | — | 仓颉语言 |
如果你的技术栈不在上表,可以翻一下 binding/ 目录,里面还有社区贡献的绑定,以及 Ruby、Node.js 等第三方实现。
三个真实业务场景
风控反爬
网关在入口处对每个请求 IP 做一次本地查询,拿到国家和 ISP 信息,同一地区同一运营商的异常流量直接本地标记拦截。整条判断路径不产生一次外网调用,扛住爬虫洪峰的同时几乎不增加服务延迟。
广告地域定向
广告投放链路对延迟极其敏感,地域判断必须走在毫秒级的热路径里。离线查询加整库内存缓存让单次定位只需 10 微秒,"用户在哪个城市"这一步基本不会出现在性能分析结果里。
CDN 就近调度
调度层需要频繁查询各节点 IP 所在城市,来计算最近的边缘节点。本地文件查询不受外部查询服务的配额和带宽限制,调度决策可以随业务规模放心放大。
拿到数据后怎么维护
数据有两条更新路径。手动编辑:各 maker 工具自带编辑能力,Golang 版 maker/golang/ 和 C++ 版 maker/cpp/ 都提供 IP 原始数据编辑器,配合官方数据源或项目 Issue 里的更新条目,修正 data/ipv4_source.txt、data/ipv6_source.txt 后重新生成 xdb 即可。检测自动更新:如果你有自己的 API 或数据源,可以参照项目方分享的"检测算法"思路写更新程序,自动对比新旧数据并增量修正。
踩坑提醒(并发与内存)
- ⚠️ 注意:基于文件和 vIndex 缓存两种模式的查询对象不是并发安全的,每个线程/协程要单独创建 searcher 使用,共享的是只读的 vIndex 缓存。
- ⚠️ 注意:用整个 xdb 文件缓存创建的查询对象才天生并发安全,可以直接做成全局对象跨线程共享,高并发场景建议这么用。
- ⚠️ 注意:内存账要提前算清——vIndex 固定 512KiB,全量缓存的占用就是 xdb 文件大小,上内存前先看看文件有多大。
需要说明一下边界:ip2region 内置的原始数据更新不固定,对数据新鲜度要求极高的场景建议向官方社区获取更新的离线数据;项目本身专注的是 IP 数据的存储设计与极速查询,这块它做得很扎实。想动手试试的话,直接克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ip/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
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考