cache – routování – velké množství odakzů

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

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);
        }
            ),
        ));



?>
besanek
Člen | 128
+
0
-

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. Větší problém vidím to, že si vytáhneš úplně všechny produkty, včetně těch co nepoužiješ.

Editoval besanek (22. 1. 2014 16:14)

Felix
Nette Core | 1247
+
0
-

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
+
0
-

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.

batko
Člen | 219
+
0
-

Děkuji všem za podněty. Každopádně to co jsem provedl, tak to pomohlo opravdu výrazně. Je mi jasné, že tahat všechno není úplně správně, ale nevím jak vytáhnout jen ty co použiju. Máte nějaké nápady????

Tomáš Votruba
Moderator | 1114
+
0
-

@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
+
0
-

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
+
0
-

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