Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [inne] Wykorzystanie potencjału cache
wujek2009
post
Post #1





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

Ostrzeżenie: (0%)
-----


Cześć.

Tworzę serwis na frameworku i będzie on miał charakter sklepu internetowego - więc wiadomo podstawową rzeczą będą atrybuty i wartości do nich.
Takich atrybutów może być ok. 15-20 (maks) i wartości atrybutów to ok. do 100 (zwykłe stringi nie przekraczające 25 znaków). Plus dodatkowo robię cache ORMa (w sensie pobieranie struktury kolumn). Ogólnie plików cache będę miał dużo - bo nie tylko atrybuty+wartości+orm wrzucam do cache - staram się wrzucać
do cache dane, które zmieniają się z częstotliwością raz na pół roku!

Zastanawiam się czy to jest wydajne rozwiązania - przy zapytaniach typu:
  1. // SHOW COLUMNS FROM... [pobieramy z cache]
  2. // SELECT * FROM table1
  3.  
  4. // SELECT COLUMNS FROM [j/w]
  5. // SELECT * FROM table2


itd - czy to gra warta świeczki? Dodam, że atrybuty to serce serwisu więc wiadomo dużo requestów byłoby.
Obecnie pracuje na plikach (file cache) - ale jeśli serwerownia ogarnie konfiguracje to przerzucę się na APC.

/PS. Ważność cache ustawiam w zależności od ich zmiany - najcześciej jest to 7 dni.
Macie wyrobioną opinie odnośnie "pchania" wszystkiego do CACHE?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(wujek2009 @ 27.11.2012, 16:22:18 ) *
Tworzę serwis na frameworku

Są frameworki, Frameworki i FRAMEWORKI.

Cacheowanie jest oczywiście bardzo dobrym sposobem na odciążenie bazy danych i (czasami) samej aplikacji. Jeśli pytasz czy jest sens cache'ować - oczywiście tak. Tylko musisz zrobić to z głową, żebyś np. nie wyświetlił dwóch identycznych paneli edycji profilu dwóm różnym użytkownikom.

Jeśli masz jakieś dane zmieniające się raz na pół roku, to jak najbardziej jest sens ich cache'owania. Tylko musisz pamiętać o refreshu/usunięciu cache po każdej zmianie, żeby administrator nie musiał czekać 2 miesiące na zobaczenie zmian na liście atrybutów.

Tak czy siak - temat rzeka. Na pewno znajdziesz sporo ciekawych artykułów. Na forum na pewno dostaniesz lepsze odpowiedzi na konkretne pytania niż ogólne.

Jako ciekawostkę polecam lekturę o ciekawym rozwiązaniu - Cache Dependency z Yii
Go to the top of the page
+Quote Post
wujek2009
post
Post #3





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

Ostrzeżenie: (0%)
-----


Wiadomo odświeżanie cache - podstawa. Nurtuje mnie jeszcze jedna kwestia - produktów będzie maksymalnie 20 i zastanawiam się czy wszystkie 20 upchać do cache (product_id, title, cover_image, description, seo_title, seo_description, itd) czy jednak darować sobie już to? Takie cache będzie już sporo ważyć (dzięki kolumnie "description")
Go to the top of the page
+Quote Post
Niktoś
post
Post #4





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Ja bym przestrzegł przed nadmiernym cachowaniem/buforowaniem danych szczególnie, tych które są newralgiczne i mają duże znaczenie przy użytkowaniu portalu/serwisu. Pomyślałeś co będzie np. przy restarcie systemu bo przykładowo prądu braknie?
Dane zalokowane w bazie danych są dużo bezpieczniejsze.
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #5





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


W moim frameworku są cztery metody cachowania.

- output cache - czyli cała strona (localne pliki)
- database cache - czyli wynik zapytania SELECT połączony ze ścieżką URI (lokalne pliki)
- variable cache - czyli standardowo klucz:wartość (lokalne pliki, memcache, apc)
- pyro cache - cachowanie wyniku wywołania metody dowolnego objektu (lokalne pliki)

Pamiętaj że MySQL też ma wbudowany cache, więc można spokojnie trzaskać prostymi zapytaniami, każde wykona się w 0,00008 sek.
Go to the top of the page
+Quote Post
wujek2009
post
Post #6





