Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Cache zapytań
Forum PHP.pl > Forum > PHP
Noname78
Witam,
Mam do zrobienia bardzo duży portal założenia zleceniodawcy są takie, że 90% wszystkich zapytań to pobieranie danych z bazy a tylko 10% to modyfikacje, dodawanie lub usuwanie rekordów. Baza ma posiadać ok. 5 mln rekordów na początek. Zleceniodawca przyjmuje ok. 50 tys. odsłon dziennie. Przy tak dużej ilości odsłon i ilości pobieranych danych warto zastosować cachowanie zapytań. Chciałbym zrobić to standardowo:
1. Sprawdzanie cache, jeśli zawiera aktualne dane to idź do 4
2. Pobranie treści z bazy
3. Zaktualizowanie cache
4. Zwrócenie danych
Nie chce się martwić o to czy zawartość cache jest aktualna i zamierzam czyścić ją za każdym razem gdy coś dodam, zmodyfikuje lub usunę w bazie. Oczywiście nie cały cache. Z takie rozwiązanie ma kilka wad:
1. Jeśli nie będzie nic w cache i nagle na stronę wejdzie 1000 osób w jednej chwili i każdy zacznie aktualizować cache, będzie to bardzo nieefektywne.
2. Podczas gdy chcę usuwać cache może się okazać, że ktoś właśnie go czyta i nie usunę go, wtedy zostanie stara, nieaktualna zawartość.
Przy tak dużej ilości odsłon nawet tak mało prawdopodobne akcje są możliwe. Czy macie jakieś pomysły jak to mogę rozwiązać?
erix
Jeśli rozwiązujesz cache'owanie na poziomie systemu plików, to powinna wystarczyć standardowa blokada.

W przypadku tworów a'la memcached, to podejrzewam, że jeden podłączony klient na czas operacji zapisu/kasowania blokuje daną komórkę pamięci. A jeśli chodzi o update, to najbezpieczniej jest zrobić to poza skryptem produkcyjnym, np. przez działający skrypt generujący zawartość cache (np. w panelu administracyjnym). Generalnie wystarczy coś bardzo prostego: dane, które zamierzasz zbuforować, zapisujesz najpierw do zmiennej, dopiero potem podmieniasz w buforze. Ważne jest tu najpierw przygotowanie danych, a nie wymazanie. Fakt, zabierze nieco więcej pamięci, ale sam wiesz, że operacje przenoszenia/kopiowania komórek w pamięci przebiegają z prędkością kilku-kilkunastu GiB na sekundę. A pobieranie z bazy, to góra kilka MiB (zależy od systemu). winksmiley.jpg

Wtedy operacja powinna przebiec wręcz niezauważalnie. Tak BTW, popełniłem kiedyś artykuł nt. cache danych w PHP: http://eriz.pcinside.pl/weblog/cache-danyc...teoria-211.html
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.