2010-04-20 16 views
6

這個問題的標題不是很清楚,但代碼和問題很簡單。memcached:這是更快,做一個添加(和檢查結果),或做一個get(並在返回false時設置)

比方說,我想每天向用戶展示一次廣告。要做到這一點,每次他們訪問我網站上的一個頁面時,我都會檢查一下某個memcache密鑰是否存儲了任何數據。如果是這樣,請不要展示廣告。如果不是,在這關鍵的存儲值「1」與86400

到期,我可以做到這2種方式:

//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在努力方面得到,而普通用戶每天瀏覽5頁:

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

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

總是進行添加調用是否合理?這是不必要的微觀優化嗎?

+0

好問題!你總是可以編寫一個快速的測試用例,運行這兩種方法10000次以獲得快速比較...... – oedo 2010-04-20 20:25:57

+1

如果緩存是一個平衡良好的B樹,連接該鍵的工作可能會使查找工作變得更加困難。如果不是宇宙,那麼服務這個頁面的努力可能會讓這個代碼看起來像行星地球。 – 2010-04-20 20:39:17

回答

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); 
} 
+2

而結果呢? – 2010-04-20 21:51:04

+0

對於我的機器集羣,添加節拍get/set,直到每次訪問約22頁...之後,get/set獲勝。 – 2010-04-21 02:31:13

0

如果您知道密鑰存在,它可能會以更快的速度做一個增量操作,並期待在結果。這與人們遇到的速率限制和節流問題類似;你也許可以製作一個很好的Google搜索。

相關問題