2010-04-20 10 views
6

Bu sorunun başlığı çok açık değil, ancak kod ve soru basittir.memcached: daha hızlı, bir ekleme (ve sonuç alınıyor) veya bir get (ve yanlış döndüğünde ayarlama)

Kullanıcılarıma günde bir kez bir reklam göstermek istediğimi varsayalım. Bunu yapmak için, sitemdeki bir sayfayı her ziyaret ettiğinde, belirli bir memcache anahtarının üzerinde kayıtlı herhangi bir veri olup olmadığını kontrol ettim. Öyleyse, bir reklam gösterme. Değilse, değerini depolamak '1' o anahtarında 86400

bir sona erme ile bu 2 şekillerde yapabilirsiniz: Artık

//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 daha iyi olduğu çok açık görünebilir, her zaman yapar 1 memcache çağrısı. Bununla birlikte, "add" ile "get" arasındaki ek yük nedir? Bunlar gerçek karşılaştırmalar değil ... ve bu sayıları yeni oluşturdum, ama şunu söyleyelim: ~ 1 ~ ~ 1 set ~ = 5 çaba açısından, ve ortalama kullanıcı günde 5 sayfa gösteriyor:

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

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

Her zaman ek arama yapmak mantıklı olur mu? Bu gereksiz bir mikro optimizasyon mu?

+0

iyi soru! Hızlı bir karşılaştırma elde etmek için her iki yöntemi de 10000 kez çalıştıran hızlı bir test vakası yazabilirsiniz ... – oedo

+1

Eğer önbellek iyi dengelenmiş bir b-tree ise, anahtarın birleştirilmesi çabası muhtemelen arayışın çabalarını cüceler. Ve bu sayfalara hizmet etme çabası muhtemelen bu kodu, evren olmasa da Samanyolu galaksisini izlerken gezegen dünyasına benziyor. –

cevap

3

İşte Herkes ilgi ise, bu test etmek için çırpılmış bazı hızlı ve kirli kod:

<?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

Ve sonuçları? –

+0

Makineler kümem için, ziyaret başına yaklaşık 22 sayfa oluncaya kadar beat/set ekleyin ... Bundan sonra, kazanın/set kazanın. –

0

anahtar varlığından haberdar ederseniz muhtemelen bir artım operasyonu yapmak daha hızlı ve bakardım Sonuçlar. Bu, insanların karşılaştığı oran sınırlama ve kısma sorunlarına benzer; Bunu bilerek iyi bir Google araması yapabilirsiniz.

İlgili konular