Analiza performansi Redisa u radu sa PHP bibliotekama

Php Redis

Opšte je poznato da je PHP malo sporiji jezik za komunikaciju sa Redisom ukoliko ga uporedimo sa jezicima kao što je Rubby ili Java. Cilj ovog posta je da pokažemo kako se ponašaju različite PHP biblioteke u radu sa Redisom, kakva je brzina izvršenja i kolika je potrošnja memorije. PHP Redis klijenti koji će biti analizirani su

  1. PHPRedis – Napisan je u C jeziku i instalira se kao ekstenzija u PHP. Najbolje uputsvo za instalaciju možete pronaći ovde. Pre testiranja bio sam ubedjen da će se pokazati kao najbolji u svim testovima. Ima odličnu dokumentaciju (za svaku funkciju)  i ukoliko znate komande Redis servera znaćete da koristite i funkcije PHPRedisa.

  2. Predis  – Najkompletniji i najbolje napisan klijent gledajući ga iz programerskog ugla. U potpunosti je napisan u skladu sa OOP principom. Zahteva minimum PHP 5.3.2 . Kod je u skladu sa PSR-0 standardom te se može koristiti autoloading a može se instalirati preko Composer-a. Što se tiče dokumentacije mogli bise ugledati na PHPRedis budući da im je ovo slabija strana. Aktivno se razvija. U testovima nisam uspeo da pustim više od 86000 ključeva u transakcionom (pipeline) režimu.

  3. Rediska –  Pregledajući postojeće testove imao sam određene predrasude prema ovom klijentu. Ispostavilo se da testovi koji su navodili da ovaj klijent ne završava transakcije nisu primetili da Rediska ne može da podržava u transakcijama više od 18000 ključeva kod hasheva i više od 22000 ključeva ( na računaru na kom sam testirao što ne znači da će na nekom drugom biti ista ograničenja) kod ostalih struktura što jeste nekavrsta ograničenja ukoliko vam to u praksi zaista i treba. Sveopšti utisak je da je Rediška solidan PHP Redis klijent. Rediska, kao i Predis, predstavlja grupu klasa. Ima dobru dokumenaciju (uključujući detaljna uputstva kako ga integrisati sa Zend i Symphony frejmvorcima ali bi mogli da je dorade u određenim segmentima (pipeline). Poslednja verzija Rediske, u trenutku pisanja ovog posta, datira od 02.04.2011. godine te se ne može reći da se aktivno razvija.

  4. Redisent – Jednostavan Redis klijent koji se sastoji od samo jednog fajla. Jednostavan je za korišćenje i može se naći kao default klijent u PHP framework-cima kao što su FuelPHP i Laravel. Intuitivan je za korišćenje tj metode su iste kao na samom Redisu.

  5. RedisServer – Takođe jednostavan klijent i dosta sličan Redisentu. Izuzetno je lagan za korišćenje.

Testovi

Kao što ste se upoznali u prethodnom postu Redis podržava pet različitih tipova podataka, tj. stringove, setove, sortirane setove, heševe i liste. Svaki od ovih tipova biće obuhvaćen odgovarajućim testom. Podaci će biti upisivani i čitani kako na klasičan način tako i koristeći Redisove transakcije (pipeline). Verzija Redisa za testiranje je 2.6 a podrazumevana konfiguracija nije menjana što znači da je AOF režimu.

 

Tip podataka STRING

string speed

string memory alocation

string memory peak

 

Tip podataka SET

set speed

set memory alocation

set memory peak

 

Tip podataka SORTED SET

set speed

sorted set memory alocation

sorted set memory peak

 

Tip podataka HASH

hash speed

hash memory alocation

hash memory peak

 

Tip podataka LIST

list speed

hash list alocation

list memory peak

 

Komentar testova

Kao što vidite na slikama u testovima stringova smo upisivali 20000 ključeva, kod Hash-eva 15000 ključeva sa 3 vrednosti dok kod ostalih tipova se upisuje 20 ključeva sa 1000 članova. Što je manja vrednost na grafikonu time je rezultat bolji. Kada bismo izvršili prosto rangiranje po svim kategorijama i u globalu redosled bi bi sledeći:

PHP Client  SPEED  ALOCATED MEMORY  MEMORY PEAK  TOTAL RANK
PHPRedis  66  68  75  209 1
Predis  45  42  35  122 4
Rediska  27  18  20  65 5
Redisent  56  43  50  149 3
RedisServer  46  60  50  156 2

 

PHPRedis je odneu ubedljivu pobedu kada se pogledaju krajnji rezultati. Naročito je bitan rezultat najčešće korišćene operacije tj. SET & GET operacija nad stringovima u osnovnom režimu. Moram priznati da je pravo iznenađenje da ovaj klijent nije odneo pobede u pipeline režimu, štaviše – malo je i razočarao ili sam od njega više očekivao na ovom polju. Svakako da se na ovom polju može malo poraditi tj. napredak u ovome je nešto što se može i mora. Redisent i RedisServer predstavljaju pravo iznenađenje i predstavljaju idealan odnos – krajnje jednostavne klase i performansi te nije ni čudo što je Redisent sastavni deo nekih framework-a. Predis i Rediska su platili cenu OOP pristupa i kao najbolji dokaz toga jeste prikaz potrošnje memorije ovih klijenata. Kod Rediske je ovo naročito izraženo ali ako se detaljnije pogleda vidi se da je kod ovog klijenta svaki ključ zapravo jedan objekat te krajnji rezultat i ne čudi.

Zaključak

Kao logičan sled okolnosti bi bio da vam kažem da rezultati testova ukazuju na to da treba koristiti PHPRedis kao PHP klijent. Kao što sam već naveo ovaj klijent se instalira kao PHP ekstenzija te ako niste sigurni da ćete imati podršku ove vrste na serveru nemojte ga koristiti. Ukoliko vam je potrebna “lakša” varijanta (npr. kada koristite Redis kao cache) opredelite se za Redisent ili RedisServer čiji je rezultat sasvim zadovoljavajući. Predis je “teška” artiljerija, po ukusu OOP čistunaca, vrlo moćan po strukturi i opcijama i sa lakoćom se integriše u PHP framework-e. Redisku ne preporučujem jer je direktan konkurent Predisu te ne vidim ni jedan razlog zbog kojeg bi se opredelio za ovog klijenta.

Ukoliko vam se ukaže prilika da radite sa Redisom, pažljivo analizirajte. Posvetite vreme testiranju PHP klijenata jer Redis se upotrebljava da bi se vreme izvršenja minimalizovalo te je svaka ušteda vremena dobrodošla. Pažljivo birajte…

3 thoughts on “Analiza performansi Redisa u radu sa PHP bibliotekama

  1. Dusan Lukic say:

    Odlicno, bilo bi zanimljivo videti kod od testova.

  2. Milane,

    Predis je biblioteka koja se koristi u sastavu Laravel 4 frejmvorka.

    Baš me je začudilo da su odabrali ovu tešku artiljeriju u sastavu veoma light frejmvorka.

Leave a Reply

Your email address will not be published. Required fields are marked *