这个问题的标题不是那么清楚,但代码和问题很简单。
假设我想每天向用户展示一次广告。为了实现这一点,每次他们访问我网站上的页面时,都会检查某个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
总是进行添加调用会有意义吗?这是不必要的微观优化吗?
答案 0 :(得分:3)
如果有人感兴趣的话,这里有一些快速而肮脏的代码我试图测试一下:
<?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);
}
答案 1 :(得分:0)
如果您知道密钥存在,那么执行增量操作并查看结果可能会更快。这类似于人们遇到的限速和限制问题;你可以知道这一点,你可以制作一个好的谷歌搜索。