Cache rout tahaných z databáze

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

Zdar,
mám routy, který se překládaj z DB a jelikož si tím generuji cca 10–20 odkazů na stránce, tak přemýšlím o nějakém cachování. Jen by mě zajímalo, zda to nějak pomůže a jak to implementovat, jelikož v databázi bude nějaké vlastní cachování a NDB také něco takového dělá. A zda je to v takovýchto objemech vůbec k něčemu? Tak abych nenadělal víc škody, než užitku. :) Dík za názory.

Milo
Nette Core | 1283
+
0
-

Zmeř si kolik času zabere vytvoření rout během requestu. Porovnej to s celkovým trváním requestu a zvaž, jestli to má cenu. Také zvaž, jestli to má vůbec cenu vzhledem k návštěvnosti aplikace.

A když se rozhodneš kešovat, záleží kolik rout celkem máš. Jestli 30 tak je každý request stáhni všechny a kešuj v proměnné routeru.

Jakmile začneš kešovat pro více requestů (na disk, memcache, …), musíš začít řešit invalidaci keše a to bývá obtížné.

Editoval Milo (20. 10. 2013 19:44)

Jan Suchánek
Člen | 404
+
0
-

@Hafran: Napiš mi soukromě, nějaký db + cache router mám napsaný, zajímalo by mě zda je OK či ne.

Editoval jenicek (20. 10. 2013 23:14)

Jan Suchánek
Člen | 404
+
0
-

@Milo: V čem je to obtížné? Mě napadlo použít FilterRoute + vytvořit k ní fasadu UrlManager a jemu předat UrlRepository + UrlCache a dát jim stejný interface a tyto potvory, používat i při ukládání. Je to správný postup?

Editoval jenicek (21. 10. 2013 21:15)

Hafran
Člen | 121
+
0
-

@Milo, dík, velmi chytrá rada. :) Zjistil jsem, že routy to tvoří maximálne 1–2ms, celou stránku to pak poskládá za cca 150ms, takže to asi není důležité. Asi začnu efektivitu řešit, až bude docházet výkon db.

@jenicek: klidně mi ho pošli, kouknu na to a můžu to zkusit. :)

Jan Suchánek
Člen | 404
+
0
-

@Hafran: posílal jsem ti nástřel na tvůj email. Dej mi vědět jestli máš nějaké lepší řešní.
Mezitím jsem ho dost upravil a částečný nástřel jsem uváděl jinde tady na foru

Dejte mi vědět, zda by se dal napsat lépe, či zda je úplně mimo mísu. Jinak mohu vystavit někde, celý funkční routr + cache, ale chtělo by ho odbugovat, základ jsem používal FilterRouter.

Editoval jenicek (24. 10. 2013 14:30)

Milo
Nette Core | 1283
+
0
-

@jenicek Obtížná je ta invalidace keše. Pokud zápis rout do databáze děláš pouze na jednom místě (jak píšeš), je to snadné. Když to ale děláš z více míst (adminer, jiná aplikace, …) musíš v aplikaci zjistit, že se data změnila a keš není validní.

Jan Suchánek
Člen | 404
+
0
-

@Milo: hmm, a co Trigerem? Zapsat změnu do tabulky url a nějakou pěknou servisou se postarat o naposledy změněné, to by pak mohlo fungovat i z jiné aplikace i z Admineru.

Milo
Nette Core | 1283
+
0
-

Trigger je jedna možnost. K tomu přidat timestamp změny ke konkrétnímu řádku, nebo tabulce nebo celé databázi a podle toho invalidovat keš. Pak se ale musí každý request provést select timestampu(ů) a vyvstává otázka jestli se to vyplatí.

PostgreSQL umí NOTIFY/LISTEN který se dá pro invalidaci keše využít.

Anebo PlPerlU stored procedura, které je volaná z triggeru a spustí skript na invalidaci keše.

Ani jedno řešení není trivální, takže dokud to nebude mít nějaký obstojný efekt, tak bych kešování vůbec neřešil.

Jan Suchánek
Člen | 404
+
0
-

@Milo: něco připravuju až to bude hodím to sem.