Nasıl memcached kullanarak benim sosyal ağ sitesi performansını artırabilirsiniz?

3 Cevap php

Ben sosyal ağ sitesi üzerinde memcached uygulamak istiyorum. Bir sosyal ağ olmak, çok sık çoğu veri değişir.

Ben önbellek bir kullanıcının 10,000 arkadaşlarını saklamak olsaydı Örneğin, o bir arkadaş ekler her zaman, önbellek güncelleştirilmesi gerekir. Yeterince kolay, ama aynı zamanda başkasının bir arkadaş olarak eklenen her zaman güncellemek gerekir. Bu sadece tek başına arkadaş listesinde güncelleme Bir sürü.

Orada kullanıcı bloglar ve yenileri ile non-stop yayınlanır ve sadece arkadaş listenizdeki bir kullanıcı tarafından oluşturulan olanları görebilirsiniz bültenleri de vardır, bu yüzden bu çok zor önbellek olacağını düşünüyorum.

Önbelleğe bir sürü 100,000 + kullanıcı varsa, ben muhtemelen bir kullanıcı profili güncellemeleri yalnızca değişir bazı profil bilgileri önbelleğe görebiliyordu, ama bu her kullanıcı için bir önbellek kaydı yaratacak. Bu iyi bir fikir mi?

Ayrıca memcached üzerinde herhangi bir Öğreticiler tavsiye edebilir?

3 Cevap

Ben geleneksel bir RDBMS daha hızlı (karmaşık katılır ve bu özellikle eğer) bu mümkün .... çoğu zaman memcached öğeleri çekmek mümkün olacak önbelleğe iyi bir fikir olduğunu söyleyebilirim. Şu anda büyük bir başarı ile böyle bir strateji istihdam, ve burada ben deneyimlerinden öğrendim budur:

  1. Mümkünse, süresiz önbellek ve bir değişiklik yapıldığında yeni bir değer yazın. Eğer önbellek güncellemeye çalışıyorum verilere çoklu eşzamanlı girişler ile bir yarış durumu neden olabilir gibi, açık bir silme yapmak için çalışıyorum. Ayrıca bir öğe (bir döngü içinde memcached "add" + kısa uyku süresi ile) Yukarıdaki sorunu önlemek için önbellekte yoksa kilitleme uygulamak

  2. mümkünse bir kuyruk kullanarak, arka planda önbelleği yenilemek. Benim uygulama şu anda böylece önyüzü üzerinde gecikme süresini önlenmesi, arka + beanstalkd çalışan bir multi-threaded perl süreçleri kullanır. zaman değişiklikler en kısa gecikme tabi olabilir.

  3. mümkünse memcached getmulti kullanmak, çok ayrı memcached çağrıları gerçekten eklemek.

  4. katmanlı önbelleği, bir öğe için kontrol ederken, db sonra, o memcached, önce yerel bir dizi kontrol edin. önbellek aynı madde için bir komut dosyası yürütme memcached birden çok kez isabet önlemek için ilk erişim yapıldıktan sonra yerel dizide sonuçlanır. EDIT: açıklığa kavuşturmak için, PHP gibi bir komut dosyası dili kullanıyorsanız, yerel dizi geçerli komut yürütme :) örnek olarak sadece uzun yaşamak istiyorsunuz:

    class Itemcache {
        private $cached_items = array();
        private $memcachedobj;
    
    
    
    public function getitem($memcache_key){
        if(isset($this->cached_items[$memcache_key])){
            return $this->cached_items[$memcache_key];
        }elseif($result = $this->memcachedobj->get($memcache_key)){
            $this->cached_items[$memcache_key] = $result;
            return $result;
        }else{
            // db query here as $dbresult
            $this->memcachedobj->set($memcache_key,$dbresult,0);
            $this->cached_items[$memcache_key] = $dbresult;
            return $dbresult;
    }
    
    }
  5. Yukarıdaki önbelleğe alma stratejisi 4. uygulayan sarıcı fonksiyon yazmak.

  6. örneğin, memcached tutarlı bir tuş yapısı kullanın. 'Userinfo_ {user.pk}' user.pk RDBMS kullanıcının birincil anahtar nerede.

  7. veri işleme sonrası gerektiriyorsa, önbellek yerleştirerek ÖNCE, bu verilerin her vuruşta bir kaç döngüleri kurtaracak mümkün bu işlem yapar.

Memcached gerçekten özel bir mimariye sahiptir. Bir önbellek sona amacıyla, en iyi yolu bir "endeksli" tuşunu kullanarak veri depolamak için.

Ben Gregg Pollack'ın Memcached screenscast izlemek için tavsiye ederiz. Bir Rails proje ile Memcached kullanarak odaklanmış ama Memcached iyi uygulama hakkında da kapsamlı bir bakış sağlar bulunuyor.

Memcached çok olsun sorguları optimize etmek için https://groups.google.com/forum/?fromgroups#!topic/memcached/n8zLJRyYNY4 bakabilirsiniz.