Memcache a Memcached – podpora komprese
- maarlin
- Člen | 207
Asi jsem skoro jediný, kdo s Nette používá Memcache (dle reakcí na jiná související témata), ale přesto se pokusím tady vyvolat menší diskuzi. Zda bude plodná, se ukáže.
Mám v aplikaci úspěšně nasazené kešování dat z databáze (resp. někdy celých result-setů, někdy samotných hodnot). Občas ale aplikace vyhazuje takovéto chyby:
PHP Notice: MemcachePool::set(): send of 32768 bytes failed with errno=11 Resource temporarily unavailable in /var/home/radek/www/libs/Nette/loader.php:1640
Napadlo mě, že je nechce uložit, protože je to třeba na něj prostě moc dat, tak bych je zkusil komprimovat… Současná verze NMemcachedStorage totiž nepočítá s žádnou komprimací dat.
1) Ruční nastavení komprese
Memcache samo o sobě nabízí uvedení 3. parametru –
$flag = MEMCACHE_COMPRESSED
v metodách set a replace
Faktem je, že metoda get už to pak evidentně sama (i bez uvedení
$flag = MEMCACHE_COMPRESSED
dekomprimuje, přesto že dokumentace
getu doporučuje uvedení toho flagu. Což je dost magické chování…
Nenapadá mě ani způsob, jak zjistit, jestli to skutečně vůbec komprimuje a
zpětně dekomprimuje… :))
Zkuste sami:
<?php
$memcache_obj = memcache_connect('127.0.0.1', 11211);
$data = new stdClass;
$data->color = 'yellow';
$data->height = 145;
memcache_set($memcache_obj, 'myObject', $data, MEMCACHE_COMPRESSED, 5);
$var = memcache_get($memcache_obj, 'myObject', 0);
var_dump($var);
2) Automatická komprese
Memcache evidentně rovněž nabízí možnost automatické komprese –
tzn. pokud zjistí, že by se kompresí ušetřilo x procent, tak jí provede,
jinak jí neprovádí:
http://cz.php.net/…hreshold.php
Nezkoušel jsem použít, ale vypadá to jako zajímavá alternativa k výše uvedenému. Otázka je, kolik režie a času běhu navíc to zabere…
3) Memcache VS Memcached
Přišel jsem na to, že existují 2 implementace (alespoň to chápu jako implementace) – Memcache (bez D) a Memcached (s D).
http://code.google.com/…ntComparison
http://serverfault.com/…vs-memcached
Z čehož pramení malá narážka na fakt, že máme třídu s názvem (N)MemcachedStorage, která ovšem pracuje s knihovnou Memcache (bez D).
Bylo by vhodné porovnat (ne)výhody obou knihoven a používat jednu, nebo případně používat obě, ale především použít u obou správné pojmenování.
4) Komprese dat v Memcached
V materiálech o Memcached jsem nenašel téměř žádnou zmínku o kompresi – nevím zda ji podporuje – zda komprimuje samo, nebo zda prostě komprimaci neřeší. Ani implementace v PHP nemá žádné metody s argumenty, jako má Memcache.
Verze Memcache u nás na serveru: http://awesomescreenshot.com/0254l1u5b
Editoval maarlin (12. 12. 2010 16:14)
- David Grudl
- Nette Core | 8218
Memcached je docela nové rozšíření, vzniklo později, než třída MemcachedStorage. A jmenuje se memcached, protože název memcache je chybný.
Rád tvůj pull request s podporou pro kompresi komitnu, ale tohle, co zmiňuješ, jsou přesně věci, ve kterých je třeba mít jasno. Úplně ideální by bylo kompresi řešit buď automaticky (bod 2), což by se mohlo otestovat měřením využítí paměti, nebo paušálně ji aktivovat v konstruktoru. Nastavování na úrovni zápisu prvku natož jeho čtení situaci trošku komplikuje.
- maarlin
- Člen | 207
Memcached je docela nové rozšíření, vzniklo později, než třída MemcachedStorage. A jmenuje se memcached, protože název memcache je chybný.
Souhlasím, ale to nic nemění na faktu, že by se měl používat ekvivalentní název třídy tomu rozšíření, nad kterým se staví – v tomto případě nad Memcache, nikoliv Memcached. Tedy jinými slovy, pokud se bude i v budoucnu používat Memcache, měla by se třída jmenovat MemcacheStorage, nikoliv MemcachedStorage.
Rád tvůj pull request s podporou pro kompresi komitnu, ale tohle, co zmiňuješ, jsou přesně věci, ve kterých je třeba mít jasno.
Právě proto jsem své poznatky hodil sem, do fóra a ne jako comment k pull requestu.
Editoval maarlin (12. 12. 2010 19:30)
- David Grudl
- Nette Core | 8218
maarlin napsal(a):
Souhlasím, ale to nic nemění na faktu, že by se měl používat ekvivalentní název třídy tomu rozšíření, nad kterým se staví.
To rozhodně ne. Třída Image se taky nejmenuje GD.
- maarlin
- Člen | 207
Třída Image se taky nejmenuje GD.
To je zcela jiný příklad…
Image je tak nějak nekonfliktní název – nemá s čím kolidovat – s žádným jiným ofic. rozšířením PHP (neberte mě za slovo).
Memcache a Memcached jsou dvě existující rozšíření a v tomto případě mícháme jablka s hruškama…
- David Grudl
- Nette Core | 8218
MemcachedStorage je storage pro Memcached server, proto se tak jmenuje, nikoliv proto, že používá nějaké rozšíření PHP. Navíc, jak už jsem psal, druhé rozšíření vzniklo mnohem později, než tato třída.