代码之家  ›  专栏  ›  技术社区  ›  Mike Sherov

memcached:执行添加(和检查结果)或执行get(返回false时设置)的速度更快。

  •  6
  • Mike Sherov  · 技术社区  · 15 年前

    这个问题的标题不太清楚,但代码和问题很简单。

    假设我想每天给我的用户看一次广告。为了实现这一点,每次他们访问我网站上的页面时,我都会检查某个memcache密钥是否存储了任何数据。如果是,则不要显示广告。如果不是,则将值“1”存储在该密钥中,过期时间为86400。

    我可以通过两种方式来做到:

    //version a
    $key='OPD_'.date('Ymd').'_'.$type.'_'.$user;
    if($memcache->get($key)===false){
     $memcache->set($key,'1',false,$expire);
     //show ad
    }
    
    //version b
    $key='OPD_'.date('Ymd').'_'.$type.'_'.$user;
    if($memcache->add($key,'1',false,$expire)){
     //show ad
    }
    

    现在,很明显B更好,它总是调用1个memcache。 但是,“添加”和“获取”的开销是多少? 这些不是真正的比较…我只是编了这些数字,但假设1加~=1集~=5集,那么平均用户每天浏览5页:

    a: (5 get * 1 effort) + (1 set * 5 effort) = 10 units of effort
    
    b: (5 add * 5 effort) = 25 units of effort
    

    总是执行添加调用有意义吗?这是不必要的微观优化吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Mike Sherov    15 年前

    如果有人感兴趣的话,我特意想出了一些快速而肮脏的代码来测试:

    <?php
    require('include.php');
    $memcache = new Memcache();
    
    foreach(Config::$CONFIG['memcache_server'] as $memcache_server){
        $memcache->addServer($memcache_server,11211,false);
    }
    
    $iterations = 300;
    $max_pages_per_visit = 25;
    
    $time_now = microtime(true);
    for($pages_per_visit = 1; $pages_per_visit<=$max_pages_per_visit; $pages_per_visit++){
        foreach(array('gs','a') as $method){
            $start = microtime(true);
            for($x = 0; $x < $iterations; $x++){
                $key = 'testmc'.$time_now.'_'.$pages_per_visit.'_'.$method.'_'.$x;
                switch($method){
                    case 'gs':
                        for($y = 0 ; $y < $pages_per_visit; $y++){
                            if($memcache->get($key)===false){
                                $memcache->set($key,'1',null,5);
                            }
                        }
                        break;
                    case 'a':
                        for($y = 0 ; $y < $pages_per_visit; $y++){
                            $memcache->add($key,'1',null,5);
                        }
                        break;
                }
            }
            $end = microtime(true);
            $results[$pages_per_visit][$method] = $end - $start;
        }
    }
    
    //print results
    print('<pre>');
    foreach($results as $pages_per_visit => $data){
        $speed_diff = $data['gs'] - $data['a'];
        $speed_percentage = round($speed_diff / $data['gs'] * 100,2);
        echo($pages_per_visit.' pages : add is faster by :'.$speed_diff.' ('.$speed_percentage.')%'.PHP_EOL);
    }
    
        2
  •  0
  •   Nick Gerakines    15 年前

    如果知道键存在,那么执行增量操作并查看结果可能会更快。这类似于人们遇到的速率限制和节流问题;您可能会知道这一点,创建一个好的谷歌搜索。