Ip2region介绍

这篇具有很好参考价值的文章主要介绍了Ip2region介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Ip2region 是什么

ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

Ip2region 特性

1、标准化的数据格式

每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。

2、数据去重和压缩

xdb 格式生成程序会自动去重和压缩部分数据,默认的全部 IP 数据,生成的 ip2region.xdb 数据库是 11MiB,随着数据的详细度增加数据库的大小也慢慢增大。

3、极速查询响应

即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别,可通过如下两种方式开启内存加速查询:

  1. vIndex 索引缓存 :使用固定的 512KiB 的内存空间缓存 vector index 数据,减少一次 IO 磁盘操作,保持平均查询效率稳定在10-20微秒之间。
  2. xdb 整个文件缓存:将整个 xdb 文件全部加载到内存,内存占用等同于 xdb 文件大小,无磁盘 IO 操作,保持微秒级别的查询效率。

4、IP 数据管理框架

v2.0 格式的 xdb 支持亿级别的 IP 数据段行数,region 信息也可以完全自定义,例如:你可以在 region 中追加特定业务需求的数据,例如:GPS信息/国际统一地域信息编码/邮编等。也就是你完全可以使用 ip2region 来管理你自己的 IP 定位数据。

xdb数据查询

API 介绍,使用文档和测试程序请参考对应 searcher 查询客户端下的 ReadMe 介绍,全部查询 binding 实现情况如下:

Ok? 状态 编程语言 描述 贡献者
已完成 golang golang xdb 查询客户端实现 Lion
已完成 php php xdb 查询客户端实现 Lion
已完成 java java xdb 查询客户端实现 Lion
已完成 lua 纯 lua xdb 查询客户端实现 Lion
已完成 c ANSC c xdb 查询客户端实现 Lion
已完成 lua_c lua c 扩展 xdb 查询客户端实现 Lion
待开始 rust rust xdb 查询客户端实现 Lion
已完成 python python xdb 查询客户端实现 厉害的花花
已完成 nodejs nodejs xdb 查询客户端实现 Wu Jian Ping
已完成 csharp csharp xdb 查询客户端实现 Alen Lee
待开始 php_ext php c 扩展 xdb 查询客户端实现 待确定
待开始 nginx nginx 扩展 xdb 查询客户端实现 待确定

ip2region python 查询客户端实现

使用方式
完全基于文件的查询
from xdbSearcher import XdbSearcher

def searchWithFile():
    # 1. 创建查询对象
    dbPath = "./ip2region.xdb"
    searcher = XdbSearcher(dbfile=dbPath)
    
    # 2. 执行查询
    ip = "1.2.3.4"
    region_str = searcher.searchByIPStr(ip)
    print(region_str)
    
    # 3. 关闭searcher
    searcher.close()
缓存 VectorIndex 索引

我们可以提前从 xdb 文件中加载出来 VectorIndex 数据,然后全局缓存,每次创建 Searcher 对象的时候使用全局的 VectorIndex 缓存可以减少一次固定的 IO 操作,从而加速查询,减少 IO 压力。

from xdbSearcher import XdbSearcher

def searchWithVectorIndex():
     # 1. 预先加载整个 xdb
    dbPath = "../../data/ip2region.xdb"
    vi = XdbSearcher.loadVectorIndexFromFile(dbfile=dbPath)

    # 2. 使用上面的缓存创建查询对象, 同时也要加载 xdb 文件
    searcher = XdbSearcher(dbfile=dbPath, vectorIndex=vi)
    
    # 3. 执行查询
    ip = "1.2.3.4"
    region_str = searcher.search(ip)
    print(region_str)

    # 4. 关闭searcher
    searcher.close()
缓存整个 xdb 数据

我们也可以预先加载整个 ip2region.xdb 的数据到内存,然后基于这个数据创建查询对象来实现完全基于文件的查询,类似之前的 memory search。

from xdbSearcher import XdbSearcher

def searchWithContent():
    # 1. 预先加载整个 xdb
    dbPath = "../../data/ip2region.xdb";
    cb = XdbSearcher.loadContentFromFile(dbfile=dbPath)
    
    # 2. 仅需要使用上面的全文件缓存创建查询对象, 不需要传源 xdb 文件
    searcher = XdbSearcher(contentBuff=cb)
    
    # 3. 执行查询
    ip = "1.2.3.4"
    region_str = searcher.search(ip)
    print(region_str)

    # 4. 关闭searcher
    searcher.close()
查询测试

通过 search_test.py 脚本来进行查询测试:

