q.michal
16.02.2016, 08:27:34
Czesc,
Przymierzam sie wlasnie do pisania klasy obslugujacec baze danych z wykorzystaniem PDO.
Zastanawiam sie jednak, czy jest sens wykorzystywac bezposrednio w tej klasie cache?
Konkretnie na mysli mam utworzenie objektu klasy Cache w $this->cache klasy bazy danych.
Nastepnie przy selectach sprawdzenie czy tych danych nie ma juz w cache i czy ten nie wygasl.
Dzieki temu, mozna by nieco odciazyc baze, a same dane pobrane z bazy zapisywac jako chociazby MD5 z zapytania.
Inna sprawa, ze wowczas musialbym ten cache jakos uaktualniac po insertach i updateach, ale nie bede mial hashy selectow, wiec docelowo pewnie chcialbym czyscic caly cache po kazdym zapisie do bazy.
Co sadzicie o takim rozwiazaniu?
Pyton_000
16.02.2016, 09:00:13
Beznadziejne.
Jak sam widzisz masz wiele ograniczeń.
Najwygodniej jest używać oddzielnej klasy cache, i tam wrzucać pobierać itd.
Od biedy możesz zrobić z Cache dekorator na BD.
q.michal
16.02.2016, 09:05:14
To ma byc oddzielna klasa. Zastanawiam sie tylko czy jest sens wykorzystywac ja w klasie implementujacej obsluge DB.
AFAIK phpBB3 tak robi, a w katalogu cache sa pliki sql_[hash] w ktorych przechowuje to co juz wyciagnal z bazy.
Pyton_000
16.02.2016, 09:14:12
Tak, oddzielna, ale to nie w klasie BD masz się zajmować wrzucaniem danych do cache, a odwrotnie np:
$data = Cache::get('jakis_klucz', 10, function() {
return $zapytaniePobieajaceDane;
});
Dzięki temu jeśli jest klucz to pobiera z cache, jak nie ma albo się przeterminował to pobiera świeże dane, wrzuca do cache i zwraca.
lukaskolista
16.02.2016, 10:30:12
Pyton - Twoje rozwiązanie narzuca na programistę obowiązek ręcznego sterowania cachem i wpychania go praktycznie wszędzie tam, gdzie jest zapytanie do bazy - DRY.
Cytat
Od biedy możesz zrobić z Cache dekorator na BD.
Według mnie świetne rozwiązanie zwłaszcza w przypadku, gdy korzystasz z kontenera usług.
Masz jeszcze możliwość wykorzystania programowania aspektowego, ale to już totalna abstrakcja w php.
Pyton_000
16.02.2016, 10:39:28
Czy znowu takie straszne? Nie widzę nic złego w tym że mam możliwość zastosowania cache tam gdzie chcę i jak chcę.
Nadając tagi i nazwy dla cache mam możliwość dowolnego zmieniania stanu cache np. wyczyszczenie wg. tagów, nazw itd.
Użycie dekoratora jest o tyle niewygodne że masz mniejszą kontrolę nad tym w jaki sposób przechowujesz.
Chyba że masz na myśli jakieś rozwiązanie na które aktualnie nie wpadłem
q.michal
16.02.2016, 10:46:12
Z 2 strony patrzac, czy obsluga cache bezposrednio w klasie DBAL jest czyms zlym?
Takie rozwiazanie pozwoliloby buforowac wszystkie selecty zmniejszajac liczbe zapytan na bazie do minimum.
Podczas kazdej aktualizacji, co przeciez wykonuje sie rzadziej mozna wyczyscic caly cache z tagiem 'sql'.
Malo tego, mozna w metodach aktualizujacych, dac sobie mozliwosc wykonania aktualizacji na bazie bez czyszczenia cache, co przyda sie np. przy wbijaniu sesji.
Wtedy w ogole nie trzeba bedzie o nic dbac. Jak juz wspomnialem rozwiazanie takie znalezc mozna z tego co wiem w phpBB czy CI.
lukaskolista
17.02.2016, 12:00:08
Dekorator jest ok zwłaszcza wtedy, gdy zapytanie traktujesz jako obiekt, np.
class FindAllActiveUsers
{
public function __invoke($limit)
{
}
}
class CachableResult
{
public function __invoke()
{
// Czy wynik w cache...
// Jak nie, to zapytanie
// Tutaj zapis do cache...
return $result;
}
}
$findAllActiveUsers = new CachableResult(new FindAllActiveUsers());
$activeUsers = $findAllActiveUsers(5);
Powyższy przykład jest bardzo prosty i niekompletny, ale daje pogląd na rozwiązanie.
viking
17.02.2016, 12:39:13
Możesz jakieś eventy też popodpinać w stylu onbeforeselect wczytaj z cache.
Chociaż we wszystkich frameworkach stosuje się rozwiązanie które podał @Pyton_000
lukaskolista
17.02.2016, 15:02:46
Masz rację viking, takie rozwiązanie stosuje się, ponieważ twórcy frameworka nie wiedzą, w jaki sposób to wykorzystasz. Nic nie stoi na przeszkodzie, żeby dodać swoją warstwę abstrakcji. Takie hardkodowane rozwiązanie może przysporzyć problemów w przypadku, gdy korzystamy z cache i nagle chcemy się go całkowicie pozbyć.
Pyton_000
17.02.2016, 15:09:57
W dekoratorach masz to samo...
lukaskolista
17.02.2016, 15:50:34
Tylko jest różnica, jak 100 razy musisz rzeźbić ify, a 100 razy użyć dekoratora. Moje rozwiązanie opiera się na zasadzie DRY, a ręczna rzeźba ifów już niebardzo.
Pyton_000
17.02.2016, 16:00:36
A gdzie w moim rozwiazaniu masz ify?
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.