![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 662 Pomógł: 45 Dołączył: 26.03.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie wiedziałem czy napisać to tu czy w dziale o php. Jeśli źle wybrałem to sorka i prosze o przeniesienie.
Ostatnio dużo zastanawiam się nad cache, jak to jest zbudowane w dużych serwisach. Weźmy na przykład serwis grono.net/fotka.pl. Miliony wpisów w bazie, miliony odwiedzić. Jak w taki dużych serwisach zorganiozwane jest cache ? Każde zapytanie ma swoje cache ? Prosił bym o jakieś dokładne informacje od osób orientujacych sie w temacie. Pozdrawiam. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 627 Pomógł: 33 Dołączył: 1.05.2005 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
memcached
|
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Nie wiem jak sprawa się ma w przypadku podanych przez Ciebie serwisów, jednak z doświadczenia wiem, że najlepszym rozwiązaniem jest generowanie treści statycznej, która następnie jest prezentowana użytkownikowi. Wszystkie dynamiczne operacje są wykonywane w ostateczności. Mówiąc prościej. Generuje się pliki HTML, które są wyświetlane użytkownikom. W przypadku zmian (np dodanie zdjęć, edycja profilu, nowe newsy, itd), plik HTML jest generowany ponownie. W najgorszym wypadku, gdy taki plik się nie utworzy, uruchamia się skrypt PHP/ASP/JSP, który to mieli i wyświetla.
Oczywiście nie należy zapominać o cache w bazie danych i na serwerze. Tam też dzieje się magia (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 662 Pomógł: 45 Dołączył: 26.03.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Czyli tak, w modelu do bazy danych dodać cache oraz całą stroną cachować za pomocą jakiegoś narzędzia ?
@normanos - Memcache wydaje mi się ciekawe, ale nie każdym serwerze jest. Ten post edytował Moli 15.01.2008, 09:15:40 |
|
|
![]()
Post
#5
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Sam serwer bazy danych oferuje cache-owanie wyników zapytania, przez co każde kolejne zapytanie jest wykonywane znacznie szybciej. Jednak nie jestem ekspertem w dziedzinie baz danych, więc nie pomogę za bardzo w tym temacie.
Dodatkowe cache-owanie zapytań może się przydać. Dzięki temu nie będziesz nawet łączył się z bazą danych. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 627 Pomógł: 33 Dołączył: 1.05.2005 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
@Moli: pytasz się o mega serwisy, a potem mi coś mówisz o hostingach (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 662 Pomógł: 45 Dołączył: 26.03.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
No to był przykład, chodziło mi o o jak obsłużyć zapytania do bazy jeśli jest tyle redkordów a nie to czy maja memcachce (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Myślałem nad czymś takim:
- Sprawdza czy istnieje plik cachu html (czyli już gotowy kod html z szablonem oraz wstawionymi elementami). - Jeśli jest wczytuje go i konczy prace. - Jeśli nie, sprawdza czy jest cache zapytania do bazy - Jesli jest, tworzy cache html i wyswietla go - Jeśli nie ma, pobiera wpisy z bazy normalnie, oraz tworzy cache bazy. Dobre bedzie takie wyjście ? |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 790 Pomógł: 7 Dołączył: 6.02.2003 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
batman: cache jest wykorzystywany tylko gdy kolejne zapytanie jest DOKŁADNIE takie samo jak wywołane wcześniej. Przynajmniej tak jest w MySQL.
|
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
@seaquest
O to mi właśnie chodziło. Za duży skrót myślowy mi wyszedł (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 627 Pomógł: 33 Dołączył: 1.05.2005 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
dobre do jakiegoś momentu bo przy takiej (podales przyklad fotki) ilosci danych tyle keszu moze byc problematyczne (i/o).
lepiej też by było trzymać same dane w keszu a nie całe htmle. te przy takich ilosciach zajmą ci ogromne duzo miejsca, a samo podstawienie danych do szablonu to przeciez niezauwazalne wartosci. poza tym jak dobrze napiszesz sobie klasę do takiego keszu obiektów to potem tylko zamienisz sterowniki i np. z keszu plikowego w sekundke przejdziesz na memcached. nie mówiąc już o jakiś zmianach w ogolnym htmlu strony. ja w kazdym razie jestem przeciwnikiem keszowania calych htmli, dla mnie nie jest to sensowne rozwiazanie. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 20.08.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
Hm, myślałem ostatnio o cache'owaniu, ale mam kilka wątpliwości...
Na jak długo tworzyć cache? Jak sprawdzać czy w między czasie nie powinien powstać nowy cache (aktualizacja danych)? |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Na jak długo tworzyć cache Na tyle ile ci potrzeba. Cache konfiguracyjny moze byc np. na dzien, a cache z newsami, np, na pol dnia. Jak to mowia: zalezy jak lezy.Cytat Jak sprawdzać czy w między czasie nie powinien powstać nowy cache (aktualizacja danych)? Jesli dodajesz nowego newsa, to czyscisz cache newsow. Proste. Analogicznie wszystko inne
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 662 Pomógł: 45 Dołączył: 26.03.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@normanos
W widokach gdzie są dynamiczne treści, mogę usunąć cache. Tam gdzie są dynamiczne, ale już mniej ważne, mogę ustawić czas trwania cache a tam gdzie mam stały, pobrany z template + baza + jakieś dodatki widok, cachuje (też na określony czas). Robiłem małe testy z tym i przyśpiesza bardzo widocznie. Trzeba będzie tylko dobrze dobrać widoki w których mogę stosować cache, ale już zadanie oddzielnie do każdego projektu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował Moli 15.01.2008, 14:50:34 |
|
|
![]()
Post
#14
|
|
Grupa: Przyjaciele php.pl Postów: 790 Pomógł: 7 Dołączył: 6.02.2003 Skąd: Polska Ostrzeżenie: (0%) ![]() ![]() |
Hm, myślałem ostatnio o cache'owaniu, ale mam kilka wątpliwości... Na jak długo tworzyć cache? Jak sprawdzać czy w między czasie nie powinien powstać nowy cache (aktualizacja danych)? Ja stosuję prostą zasadę: średnia(przewidywana) częstotliwość zmienności danych / 2. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 662 Pomógł: 45 Dołączył: 26.03.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ale w przypadku takich cache jak np. profil uzytkownika, mozna je usuwac tylko po zapisie nowych danych tego usera. Wtedy zyskujemy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#16
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Cytat Na jak długo tworzyć cache? Na jak najdłużej. Dopiero zmiana w treści powinna wymusić odświeżenie zawartości cache. |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 627 Pomógł: 33 Dołączył: 1.05.2005 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
niekoniecznie. są sytuacje w których zmiana treści wymusiła by non-stop zmiane keszu i tym samym podważyła jego sens (a raczej zamiast poprawić by tylko pogorszyła). w takich przypadkach stosuje się kesz na dany czas.
|
|
|
![]()
Post
#18
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Skoro zmiana treści występuje w tak krótkich odstępach czasu to nie ma sensu wówczas w ogóle korzystać z mechanizmów cache-owania, ponieważ tak jak napisałeś, spowoduje to spadek wydajności. Poza tym tworzenie i usuwanie zbuforowanych plików powinna odbywać się nie w momencie wejścia na stronę. Tworzenie cache-u powinno odbywać się w momencie zmiany treści (np dodano news), po stronie tzw. admina.
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 627 Pomógł: 33 Dołączył: 1.05.2005 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
@batman: pozwolę się z tobą całkowicie... NIEzgodzić (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Może rzucę jakimis przykładami aby było łatwiej:
choćby bardzo częsta sprawa => zliczanie danych z kategorii, ot powiedzmy, że mamy imageshacka z menu Architektura (2324342525 zdjec) Krajobraz (45352632362 zdjęc) itd. robienie countów jest masakryczne (używa się też często dodatkowego pola w sql i inkrementuje ale chciałbym uogólnić przykład) a zmiana keszu przy dodaniu fotki (n-fotek na sekunde) mija się z celem. Nie mówiąc o tym, że sytuacja nie wymaga aby w takim menu były dane dokładne co do 1 w danej sekundzie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Wtedy robisz sobie cache na n-minut i po sprawie. Zysk OGROMNY. Takich sytuacji jest trochę, na ogół są to dane globalne serwisu, a nie spersonalizowane usera. Ale ciężko tak uogólniać bo co serwis to inne potrzeby i wymagania, chciałem tylko nakreślić pewien punkt widzenia, mam nadzieje, że widac o co mi chodzi. |
|
|
![]()
Post
#20
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Masz rację, w takim przypadku ustawia się cache na określony czas. Jednak, jak dobrze zauważyłeś, zazwyczaj nie oblicza się ilości plików w folderze lub wierszy w bazie, tylko stosuje dodatkowe pole, które zawiera informację o aktualnej ilości danych. Do tego należy dodać, iż sam licznik może być cache-owany co 5 min, a reszta strony co tydzień.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 12:45 |