IP快速查找数据库

最近一段时间,在研究PHP的共享内存。于是,我想尝试一下共享内存和普通文件相比,能提高多少的性能。本来想简单的把纯真IP数据库导入到共享内存然后查询。

但是,后来发现这个数据库设计过于复杂,查询IP速度非常的慢,于是我对这个数据库的结构重新进行了设计。

头部:4 * 4 个字节。就记录一个总数

//总数|0|0|0

索引区: (区域ID的格式:前 24 个bit是区域在文件中的的offset,后8个bit是长度,这样区域的名称长度不能超过255个字节)
//start|end|区域ID1|区域ID2
//start|end|区域ID1|区域ID2
数据区:简单的把所有区域的名称写在这块区域(过滤掉重复的数据)

//string1|string2|string3|string4...

这样简单化了查找:首先是读取总数,然后确定二分查找区域。查找到数据后,根据区域ID读取区域信息。

最后,经过测试,

纯真IP的原版查找速度是 1504个/s

改进IP查询文件版本查找速度是 3977 个/s

共享内存版本的查找速度是 6325个/s

因为涉及的文件太多,我不直接在这里拷贝代码,大家去google code 上去下载。

 

http://code.google.com/p/quickip

 

[

这个项目的开发计划:

0.5 版:发布一个PHP扩展,更加快速的查找IP,目前的速度是每秒 44万次查询。(目前已经开发完成,但是要做兼容linux 和 相关的文档工作)

1.0 版:发布查询的时候,分离:国家 省 市 区 详细地区 五个部分。(目前省份已经完成,但是市,和 区 还没有处理)

后面的版本现在没有计划。

]

 

运行:

先 运行:qqwry_tool/build_csv.php ,从纯真IP导出数据

然后 运行 :test/bulid_index.php,创建数据和索引

如果要测试 shmop 请先安装shmop这个PHP扩展,然后运行: shmop/shmop.create.php

接下来运行测试文件: test/ip_find.test.php test/ip_find_qqwry.php

原版的PHP版本的纯真IP有bug,导致不能完整的导出区域2. 我这里没有做修改,

所以data 目录下面生成的测试结果的区域2,可能会不一致。

 

 注意:

qqwry  这个文件夹 是纯真IP的代码。不是本人写的。要符合纯真IP 的licence。

原文地址:https://www.cnblogs.com/niniwzw/p/1974208.html