➜  python git:(python_dev) ✗ python3 ./search_test.py
python3 search_test.py [command options]
options:
 --db string             ip2region binary xdb file path
 --cache-policy string   cache policy: file/vectorIndex/content

例如:使用默认的 data/ip2region.xdb 进行查询测试:

➜  python git:(python_dev) ✗ python3 ./search_test.py --db=../../data/ip2region.xdb --cache-policy=content
ip2region xdb searcher test program, cachePolicy: content
type 'quit' to exit
ip2region>> 1.2.3.4
region :美国|0|华盛顿|0|谷歌 , took 0.0689 ms
ip2region>> quit
searcher test program exited, thanks for trying

输入 ip 即可进行查询测试。也可以分别设置 cache-policy 为 file/vectorIndex/content 来测试三种不同缓存实现的效率。

bench 测试

通过 bench_test.py 脚本来进行自动 bench 测试,一方面确保 xdb 文件没有错误,另一方面通过大量的查询测试平均查询性能:

➜  python3 ./bench_test.py
python bench_test.py [command options]
options:
 --db string             ip2region binary xdb file path
 --src string            source ip text file path
 --cache-policy string   cache policy: file/vectorIndex/content

例如:通过默认的 data/ip2region.xdb 和 data/ip.merge.txt 来进行 bench 测试:

➜  python3 ./bench_test.py --db=../../data/ip2region.xdb --src=../../data/ip.merge.txt --cache-policy=content
Bench finished, [cachePolicy: content, total: 3417955, took: 34.93 s, cost: 0.0094 ms/op]

可以通过设置 cache-policy 参数来分别测试 file/vectorIndex/content 三种不同的缓存实现的的性能。 @Note:请注意 bench 使用的 src 文件需要是生成对应的 xdb 文件的相同的源文件。

xdb 数据生成

API 介绍,使用文档和测试程序请参考对应 maker 生成程序下的 ReadMe 介绍,全部生成 maker 实现情况如下:

Ok? 状态 编程语言 描述 贡献者
已完成 golang golang xdb 生成程序实现 Lion
已完成 java java xdb 生成程序实现 Lion
待开始 c ANSC c xdb 生成程序实现 Lion
已完成 python python xdb 生成程序实现 leolin49
已完成 csharp csharp xdb 生成程序实现 Alan Lee

ip2region xdb python 生成实现

脚本执行
# 切换到python maker 根目录
> python main.py
ip2region xdb maker
main.py [command] [command options]
Command:
  gen      generate the binary db file
xdb 数据生成

通过 python main.py gen 命令生成 ip2region.xdb 二进制文件:

➜  python main.py gen
main.py gen [command options]
options:
 --src string    source ip text file path
 --dst string    destination binary xdb file path

例如,使用默认的 data/ip.merge.txt 作为源数据,生成一个 ip2region.xdb 到当前目录:

➜  python main.py gen --src=../../data/ip.merge.txt --dst=./ip2region.xdb
# 会看到一堆输出,最终会看到类似如下输出表示运行结束
...
2022-07-13 19:58:00,540-root-238-INFO - write done, dataBlocks: 13804, indexBlocks: (683591, 720221), indexPtr: (982904, 11065984)
2022-07-13 19:58:00,540-root-63-INFO - Done, elapsed: 3m3s
xdb 数据查询 和 bench 测试

基于xdb 格式的查询功能和测试见 ip2region binding

并发查询必读

全部查询客户端的 search 接口都 不是 并发安全的实现,不同进程/线程/协程需要通过创建不同的查询对象来安全使用,并发量很大的情况下,基于文件查询的方式可能会导致打开文件数过多的错误,请修改内核的最大允许打开文件数(fs.file-max=一个更高的值),或者将整个xdb加载到内存进行安全并发使用。

相关备注

1、使用声明

ip2region 重点在于研究 IP 定位数据的存储设计和各种语言的查询实现,并没有原始 IP 数据的支撑,本项目不保证及时的数据更新,没有也不会有商用版本,你可以使用自定义的数据导入 ip2region 进行管理。

2、数据更新

基于检测算法的数据更新方式视频分享:数据更新实现视频分享 - part1,数据更新实现视频分享 - part2文章来源地址https://www.toymoban.com/news/detail-595190.html

3、数据结构

  1. xdb 数据结构分析:“ip2region xdb 数据结构和查询过程详解“
  2. xdb 查询过程分析:“ip2region xdb 数据结构和查询过程详解”
  3. xdb 生成过程分析:“ip2region xdb 二进制数据生成过程详解”

参考文献

  • https://github.com/zoujingli/ip2region

