IP查询二分法的运用

赞赏 2016-05-12

之前工作中做过一个需求,有一个文本IP数据源,里面存储IP段和对应的IP地级市。通过IP来定位他在哪个IP段,从而查询他的地理位置。


ps: 当然有现成的免费的IP接口比如淘宝和新浪,但是发现请求量大了经常会返回502,显然免费的都比较贱。只能另谋他策。

  • 解析IP数据源,形式如下
223.253.0.0|223.253.255.255|KR|None|None|None|None|80|0|0|0|0
223.254.0.0|223.254.255.255|CN|OTHER|辽宁|沈阳|None|100|90|60|60|0
223.255.0.0|223.255.6.255|CN|DXTNET|北京|北京|None|100|90|90|90|0
223.255.7.0|223.255.7.255|CN|DXTNET|四川|成都|武侯|83|90|90|90|60
223.255.8.0|223.255.8.255|CN|DXTNET|北京|北京|None|100|90|90|90|0
223.255.9.0|223.255.9.255|CN|DXTNET|广东|深圳|南山|100|90|90|90|60
223.255.10.0|223.255.10.255|CN|DXTNET|山东|济南|历下|100|90|90|90|60
223.255.11.0|223.255.11.255|CN|DXTNET|北京|北京|None|100|90|90|90|0
223.255.12.0|223.255.12.255|CN|DXTNET|重庆|重庆|渝北|83|90|90|90|60
223.255.13.0|223.255.13.255|CN|DXTNET|北京|北京|None|100|90|90|90|0

数据表查询法

  • 刚开始想到把数据源倒入的一张表中,显然这种做法很low,下面是自己没事测试了表的性能
CREATE TABLE IF NOT EXISTS `ip_addr` (
  `start_ip` bigint(20) NOT NULL,
  `end_ip` bigint(20) NOT NULL,
  `short` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `short1` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `country` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
  • 测试查询 某IP 59.173.248.188 ,转换为整型 1001257148
  • 查询语句:SELECT * FROM ip_addr WHERE start_ip<=1001257148 and end_ip>=1001257148
  • 查询结果和时间 1001127936 1001390079 CN CHINANET 湖北,武汉 1 total, Query took 4.4871 sec 耗时近4.5秒
  • 对start_ip和end_ip 建立索引 ALTER TABLE ip_addr ADD INDEX ( start_ip,end_ip ) 再次执行 该查询语句: SELECT * FROM ip_addr WHERE start_ip<=1001257148 and end_ip>=1001257148 查询结果相同 1 total, Query took 1.7607 sec 耗时减少到1.76秒

下面是采用二分法查找Ip

  • 首先把文件数据打包成二进制文件 pack('L',(float)$start_ip).pack('L',(float)$end_ip).pack('L',(float)$offset), 生成baidu_index.dat
  • 然后同样查询 这个IP :59.173.248.188 1001127936 1001390079 CN CHINANET 湖北,武汉
  • 查询时间0.00243091583252 耗时在0.002s 左右...效率差不多提高了800倍 采用二分法循环了19次。
登陆后阅读全文
阅读 1772 赞赏 0 有用 21 没用 1 收藏 4 分享

   


作者声明:本篇文章系本人原创,欢迎分享,但未经许可,谢绝转载。

0 条留言

有经验的老司机的头像

有经验的老司机

年轻人,走!我带你。

有料推荐

这世界欠我一个这样的老公!

高校学生模仿“世界名画”摆拍,可以说是戏精本精了

iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评

果然是高手!这次在日本,特朗普竹杠敲得不是一般狠

资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样

长一样的双胞胎也能识别?蚂蚁金服发布「眼纹识别」技术

苏联是怎么被阿富汗拖垮的?

美团或入局「分时租赁」共享汽车,王兴要大笔投入「泛出行」领域了? | 36氪独家

你或许被“一盘番茄炒蛋”刷屏了,但有人辛酸,有人质疑

iPhone X发售前夜,黄牛与苹果公司的不安

他的文章

电脑无线连接安卓手机 进入android命令行模式(完胜adb shell数据线连接方式)

iTerm2配置clone session功能

如何科学上网(翻墙)

php5.6-和php5.6 CURL 上传文件的一个坑

如何修改lumen storage path/log path

php.ini 设置了 error_log 为什么不生效?

IP查询二分法的运用

iframe 的高度自适应 iframe 内容页面的高度解决方案

手机扫一扫
分享文章