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