Cache rout tahaných z databáze
- Hafran
- Člen | 121
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
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
@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
@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)
- Jan Suchánek
- Člen | 404
@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)
- Jan Suchánek
- Člen | 404
@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
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.