到了这里,关于Ip2region介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【GitHub精选项目】IP 地址转地理位置:ip2region 完全指南

    本文为大家带来的是 lionsoul2014 开发的 ip2region 项目,一种高效的离线 IP 地址定位库。ip2region 提供了10微秒级别的查询效率,支持多种主流编程语言,是一种理想的 IP 定位解决方案。 这个开源项目可以实现 IP 地址到地理位置的精确映射,包括国家、省份、城市、运营商等信

    2024年02月04日
    浏览(34)
  • Stable Diffusion 绘画入门教程(webui)-ControlNet(IP2P)

    上篇文章介绍了深度Depth,这篇文章介绍下IP2P(InstructP2P), 通俗理解就是图生图,给原有图加一些效果,比如下图,左边为原图,右边为增加了效果的图: 玩法流程和之前一样哦 我这里用的大模型是\\\"anything-v5-PrtRE.safetensors\\\",选用不同模型生成效果会有区别,可以自己找喜欢的

    2024年04月25日
    浏览(55)
  • PLC采集串口被占用、网口被占用,网络IP地址不能修改、多台设备IP不同网段等问题解决方案

    以下是我们总结的项目中解决办法,经济实用。 一、串口被占用(具体项目中需要的型号选项请联系官网) 1、 在项目实施过程中,串口被占用很常见。一般我们使用协议转换器,直接转换成标准以太网协议。如西门子PPI、MPI转换成S7协议,兼容编程软件。 2、三菱PLC ,FX系列转

    2024年02月13日
    浏览(50)
  • Python爬虫被封ip解决方案

    在使用 Python 程序进行网络爬虫开发时,可能因以下原因导致被封 IP 或封禁爬虫程序: 1、频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次,从而对目标网站造成较大的负担和压力,这种行为容易引起目标网站的注意并被封禁IP或限制访问。 2、突然访问量增大

    2024年02月06日
    浏览(68)
  • Python爬虫被封ip的解决方案

    目录 一、网站反爬虫机制有哪些 二、Python爬虫被封ip的原因 三、爬虫被封IP怎么解决 四、代码示例 在爬虫程序运行过程中,被封禁IP地址是常见的问题之一。这通常是由于目标网站采取了反爬虫机制,例如限制单个IP地址的请求频率或识别请求特征等。当爬虫被封禁IP时,我

    2024年02月06日
    浏览(40)
  • IP广播对讲系统停车场解决方案

    IP广播对讲系统 停车场解决方案 一、需求分析     随着国民经济和社会的发展, 选择 坐车 出行的民众越来越多。在保护交通 安全 的同时,也给 停车场 服务部门提出了更高的要求 。人们 对 停车场系统 提出了更高的要求与挑战, 需要 停车场系统 提高工作效率与服务水

    2024年04月09日
    浏览(53)
  • EtherCAT转TCP/IP网关EtherCAT解决方案

    你是否曾经为生产管理系统的数据互联互通问题烦恼过?曾经因为协议不同导致通讯问题而感到困惑?现在,我们迎来了突破性的进展! 介绍捷米特JM-TCPIP-ECT,一款自主研发的Ethercat从站功能的通讯网关。它能够连接到Ethercat总线中做为从站使用,同时也可以连接到TCP/IP网络

    2024年02月16日
    浏览(39)
  • 思科路由器IP源地址的攻击的解决方案

      一、在UDP flooding中,攻击者则是通过连接目标系统的changen端口到伪造源地址指向的主机的echo端口,导致changen端口产生大量的随机字符到echo端口,而echo端口又将接收到的字符返回,最后导致两个系统都因耗尽资源而崩溃。 二、为了防御UDP flooding,我们必须防止路由器的诊

    2024年02月05日
    浏览(89)
  • 电信不提供公网IP怎么解决?快解析内网穿透解决方案

    由于现在电信运营商的政策调整,加上受到网络服务架构的影响,一些用户在使用宽带连接时,往往会遇到电信不提供公网IP的情况。这种情况下,我们可能会受到一些限制,特别是对于需要对外提供服务或进行远程访问的场景而言,这个影响会更加大。 1.公网IP是什么 在互

    2024年02月12日
    浏览(48)
  • IP编址,IP地址介绍与子网划分方法

    知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系!  网络层位于数据链路层与传输层之间。网络层中包含了许多协议,其中最为重要的协议就是 IP 协议。网络层提供了 IP 路由功能。理解 IP 路由除了要熟悉 IP 协议的工作机制之外,还必须理解 IP 编址

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包