Zašto Redis pobjeđuje Memcached zbog predmemoriranja

Memcached ili Redis? Pitanje je koje se gotovo uvijek nameće u bilo kojoj raspravi o istiskivanju više performansi iz moderne web aplikacije koja se temelji na bazama podataka. Kada izvedbu treba poboljšati, predmemoriranje je često prvi korak, a Memcached ili Redis obično su prva mjesta za okretanje.

Ovi poznati mehanizmi predmemorije dijele brojne sličnosti, ali imaju i važne razlike. Redis, noviji i svestraniji od njih dvoje, gotovo je uvijek vrhunski izbor.

Redis vs. Memcached za predmemoriranje

Krenimo sa sličnostima. I Memcached i Redis služe kao pohrane podataka u memoriji, ključ / vrijednost, iako je Redis točnije opisan kao spremište strukture podataka. I Memcached i Redis pripadaju NoSQL obitelji rješenja za upravljanje podacima, a oba se temelje na modelu podataka ključ / vrijednost. Oboje čuvaju sve podatke u RAM-u, što ih naravno čini izuzetno korisnima kao predmemorirajući sloj. Što se tiče izvedbe, dvije pohrane podataka također su izuzetno slične, pokazujući gotovo identične karakteristike (i mjerne podatke) s obzirom na propusnost i latenciju.

I Memcached i Redis zreli su i izuzetno popularni projekti otvorenog koda. Memcached je izvorno razvio Brad Fitzpatrick 2003. za web mjesto LiveJournal. Od tada je Memcached prepisan u C (izvorna je implementacija bila u Perlu) i stavljen u javnu domenu, gdje je postao kamen temeljac modernih web aplikacija. Trenutni razvoj Memcachea usmjeren je na stabilnost i optimizacije, a ne na dodavanje novih značajki.

Redis je 2009. stvorio Salvatore Sanfilippo, a Sanfilippo je i danas vodeći programer projekta. Redis se ponekad opisuje kao "Memcached na steroidima", što ne čudi s obzirom na to da su dijelovi Redisa izgrađeni kao odgovor na lekcije naučene korištenjem Memcacheda. Redis ima više značajki od Memcachea i samim tim je snažniji i fleksibilniji.

Korištene u mnogim tvrtkama i u bezbroj kritičnih proizvodnih okruženja, Memcached i Redis podržavaju klijentske knjižnice u svim zamislivim programskim jezicima, a uključen je u mnoštvo paketa za programere. Zapravo je to rijedak web stack koji ne uključuje ugrađenu podršku za Memcached ili Redis.

Zašto su Memcached i Redis toliko popularni? Ne samo da su izuzetno učinkoviti, već su i relativno jednostavni. Početak rada s Memcachedom ili Redisom smatra se lakim poslom za programere. Potrebno je samo nekoliko minuta da se postave i pokrenu da rade s aplikacijom. Dakle, malo ulaganje vremena i truda može imati trenutni, dramatični utjecaj na performanse - obično po redoslijedu veličine. Jednostavno rješenje s velikom korist; to je što je bliže magiji.

Kada koristiti Memcached

Memcached bi mogao biti poželjniji kada predmemorira relativno male i statične podatke, poput fragmenata HTML koda. Memcacheovo interno upravljanje memorijom, iako nije toliko sofisticirano kao ono u Redisu, učinkovitije je u najjednostavnijim slučajevima korištenja jer troši razmjerno manje resursa memorije za metapodatke. Nizovi (jedina vrsta podataka koju Memcached podržava) idealni su za pohranu podataka koji se samo čitaju jer nizovi ne zahtijevaju daljnju obradu.

Veliki skupovi podataka često uključuju serializirane podatke, što uvijek zahtijeva više prostora za pohranu. Iako je Memcached učinkovito ograničen na pohranu podataka u serializiranom obliku, podatkovne strukture u Redisu mogu nativno pohraniti bilo koji aspekt podataka, smanjujući tako serijske troškove.

Drugi scenarij u kojem Memcached ima prednost nad Redisom je u skaliranju. Budući da je Memcached višenitni, lako ga možete povećati davanjem više računarskih resursa, ali izgubit ćete dio ili sve predmemorirane podatke (ovisno o tome upotrebljavate li dosljedno raspršivanje). Redis, koji je uglavnom jednonitni, može se vodoravno skalirati klasteriranjem bez gubitka podataka. Klasteriranje je učinkovito rješenje skaliranja, ali je relativno složenije za postavljanje i rad.

