cache – routování – velké množství odakzů
- batko
- Člen | 219
Ahoj,
mám routu pro produkty a kategorie, mám hodně produktů a pokaždé nechci sahat do databáze. Začal jsem kešovat pole s produkty „id“=>„uri“.
Chci se jen zeptat zda to je správná praktika a zda to dělám správně. Vaše názory a připomínky?
<?php
$value = $cache->load("prod");
if ($value !== NULL) {
$products = $value;
} else {
$products = $this->productService->getAll()->fetchPairs("id", "uri");
$cache->save("prod", $products);
}
$router[] = new Route('produkt/<id>', array(
"module" => "front",
"presenter" => "product",
"action" => "detail",
"id" => array(
Route::FILTER_OUT => function ($id) use ($products) {
return $products[$id];
},
Route::FILTER_IN => function ($id) use ($products) {
return array_search($id, $products);
}
),
));
?>
- Felix
- Nette Core | 1247
besanek napsal(a):
Takhle ti cache moc nepomůže. Protože je to +/- vyjde na stejno jestli taháš všechny záznamy z databáze nebo z cache.
S tim bych byl opatrnej, to by znamenalo, ze odezva z databaze a z filesystemu je stejna. Coz prece rozhodne neni.
Větší problém vidím to, že si vytáhneš úplně všechny produkty, včetně těch co nepoužiješ.
Jak se to vezme, ja v tom naopak vidim celkem uzitek. Vsechny je vezme a ulozi do cache. Mozna bych spis resil jestli ta cache je napriklad Memcache.
- besanek
- Člen | 128
Felix napsal(a):
S tim bych byl opatrnej, to by znamenalo, ze odezva z databaze a z filesystemu je stejna. Coz prece rozhodne neni.
Nikdy to nebude stejné. Databáze může být na síti na jiném stroji a fs může být na ssd. ;) Co je v konkrétním případě výhodnější závisí na více faktorech. Vhodné je to prostě otestovat.
Jak se to vezme, ja v tom naopak vidim celkem uzitek. Vsechny je vezme a ulozi do cache.
K čemu mi bude, že mám všechny v cache? Databáze je mnohem lépe optimalizovaná pro práci s velkým množstvím dat a hledáním v nich.
Pokud například natáhnu z cache pole o tisíci prvcích, tak se celý ten moloch musí načíst a deserializovat, jen proto abych využil jen zlomek prvků.
Mozna bych spis resil jestli ta cache je napriklad Memcache.
Memcache by to mohla řešit. Ale i tak bych to rozlámal na menší kousky. Určitě bych v tomto případě nepoužil jen jeden klíč v cache, ale celou sekci s více klíči.
- Tomáš Votruba
- Moderator | 1114
@batko Tvé řešení sám používám. Pokud je
dostačující, není co řešit.
Jak je tato operace náročná operace teď a jaké náročnosti chceš
dosáhnout?
- besanek
- Člen | 128
Použít nebo se inspirovat v nějakém ORM, které si cachuje do paměti načtené entity.
Když použiješ in filter, tak prostě vytáhneš z databáze celý záznam podle url. Což by jsi stejně později udělal, protože když máš nějakou stránku s produktem, tak k němu chceš asi více údajů než id a url.
Když se používá out filter, tak už máš ten záznam někde vytažený. Odkaz generuješ v nějakém výpisu produktů, kde tu entitu potřebuješ také.
- batko
- Člen | 219
Tomáš Votruba napsal(a):
@batko Tvé řešení sám používám. Pokud je dostačující, není co řešit.
Jak je tato operace náročná operace teď a jaké náročnosti chceš dosáhnout?
Dostačující je. Já se jen pátrám po tom jak to udělat do budoucna. Kdy místo 4000 položek v DB jich budu mít třeba milion. Teoreticky mi stačí když se Cache aktualizuje jednou za den.
Jen přemýšlím nad tím, jak z databáze vytáhnout opravdu jen ty řádky, které v daný okamžik potřebuji pro vytvoření odkazů. Je jich potřeba 10 z 4000