Kde řešit cache?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Mirtes
Člen | 1536
+
0
-

Prohledával jsem fórum, někdo říká, že v presenteru, někdo dokonce, že v šablonách, ale mně jako jediné správné místo pro řešení, zda načítat data z DB nebo z cache, přijde model. Presenteru by mělo být jedno, odkud data pochází a model by to mohl dost obratně řešit – API by se tvářilo jednotně, zdroj dat by řešil vnitřek modelu…

Co myslíte? Klidně mě přesvědčte o opaku.

_Martin_
Generous Backer | 679
+
0
-

Jak která keš. V šablonách je keš užitečná, neboť rendrování šablony zabírá podstatnou část životního cyklu aplikace (alespoň v mé aplikaci, nevím, zda to lze říci i obecně). V modelu může být keš užitečná, pokud by docházelo k přílišnému vytěžování DB serveru – záleží celkově na optimalizaci DB (vhodná struktura, správné indexy, vhodně navržené dotazy) a na počtu požadavků a velikosti přenášených dat během jedné relace.
Pokud jde o keš v presenteru, tuším, že se zde na fóru řešilo (a snad jsem to psal i já), kam umístit onu rozhodovací logiku a co ještě je pohled a co presenter (navíc jsem chtěl, aby se keš šablony překreslila pouze, pokud by se změnila data z modelu – tzn. by někde musela být ještě kontrola například crc součtu vrácených dat z modelu či tak něco).

Patrik Votoček
Člen | 2221
+
0
-

Nevím kdo tí říkal že cache máš řešít v presenterech nebo v šablonách. Ale pokud se jedná o cache dat tak tu určitě řeš na úrovní modelu. Pokud získáváš data pro presenter/komponentu nebo něco jiného tak je získáváš z modelu. A mělo by být jedno jestli to je z DB, cache nebo něčeho jiného. Ale pokud se jedná o cache výstupu. Tak si moc dobře nedokážu představit jak to řešit v modelu.

Editoval vrtak-cz (2. 5. 2009 19:26)

Ondřej Mirtes
Člen | 1536
+
0
-

_Martin_ napsal(a):

Jak která keš. V šablonách je keš užitečná, neboť rendrování šablony zabírá podstatnou část životního cyklu aplikace (alespoň v mé aplikaci, nevím, zda to lze říci i obecně). V modelu může být keš užitečná, pokud by docházelo k přílišnému vytěžování DB serveru – záleží celkově na optimalizaci DB (vhodná struktura, správné indexy, vhodně navržené dotazy) a na počtu požadavků a velikosti přenášených dat během jedné relace.
Pokud jde o keš v presenteru, tuším, že se zde na fóru řešilo (a snad jsem to psal i já), kam umístit onu rozhodovací logiku a co ještě je pohled a co presenter (navíc jsem chtěl, aby se keš šablony překreslila pouze, pokud by se změnila data z modelu – tzn. by někde musela být ještě kontrola například crc součtu vrácených dat z modelu či tak něco).

Nette si zkonvertovanou šablonu z CurlyBracketsFilter do čistého PHP cachuje samo, ne? K čemu by mi bylo další cachování tohoto kódu?
DB server – jo, to je jasné.

vrtak-cz napsal(a):

Nevím kdo tí říkal že cache máš řešít v presenterech nebo v šablonách. Ale pokud se jedná o cache dat tak tu určitě řeš na úrovní modelu. Pokud získáváš data pro presenter/komponentu nebo něco jiného tak je získáváš z modelu. A mělo by být jedno jestly to je z DB, cache nebo něčeho jiného. Ale pokud se jedná o cache výstupu. Tak si moc dobře nedokážu představit jak to řešit v modelu.

Jo, až na poslední dvě vety se shodneme.

Co přesně je cache výstupu (nejspíše CurlyBracketsFilter značka {cache})? K čemu je dobrá?

Editoval LastHunter (17. 3. 2009 0:18)

Jod
Člen | 701
+
0
-

Nette si zkonvertovanou šablonu z CurlyBracket sFilter do čistého PHP cachuje samo, ne? K čemu by mi bylo další cachování tohoto kódu? DB server – jo, to je jasné.

Ale necachuje si taký vygenerovaný zoznam,
K tomu je dobrá tá značka {cache}. Nacacuješ si ho ako je a z db ťaháš len keď potrebuješ. Cachované dáta v modeli musíš ešte vyrenderovať.

Editoval Jod (17. 3. 2009 1:05)

kravčo
Člen | 721
+
0
-

LastHunter napsal(a):

Nette si zkonvertovanou šablonu z CurlyBracketsFilter do čistého PHP cachuje samo, ne? K čemu by mi bylo další cachování tohoto kódu?

Áno, šablóny v Nette majú vlastný kešovací mechanizmus, ktorý šetrí veľa výpočtovej sily, ale nie je liekom na všetko. Kešovanie nie je naviazateľné na konkrétnu časť aplikácie, dá sa využiť všade, kde sa dajú ušetriť milisekundy. Model sa ponúka ako jedna z priamočiarych možností, nutne napríklad pri získavaní externých dát (XML/RSS). Ďalším použitím je napr. generovanie náhľadov obrázkov, či preklad Texy! textov – tu napríklad dátami môžem rozumieť zdroják Texy a prezentačnou logikou sformátovaný výstup v podobe HTML…

Co přesně je cache výstupu (nejspíše CurlyBracketsFilter značka {cache})? K čemu je dobrá?

Dobrá je napríklad na kešovanie zložitých vykresľovaní (v e-shope môžeš napr. kešovať celú zložitú vyrenderovanú šablónu pre produkt (nie jej php kód, ale výsledný html kód), ktorá by sa inak musela renderovať pri každom zobrazení. A v prípade, že sa produkt zmení – keš sa invaliduje. Keď je zložitejším procesom renderovanie dát, ako ich získanie, kešovanie v modeli je neefektívne, zatiaľčo v šablóne šetrí maximum.

_Martin_
Generous Backer | 679
+
0
-

LastHunter napsal(a):

Nette si zkonvertovanou šablonu z CurlyBracketsFilter do čistého PHP cachuje samo, ne? K čemu by mi bylo další cachování tohoto kódu?
DB server – jo, to je jasné.

Myslím, že už ti ostatní odpověděli, nicméně: samotné provádění tohoto „čistého“ PHP kódu zabírá také pěkný čas: od delších foreach výpisů, přes generování odkazů, volání komponent, vkládání dalších šablon + dědičnost šablon (využívající output buffering) – těch příkladů se najde dost, takže to je podle mě důvod k tomu, proč kešovat i hotovou, vykreslenou stránku.