Kada koristiti Redis

Gotovo uvijek ćete poželjeti koristiti Redis zbog njegovih struktura podataka. S Redisom kao predmemorijom dobivate veliku snagu (poput mogućnosti preciznog podešavanja sadržaja i trajnosti predmemorije) i ukupnu veću učinkovitost. Jednom kada upotrijebite podatkovne strukture, povećanje učinkovitosti postaje strahovito za određene scenarije aplikacije.

Redisova superiornost očituje se u gotovo svim aspektima upravljanja predmemorijom. Predmemorije koriste mehanizam koji se naziva izbacivanje podataka kako bi se napravilo mjesta za nove podatke brisanjem starih podataka iz memorije. Mehanizam za izbacivanje podataka tvrtke Memcached koristi algoritam Najnovije korištene i donekle proizvoljno izbacuje podatke slične veličine kao novi podaci.

Nasuprot tome, Redis omogućuje preciznu kontrolu nad deložacijom, omogućujući vam da odaberete između šest različitih politika deložacije. Redis također koristi sofisticiraniji pristup upravljanju memorijom i odabiru kandidata za deložaciju. Redis podržava i lijeno i aktivno iseljavanje, pri čemu se podaci izbacuju samo kada je potrebno više prostora ili proaktivno. 

Redis vam pruža mnogo veću fleksibilnost u vezi s objektima koje možete predmemorirati. Iako Memcached ograničava imena ključeva na 250 bajtova i radi samo s običnim nizovima, Redis dopušta da imena i vrijednosti ključeva budu po 512 MB, a binarno su sigurni. Osim toga, Redis ima na raspolaganju pet primarnih struktura podataka, koje programeru aplikacija otvaraju svijet mogućnosti inteligentnim predmemoriranjem i manipulacijom predmemoriranim podacima.

Redis za trajnost podataka

Korištenje Redisovih struktura podataka može pojednostaviti i optimizirati nekoliko zadataka - ne samo tijekom predmemoriranja, već čak i kada želite da podaci budu trajni i uvijek dostupni. Na primjer, umjesto da objekte pohranjuju kao serializirane nizove, programeri mogu koristiti Redis Hash za pohranu polja i vrijednosti objekta i upravljati njima pomoću jednog ključa. Redis Hash štedi programerima potrebu za dohvaćanjem cijelog niza, deserializacijom, ažuriranjem vrijednosti, ponovnom centralizacijom objekta i zamjenom cijelog niza u predmemoriji novom vrijednošću za svako trivijalno ažuriranje - što znači manju potrošnju resursa i veće performanse.

Druge strukture podataka koje nudi Redis (poput popisa, skupova, razvrstanih skupova, hiperloga, bitmapa i geoprostornih indeksa) mogu se koristiti za provedbu još složenijih scenarija. Sortirani skupovi za unošenje i analizu podataka vremenskih serija još su jedan primjer Redisove strukture podataka koja nudi izuzetno smanjenu složenost i manju potrošnju propusnosti.

Još jedna važna prednost Redisa je što podaci koje pohranjuju nisu neprozirni, pa ih poslužitelj može izravno manipulirati. Znatan udio naredbi od 180 i više dostupnih u Redisu posvećen je operacijama obrade podataka i ugrađivanju logike u samu pohranu podataka putem skripte Lua na poslužitelju. Ove ugrađene naredbe i korisničke skripte pružaju vam fleksibilnost u rukovanju zadacima obrade podataka izravno u Redisu, bez potrebe za slanjem podataka preko mreže u drugi sustav za obradu.

Redis nudi opcijsku i prilagodljivu trajnost podataka dizajniranu za pokretanje predmemorije nakon planiranog isključivanja ili neplaniranog kvara. Iako podatke u predmemorijama smatramo nestabilnima i prolaznima, trajni podaci na disk mogu biti vrlo vrijedni u scenarijima predmemoriranja. Raspoloživost podataka predmemorije za učitavanje odmah nakon ponovnog pokretanja omogućuje puno kraće zagrijavanje predmemorije i uklanja opterećenje uključeno u ponovno punjenje i ponovni izračun sadržaja predmemorije iz primarne pohrane podataka.

Redis replikaciju podataka u memoriji 

