Memcache a Memcached – podpora komprese

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

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

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

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

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

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

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.