Optimization memcached:执行add(检查结果)或get(返回false时设置)哪个更快

Optimization memcached:执行add(检查结果)或get(返回false时设置)哪个更快,optimization,memcached,Optimization,Memcached,这个问题的标题不太清楚,但代码和问题很简单 假设我想每天给我的用户看一次广告。为了做到这一点,每次他们访问我网站上的某个页面时,我都会检查某个memcache密钥是否存储了任何数据。如果是,则不显示广告。如果不是,则在该键中存储值“1”,过期时间为86400 我可以通过两种方式来实现这一点: //version a $key='OPD_'.date('Ymd').'_'.$type.'_'.$user; if($memcache->get($key)===false){ $memcach

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

假设我想每天给我的用户看一次广告。为了做到这一点,每次他们访问我网站上的某个页面时,我都会检查某个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个add~=1个set~=5个get,平均用户每天浏览5个页面:

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

b: (5 add * 5 effort) = 25 units of effort

总是做add调用有意义吗?这是一个不必要的微观优化吗?

如果有人感兴趣的话,这里有一些我快速编写的脏代码来测试这一点:

<?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);
}

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

好问题!您可以编写一个快速测试用例,运行这两种方法10000次,以获得快速比较……如果缓存是一个平衡良好的b树,那么连接键的工作可能会使查找工作相形见绌。如果不是宇宙的话,在观看银河系的时候,为页面服务的努力可能会使这个代码看起来像地球。对于我的机群,添加beats get/set,直到每次访问大约22页。。。之后,get/set获胜。