使用redis优化纯真IP库访问

每次请求都需要加载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博客

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值