Redis također može replicirati podatke kojima upravlja. Replikacija se može koristiti za implementaciju visoko dostupne postavke predmemorije koja može podnijeti kvarove i pružiti neprekinuti servis aplikaciji. Kvar predmemorije samo je malo kratak od neuspjeha aplikacije u smislu utjecaja na korisničko iskustvo i performanse aplikacije, pa je posjedovanje provjerenog rješenja koje jamči sadržaj predmemorije i dostupnost usluga u većini slučajeva glavna prednost.

I na kraju, ali ne najmanje važno, u pogledu operativne vidljivosti, Redis nudi mnoštvo mjernih podataka i bogatstvo introspektivnih naredbi pomoću kojih se prati i prati upotreba i abnormalno ponašanje. Statistika u stvarnom vremenu o svakom aspektu baze podataka, prikaz svih izvršenih naredbi, popis i upravljanje klijentskim vezama - sve to i još više ima Redis.

Kad programeri shvate učinkovitost Redisove postojanosti i mogućnosti replikacije u memoriji, često je koriste kao bazu podataka prvog odgovora, obično za analizu i obradu podataka velike brzine i pružanje odgovora korisniku dok sekundarna (često sporija) baza podataka održava povijesni zapis o onome što se dogodilo. Kada se koristi na ovaj način, Redis također može biti idealan za slučajeve upotrebe analitike.

Redis za analitiku podataka

Odmah mi padaju na pamet tri scenarija analitike. U prvom scenariju, kada koristite nešto poput Apache Spark za iteracijsku obradu velikih skupova podataka, možete koristiti Redis kao sloj za posluživanje podataka koje je prethodno izračunao Spark. U drugom scenariju, upotreba Redisa kao vaše zajedničke, u memoriji, distribuirane pohrane podataka može ubrzati brzine obrade Sparka za faktor od 45 do 100. Konačno, prečest je scenarij u kojem izvješća i analitiku trebaju prilagoditi korisnika, ali dohvat podataka iz inherentno skupnih spremišta podataka (poput Hadoop-a ili RDBMS-a) traje predugo. U ovom je slučaju spremište strukture podataka u memoriji, poput Redisa, jedini praktični način dobivanja sub-milisekundnog straničenja i vremena odgovora.

Kada koristite izuzetno velike skupove operativnih podataka ili radna opterećenja analitike, pokretanje svega u memoriji možda neće biti isplativo. Da bi postigao performanse ispod milisekundi po nižoj cijeni, Redis Labs stvorio je verziju Redisa koja radi na kombinaciji RAM-a i bljeskalice, s opcijom konfiguriranja omjera RAM-a i bljeskalice. Iako ovo otvara nekoliko novih putova za ubrzavanje obrade radnog opterećenja, programerima također daje mogućnost da jednostavno pokrenu svoju "predmemoriju na flešu".

Softver otvorenog koda i dalje pruža neke od najboljih tehnologija dostupnih danas. Kada je riječ o poboljšanju performansi aplikacija putem predmemoriranja, Redis i Memcached su najotvoreniji i u proizvodnji dokazani kandidati. Međutim, s obzirom na bogatiju Redisovu funkcionalnost, napredniji dizajn, mnoštvo potencijalnih namjena i veću uštedu troškova, Redis bi trebao biti vaš prvi izbor u gotovo svakom slučaju.

---

Itamar Haber (@itamarhaber) glavni je zagovornik programera u Redis Labs, koji nudi Memcached i Redis kao potpuno upravljane usluge u oblaku za programere. Njegovo raznoliko iskustvo uključuje razvoj i upravljanje softverskim proizvodima te vodeće uloge u Xeroundu, Etagonu, Amicadi i MNS Ltd. Itamar je magistar poslovne administracije iz zajedničkog programa Kellogg-Recanati Sveučilišta Northwestern i Tel-Aviv, kao i prvostupnik znanosti iz informatike.

New Tech Forum pruža mjesto za istraživanje i raspravu o novonastaloj tehnologiji poduzeća u neviđenoj dubini i širini. Izbor je subjektivan, zasnovan na našem odabiru tehnologija za koje vjerujemo da su važne i da najviše zanimaju čitatelje. ne prihvaća marketinške kolaterale za objavljivanje i zadržava pravo uređivanja cjelokupnog sadržaja. Pošaljite sve upite na [email protected]