Za určitých okolností nevyprší cache

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

Pokud uložím do cache nejaka data (s libovolně nastavenou expirací), a v zápětí je čtu bez toho, aby proběhla další operace s cache (zápis nebo čtení), tak data zůstanou v cache i po uplynutí času expirace. Jednoduchý test:

$cache->save('oneSecondData', array('second' => 1), 1);

sleep(2);

if(isset($cache['oneSecondData']) {
	echo 'Expired data...';
}

Chyba je v tom, že třída Cache si pamatuje poslední použitý klíč (ať už čtený nebo zapisovaný), a pokud je dotazovaný klíč stejný jako ten poslední použitý, tak se neprovádí žádné kontroly a prostě se vrátí data.

Editoval arron (25. 4. 2011 15:09)

kravčo
Člen | 721
+
0
-

Toto je feature. Bez toho by klasické pracovanie s kešou bolo o niečo pomalšie a nebolo akože atomické:

if (!isset($cache[$key])) {
    // ...
    $cache->save(...);
}
// ! tu môže dôjsť k zneplatneniu keše
echo $cache[$key];

a teda by bolo treba používať pomocné premenné:

$data = $cache[$key];
if ($data === NULL) {
	// ...
	$data = $cache->save(...);
}
echo $data;

Ak ti to vyložene vadí, môžeš použiť volanie $cache->release(), ktoré internú keš keše vyprázdni.

arron
Člen | 464
+
0
-

Jo, ono to nejspis dava smysl…

Prisel jsem na to, kdyz jsem psal nejaky unit test na cache. Tam je potreva (pri jistych okrajovych podminkach) na to davat bacha a to release() fakt zavolat. Jinak to asi nema racionalni pouziti, takze je to v pohode:-)

kravčo
Člen | 721
+
0
-

Áno, aj v testoch samotného Nette sa release() používa…

David Grudl
Nette Core | 8228
+
0
-

Setkal jsem se s myšlenkou, že by si objekt $cache mohl pamatovat nejen poslední klíč, ale rovnou všechny. Co myslíte?

Honza Marek
Člen | 1664
+
0
-

Hm, já jsem předpokládal, že to tak je. Takže mi to pochopitelně přijde jako dobrý nápad.

Patrik Votoček
Člen | 2221
+
0
-

určitě! nebudu to muset „hackovat“! Pochopitelně na základě namespace (klíče pouze z danné namespace).

RadekDvorak
Člen | 11
+
0
-

David Grudl napsal(a):

Setkal jsem se s myšlenkou, že by si objekt $cache mohl pamatovat nejen poslední klíč, ale rovnou všechny. Co myslíte?

Leda by to šlo snadno vypnout či překonfigurovat. Používám i dlouho běžící cli skripty a bylo by zbytečné, aby po dnu běhu skript spadnul kvůli nedostatku paměti jen proto, že nabobtnala cache. Už jsem viděl, jak došla paměť kvůli seznamu sql dotazů :-(

Edit: autorství citace

Editoval RadekDvorak (9. 6. 2011 0:10)

Filip Procházka
Moderator | 4668
+
0
-

Né celou cache, ale seznam klíčů.

kravčo
Člen | 721
+
0
-

A aký význam by malo pamätanie si všetkých kľúčov bez hodnôt?

Filip Procházka
Moderator | 4668
+
0
-

Aby se dalo invalidovat konkrétní namespace? Nebo vypsat někam celou cache? Třeba taková Doctrine vyloženě potřebuje seznam klíčů, jinak to odmíná smazat. Což asi není úplně ideální, ale je vidět, že se to opravdu hodí :)

kravčo
Člen | 721
+
0
-

Ja som to, čo David písal, pochopil ako zoznam všetkých od vytvorenia vyžiadaných kľúčov (a ich hodnôt).

Načítavať zoznam kľúčov pri vytvorení objektu Cache sa mi zdá overhead, ktorý zabije aj urýchlenie, ktoré cache prináša… Alebo to chápem nesprávne?

Filip Procházka
Moderator | 4668
+
0
-

Klíče nejsou problém, stačilo by je ukládat třeba do FileJournalu, tj fuk. Problém by byl, kdyby se v paměti držela úplně celá cache celého namespace. To by nebylo dobré.