2009-07-25 10 views
5

Chciałbym zaimplementować memcached na mojej stronie społecznościowej. Jako sieć społecznościowa większość danych zmienia się bardzo często.Jak mogę poprawić wydajność mojej sieci społecznościowej za pomocą memcached?

Na przykład, jeśli mam przechowywać 10.000 znajomych użytkownika w pamięci podręcznej, za każdym razem, gdy doda on znajomego, pamięć podręczna będzie wymagać aktualizacji. Jest to dość łatwe, ale musi również zostać zaktualizowane za każdym razem, gdy ktoś inny dodał je jako znajomego. To dużo aktualizacji tylko na liście znajomych.

Istnieją również blogi i biuletyny użytkowników, które są publikowane nieprzerwanie na nowe i można zobaczyć tylko te, które są tworzone przez użytkownika na liście znajomych, więc myślę, że byłoby to bardzo trudne do buforowania.

Mogłabym zobaczyć buforowanie niektórych informacji o profilu, które zmieniają się tylko wtedy, gdy użytkownik aktualizuje swój profil, ale utworzyłoby to rekord cache dla każdego użytkownika, jeśli istnieje 100 000 użytkowników, którzy mają dużo pamięci podręcznej. Czy to dobry pomysł?

+2

To pytanie naprawdę wymaga lepszego tytułu. –

Odpowiedz

2

Powiedziałbym, że dobrze jest cache'ować, gdzie to możliwe .... przez większość czasu będziesz w stanie wyciągać przedmioty z memcached (zwłaszcza jeśli masz złożone sprzężenia i takie) szybciej niż tradycyjne RDBMS. Obecnie zatrudniamy taką strategię z wielkim sukcesem, a oto, co dowiedziałem się z doświadczenia:

  1. jeśli to możliwe, pamięć podręczną w nieskończoność, i napisać nową wartość, gdy dokonywana jest zmiana. staraj się nie robić wyraźnego usunięcia, ponieważ możesz spowodować stan wyścigu z wieloma współbieżnymi dostępem do danych próbujących zaktualizować pamięć podręczną. implementuj również blokowanie, jeśli element nie istnieje w pamięci podręcznej, aby zapobiec powyższemu problemowi (używając memcached "dodaj" + krótki czas snu w pętli). Moja implementacja obecnie wykorzystuje wielowątkowe procesy perla działające w tle + beanstalkd, zapobiegając w ten sposób opóźnieniu w interfejsie użytkownika. w większości przypadków zmiany mogą powodować krótkie opóźnienie.

  2. używać memcached getmulti, jeśli to możliwe, wiele oddzielnych połączeń memcached naprawdę sumują się.
  3. Poziomuj pamięć podręczną, sprawdzając element, najpierw sprawdź lokalną tablicę, a następnie memcached, a następnie db. cache kończy się w lokalnej tablicy po pierwszym dostępie, aby zapobiec wielokrotnemu trafianiu memcached w wykonanie skryptu dla tego samego elementu. EDIT: wyjaśnienie, czy przy użyciu skryptów języka takich jak PHP, lokalna tablica będzie żył tak długo, jak tylko bieżącego wykonywania skryptu :) przykład:

    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; 
        } 
    } 
    
  4. napisać funkcję otoki, który implementuje powyższej strategii buforowania # 4.

  5. użyć spójnej struktury klawiszy w memcached, np. "userinfo_ {user.pk}", gdzie user.pk jest kluczem podstawowym użytkownika w rdbms.

  6. jeśli dane wymagają przetworzenia, przetwarzanie to, o ile jest to możliwe PRZED umieszczeniem w pamięci podręcznej, zapisuje kilka cykli przy każdym trafieniu tych danych.

+0

"wynik pamięci podręcznej w lokalnej tablicy po pierwszym dostępie, aby zapobiec wielokrotnemu trafianiu memcached w wykonywanie skryptu dla tego samego elementu." Co przez to rozumiesz? Czy masz na myśli zapisać tablicę jako sesję lub coś takiego?Zastanawiam się również, w jaki sposób mogę buforować listę znajomych w celu użycia, problem, który widzę, to aktualizacje użytkowników i często dodaje znajomych, a także w drugą stronę, gdzie użytkownicy dodają tę osobę jako znajomego, pamięć podręczna będzie musiała być aktualizowana za każdym razem przyjaciel jest dodawany, co jest bardzo często, także jeśli jest 50 000 użytkowników, to dobrze jest przechowywać w pamięci podręcznej listę znajomych dla 50 000 użytkowników? .next commet-> – JasonDavis

+0

Niektóre listy mogą mieć 20 000 identyfikatorów przyjaciela? – JasonDavis

+0

według tablicy, mam na myśli lokalnie. php ex. masz zmienną klasy o nazwie $ array_cache, po pobraniu wyniku z memcached za pierwszym razem zapisz wynik w tablicy z $ this-> array_cache [$ memcache_key] = $ memcache_value; następnie przy następnym wywołaniu metody jeśli (isset ($ this-> array_cache [$ memcache_key])) zwróci $ this-> array_cache [$ memcache_key]; tak, aby podczas wykonywania CURRENT skrypt nie będzie musiał zadzwonić memcached ponownie dla tego samego wyniku (jeśli w końcu dzwonisz do tego samego produktu dwa razy lub więcej). kolejne wywołanie skryptu oczywiście wywoła jeszcze raz memcached. -> następny komentarz – Jason

Powiązane problemy