Grupa: Zarejestrowani
Postów: 350
Pomógł: 31
Dołączył: 23.05.2010

Ostrzeżenie: (0%)
-----


Nie rozumiem do końca Twojej wypowiedzi Niktoś. Tylko, że system cache będzie opierał się na takim algorytmie:

Kod
1. Data utworzenia cache większa niż 7 dni? -> USUŃ OBECNE CACHE i UTWÓRZ NOWE
// pobieramy z bazy np. wszystkie produkty i zapisujemy ponownie na 7 dni
// i tak w kółko


Kod
2. Stworzenie funkcji w stylu:
function pobierzProdukty()
{
        $cache = Cache::instance();
        
        if ( ! $data = $cache->get('produkty') )
        {
            $data = ORM::factory('produkty')->pobierzwszystko();
            $cache->save($model, 7 dni);
            
            return $data;
        }
        else
            return $data;
}


i jestem kryty - w przypadku edycji/usuwania produktu - robie delete cache i ponownie wywołuje funkcje pobierzProdukty i spełni się pierwszy warunek
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #7





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


W sumie to po co cachować, skoro robi to MySQL?
Go to the top of the page
+Quote Post
Niktoś
post
Post #8





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


@wNogachSpisz możnaby, także dodać cache serwera który przy odpowiedniej konfiguracji cachowałby natywne pliki jak obrazy(jpg,png itp), css'y.

Chodziło mi, że dane należałoby najpierw gdzieś umieścić na stałe(np.baza danych) i potem cachować(np. z bazy danych).
Bezpośrednie wrzucanie wszystkiego do cache jest bezsensowne.

Cytat
Nie rozumiem do końca Twojej wypowiedzi Niktoś

Przy ewentualnym restarcie systemu , jeśli będziesz używał cache to utracisz bezzwrotnie wszystkie dane , gdyż pamięć jest niejako czyszczona. Po za tym cachować należy dane , które nie ulegałyby zmianie.

Ten post edytował Niktoś 27.11.2012, 18:18:23
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #9





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Wyciągać dane z bazy tylko po to, żeby za chwile te same dane w niej umieścić ( w nieco ptrzetworzonej formie ).
Efekt - program działa wolniej smile.gif

Ten post edytował wNogachSpisz 27.11.2012, 18:39:34
Go to the top of the page
+Quote Post
Niktoś
post
Post #10





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
Ale po co najpierw wyciągać z bazy żeby potem znowu w niej umieścić?

Miałoby to sens, jeśli dane nie ulegałyby zbyt często zmianie(jak już wyżej pisałem).
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #11





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Cytat(Niktoś @ 27.11.2012, 18:39:11 ) *
Miałoby to sens, jeśli dane nie ulegałyby zbyt często zmianie(jak już wyżej pisałem).


Jeśli dane nie ulegają zmianie, to MySQL cachuje zapytania.
Nie jest aż taki głupi.

Ten post edytował wNogachSpisz 27.11.2012, 18:43:20
Go to the top of the page
+Quote Post
sowiq
post
Post #12





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(wNogachSpisz @ 27.11.2012, 18:33:26 ) *
Ale po co najpierw wyciągać z bazy żeby potem znowu w niej umieścić? smile.gif

MySQL też jest dobrym storage'm dla cache'owanych danych. Robisz zapytanie z 10 JOIN'ami a jego wynik zapisujesz do bazy. Dzięki temu kolejne zapytanie o to samo (cache) będzie wykonane na podstawie PRIMARY_KEY, więc będzie o niebo szybsze.

Ten post edytował sowiq 27.11.2012, 18:41:28
Go to the top of the page
+Quote Post
Niktoś
post
Post #13





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


Cytat
Jeśli dane nie ulegają zmianie, to MySQL cachuje zapytania.
Nie jest aż taki głupi.

Ależ ja nie twierdzę, że piszesz bzdury, wręcz masz rację. Cache MySQL+ natywny cache serwera w zupełności wystarczą. No, ale kto jak woli wink.gif

Ten post edytował Niktoś 27.11.2012, 18:44:09
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 22:24