每次请求都需要加载10m的纯真IP qqwry.dat 文件,自己测试不会发现问题,但如果访问量上去了,会影响每次请求的相应效率,并且会消耗一定的io读写,故打算优化
优化方案
每个IP区间之间不存在交集,每个查找只要按score查找区间[ip2long(ip), ip2long(ip) + N],N的值必需足够大,确保结束IP的值大于当前区间的结束IP。这个有点难理解,举个栗子:
有3个区间
Value Score
36 60
61 67
68 68查找IP=50时,查找的score为[50, 50 + N],且要满足50 + N >= 60,否则就无法找到[36, 60]这个区间。
qqwry.dat 转为txt文件
首先下载IPLook软件,操作如下
写入redis
<?php
if (ini_set('memory_limit', '256M')) { echo 'Memory limit set to 256M successfully' . "\n";
} else { echo 'Failed to set memory limit to 256M' . "\n";
}$IPData = file_get_contents('IPData.txt');
$IPData = explode("\n", $IPData);
var_dump(count($IPData));
var_dump($IPData[0]);
var_dump($IPData[1]);
unset($IPData[0]);$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(15);foreach ($IPData as $key => $val) {$val = explode("\t", $val);// var_dump($val);$item = ['StartIP' => ip2long($val[0]),'EndIP' => ip2long($val[1]),'Country' => trim($val[2]),'Local ' => trim($val[3]),];// $redis->set('mykey', 'Hello, Redis!'); // var_dump($item['EndIP']);$redis->zAdd('IPData', $item['EndIP'], json_encode($item, JSON_UNESCAPED_UNICODE)); // die;// var_dump()
}
参考内容:使用Redis有序集合搭建自有IP定位解析库(纯真库)_qqwry.dat 存到 redis 中-CSDN博客