Ohjelmointi

Miksi Redis voittaa Memcachedin välimuistista

Memcached vai Redis? Kysymys nousee melkein aina keskusteluun siitä, kuinka nykyaikaisesta, tietokantapohjaisesta verkkosovelluksesta saadaan enemmän suorituskykyä. Kun suorituskykyä on parannettava, välimuisti on usein ensimmäinen askel, ja Memcached tai Redis ovat tyypillisesti ensimmäisiä paikkoja kääntyä.

Näillä tunnetuilla välimuistimoottoreilla on useita yhtäläisyyksiä, mutta niillä on myös merkittäviä eroja. Redis, uudempi ja monipuolisempi näistä kahdesta, on melkein aina ylivoimainen valinta.

Redis vs. Memcached välimuistista

Aloitetaan samankaltaisuuksista. Sekä Memcached että Redis toimivat muistissa, avainarvon tietovarastoina, vaikka Redistä kuvataan tarkemmin tietorakennevarastoksi. Sekä Memcached että Redis kuuluvat NoSQL-tiedonhallintaratkaisujen perheeseen, ja molemmat perustuvat avainarvomalliin. Molemmat pitävät kaikki tiedot RAM-muistissa, mikä tekee niistä tietysti erittäin hyödyllisen välimuistikerroksena. Suorituskyvyn suhteen nämä kaksi tietovarastoa ovat myös huomattavan samanlaisia, ja niillä on lähes identtiset ominaisuudet (ja mittarit) suorituskyvyn ja viiveen suhteen.

Sekä Memcached että Redis ovat kypsiä ja erittäin suosittuja avoimen lähdekoodin projekteja. Memcached on alun perin kehittänyt Brad Fitzpatrick vuonna 2003 LiveJournal -sivustolle. Siitä lähtien Memcached on kirjoitettu uudelleen C: hen (alkuperäinen toteutus oli Perlissä) ja asetettu julkiseen käyttöön, jossa siitä on tullut kulmakivi nykyaikaisille verkkosovelluksille. Memcachedin nykyinen kehitys on keskittynyt vakauteen ja optimointiin uusien ominaisuuksien lisäämisen sijaan.

Redis luotiin Salvatore Sanfilippo vuonna 2009, ja Sanfilippo on edelleen projektin pääkehittäjä tänään. Redistä kuvataan joskus nimellä "Memcached on steroids", mikä on tuskin yllättävää, kun otetaan huomioon, että osa Redistä rakennettiin vastauksena Memcachedin käytöstä saatuihin oppeihin. Redisillä on enemmän ominaisuuksia kuin Memcachedillä, joten se on tehokkaampi ja joustavampi.

Monien yritysten käyttämät lukemattomissa kriittisissä tuotantoympäristöissä asiakaskirjastot tukevat sekä Memcachedia että Redisiä kaikilla mahdollisilla ohjelmointikielillä, ja se sisältyy lukuisiin kehittäjien paketteihin. Itse asiassa se on harvinainen verkkopino, joka ei sisällä sisäänrakennettua tukea joko Memcachedille tai Redisille.

Miksi Memcached ja Redis ovat niin suosittuja? Sen lisäksi, että ne ovat erittäin tehokkaita, ne ovat myös suhteellisen yksinkertaisia. Joko Memcachedin tai Redisin käytön aloittamista pidetään kehittäjän helppona työnä. Asentaminen ja saaminen sovelluksen kanssa kestää vain muutaman minuutin. Pienellä panostuksella aikaa ja vaivaa voi siis olla välitön, dramaattinen vaikutus suorituskykyyn - yleensä suuruusluokittain. Yksinkertainen ratkaisu, jolla on valtava hyöty; se on niin lähellä taikuutta kuin vain saat.

Milloin käyttää Memcachedia

Muistivälimuisti voi olla parempi, kun välimuistiin tallennetaan suhteellisen pieniä ja staattisia tietoja, kuten HTML-koodin fragmentteja. Vaikka Memcachedin sisäinen muistinhallinta ei ole yhtä hienostunut kuin Rediksen, se on tehokkaampaa yksinkertaisimmissa käyttötapauksissa, koska se kuluttaa suhteellisen vähemmän muistiresursseja metatiedoille. Merkkijonot (ainoa Memcachedin tukema tietotyyppi) ovat ihanteellisia vain luettujen tietojen tallentamiseen, koska merkkijonoja ei tarvitse enää käsitellä.

Suuret tietojoukot sisältävät usein sarjatietoja, joiden tallentaminen vaatii aina enemmän tilaa. Vaikka Memcached on tosiasiallisesti rajoitettu tietojen tallentamiseen sarjoitetussa muodossaan, Rediksen tietorakenteet voivat tallentaa minkä tahansa tiedon aspektin natiivisti, mikä vähentää sarjoituksen yleiskustannuksia.

Toinen skenaario, jossa Memcachedilla on etu Redisiin nähden, on skaalaus. Koska Memcached on monisäikeinen, voit helposti laajentaa antamalla sille enemmän laskennallisia resursseja, mutta menetät välimuistitiedot kokonaan tai osittain (riippuen siitä, käytätkö yhdenmukaista hajautusta). Redis, joka on enimmäkseen yksisäikeinen, voi skaalata vaakasuoraan klustereiden kautta menettämättä tietoja. Klusterointi on tehokas skaalausratkaisu, mutta sen asentaminen ja käyttö on suhteellisen monimutkaista.

Milloin Redistä käytetään

Melkein aina haluat käyttää Redistä sen tietorakenteiden takia. Kun Redis on välimuisti, saat paljon virtaa (kuten kykyä hienosäätää välimuistin sisältöä ja kestävyyttä) ja kokonaistehokkuutta. Kun käytät tietorakenteita, tehokkuuden lisäys tulee valtavaksi tietyissä sovellusskenaarioissa.

Redisin ylivoima näkyy melkein kaikilla välimuistinhallinnan osa-alueilla. Välimuistit käyttävät mekanismia, jota kutsutaan tietojen poistamiseksi, jotta tilaa uudelle datalle poistamalla vanhat tiedot muistista. Memcachedin tietojen häätömekanismissa käytetään vähiten äskettäin käytettyä algoritmia ja hiukan mielivaltaisesti poistetaan tietoja, jotka ovat kooltaan samanlaisia ​​kuin uudet tiedot.

Redis sitä vastoin mahdollistaa hienosäätöjen tarkan hallinnan ja antaa sinun valita kuudesta eri häätöpolitiikasta. Redis käyttää myös kehittyneempiä lähestymistapoja muistinhallintaan ja häätöehdokkaiden valintaan. Redis tukee sekä laiskaa että aktiivista häätöä, jolloin tiedot häätetään vain, kun tarvitaan enemmän tilaa tai ennakoivasti.

Redis antaa sinulle paljon suuremman joustavuuden välimuistissa olevien kohteiden suhteen. Vaikka Memcached rajoittaa avainten nimet 250 tavuun ja toimii vain tavallisilla merkkijonoilla, Redis sallii avainten nimien ja arvojen olla jopa 512 Mt kumpikin, ja ne ovat binaariturvallisia. Lisäksi Redisillä on viisi ensisijaista datarakennetta, joista valita, avaamalla mahdollisuuksien maailman sovelluskehittäjälle älykkään välimuistin ja välimuistidatan manipuloinnin avulla.

Redis tietojen pysyvyyden varmistamiseksi

Redis-tietorakenteiden käyttäminen voi yksinkertaistaa ja optimoida useita tehtäviä - paitsi välimuistin aikana, myös silloin, kun haluat tietojen olevan pysyviä ja aina saatavilla. Esimerkiksi sen sijaan, että objektit tallennettaisiin sarjoitettuina merkkijonoina, kehittäjät voivat käyttää Redis Hash -toimintoa objektin kenttien ja arvojen tallentamiseen ja niiden hallintaan yhdellä avaimella. Redis Hash säästää kehittäjiltä tarvetta noutaa koko merkkijono, poistaa se käytöstä, päivittää arvo, palauttaa objekti uudelleen ja korvata välimuistin koko merkkijono uudella arvolla jokaiselle triviaalille päivitykselle - mikä tarkoittaa pienempää resurssien kulutusta ja lisääntynyttä suorituskykyä.

Muita Rediksen tarjoamia tietorakenteita (kuten luetteloita, sarjoja, lajiteltuja joukkoja, hyperlogogeja, bittikarttoja ja paikkatietohakemistoja) voidaan käyttää vielä monimutkaisempien skenaarioiden toteuttamiseen. Lajiteltuja sarjoja aikasarjatietojen keräämiseksi ja analysoimiseksi on toinen esimerkki Redis-tietorakenteesta, joka tarjoaa huomattavasti pienemmän monimutkaisuuden ja pienemmän kaistanleveyden kulutuksen.

Toinen tärkeä Rediksen etu on, että sen tallentamat tiedot eivät ole läpinäkymättömiä, joten palvelin voi käsitellä niitä suoraan. Huomattava osa Rediksessä käytettävissä olevista 180 plus -komennoista on omistettu tietojenkäsittelytoiminnoille ja logiikan upottamiseen itse tietovarastoon palvelinpuolen Lua-komentosarjojen avulla. Nämä sisäänrakennetut komennot ja komentosarjat antavat sinulle joustavuuden käsitellä tietojenkäsittelytehtäviä suoraan Rediksessä ilman, että sinun tarvitsee lähettää tietoja verkon kautta toiseen järjestelmään käsittelyä varten.

Redis tarjoaa valinnaisen ja viritettävän tiedon pysyvyyden, joka on suunniteltu käynnistämään välimuisti suunnitellun sammutuksen tai odottamattoman vian jälkeen. Vaikka meillä on tapana pitää välimuistien tietoja epävakaina ja ohimenevinä, pysyvät tiedot levylle voivat olla varsin arvokkaita välimuistitilanteissa. Jos välimuistin tiedot ovat ladattavissa heti uudelleenkäynnistyksen jälkeen, välimuisti lämpenee huomattavasti lyhyemmäksi ja poistaa välimuistin sisällön uudelleensijoittamiseen ja uudelleenlaskemiseen liittyvän kuorman ensisijaisesta tietovarastosta.

Uudelleen muistin tietojen replikointi

Redis voi myös kopioida hallitsemansa tiedot. Replikointia voidaan käyttää erittäin saatavilla olevan välimuistiasetuksen toteuttamiseen, joka kestää vikoja ja tarjoaa keskeytymätöntä palvelua sovellukselle. Välimuistivirhe on vain vähän puutteellinen sovelluksen epäonnistumisesta sen suhteen, miten se vaikuttaa käyttäjäkokemukseen ja sovellusten suorituskykyyn, joten todistetun ratkaisun saaminen, joka takaa välimuistin sisällön ja palvelujen saatavuuden, on useimmissa tapauksissa suuri etu.

Viimeisenä mutta ei vähäisimpänä, toiminnan näkyvyyden suhteen Redis tarjoaa joukon mittareita ja runsaasti itsetarkastavia komentoja, joiden avulla voidaan seurata ja seurata käyttöä ja epänormaalia käyttäytymistä. Reaaliaikaiset tilastotiedot kaikista tietokannan osa-alueista, kaikkien suoritettavien komentojen näyttämisestä, asiakasyhteyksien luetteloinnista ja hallinnasta - Redisillä on kaikki tämä ja paljon muuta.

Kun kehittäjät ymmärtävät Rediksen pysyvyyden ja muistin sisäisten replikointimahdollisuuksien tehokkuuden, he käyttävät sitä usein ensimmäisenä vastaajana toimivana tietokantana, yleensä nopean datan analysointiin ja käsittelyyn ja vastausten tarjoamiseen käyttäjälle samalla kun toissijainen (usein hitaampi) tietokanta ylläpitää historiallinen muistio tapahtuneesta. Tällä tavalla käytettynä Redis voi olla ihanteellinen myös analytiikan käyttötapauksissa.

Redis tietojen analysointia varten

Kolme analyysiskenaariota tulee heti mieleen. Ensimmäisessä skenaariossa, kun käytät Apache Sparkin kaltaista tapaa käsitellä iteratiivisesti suuria tietojoukkoja, voit käyttää Redistä palvelukerroksena Sparkin aiemmin laskemille tiedoille. Toisessa skenaariossa Redisin käyttö jaettuna, muistin sisäisenä hajautettuna tietovarastona voi kiihdyttää Sparkin käsittelynopeuksia kertoimella 45-100. Lopuksi aivan liian yleinen skenaario on sellainen, jossa raportit ja analyysit on mukautettava käyttäjän, mutta tietojen noutaminen luonnostaan ​​eräkohtaisista tietovarastoista (kuten Hadoop tai RDBMS) kestää liian kauan. Tässä tapauksessa muistin sisäinen tietorakennevarasto, kuten Redis, on ainoa käytännöllinen tapa saada alle millisekunnin alaiset haku- ja vasteajat.

Kun käytetään erittäin suuria operatiivisia tietojoukkoja tai analytiikan kuormituksia, kaiken muistin käyttäminen ei ehkä ole kustannustehokasta. Millisekunnin alapuolella olevan suorituskyvyn saavuttamiseksi alhaisemmilla hinnoilla Redis Labs loi Redis-version, joka toimii RAM- ja flash-yhdistelmillä, ja mahdollisuus konfiguroida RAM-salama-suhde. Vaikka tämä avaa useita uusia keinoja nopeuttaa työmäärän käsittelyä, se antaa kehittäjille myös mahdollisuuden suorittaa välimuisti flash-tilassa.

Avoimen lähdekoodin ohjelmistot tarjoavat edelleen parhaita saatavilla olevia tekniikoita nykyään. Sovellusten suorituskyvyn parantamiseksi välimuistilla Redis ja Memcached ovat vakiintuneimpia ja tuotannossa todistettuja ehdokkaita. Ottaen kuitenkin huomioon Rediksen rikkaamman toiminnallisuuden, edistyneemmän suunnittelun, monet mahdolliset käyttötavat ja suuremman kustannustehokkuuden, Rediksen pitäisi olla ensimmäinen valinta lähes kaikissa tapauksissa.

---

Itamar Haber (@itamarhaber) on Redis Labsin pääkehittäjä, joka tarjoaa Memcachedia ja Redisiä täysin hallinnoituna pilvipalveluna kehittäjille. Hänen monipuolinen kokemuksensa on ohjelmistotuotekehitys, hallinta ja johtotehtävät Xeroundissa, Etagonissa, Amicadassa ja MNS Ltd. tietojenkäsittelytiede.

New Tech Forum tarjoaa mahdollisuuden tutkia ja keskustella kehittyvistä yritysteknologioista ennennäkemättömällä syvyydellä ja laajuudella. Valinta on subjektiivinen, perustuu valitsemiemme tekniikoihin, joiden uskomme olevan tärkeitä ja kiinnostavia lukijoille. ei hyväksy markkinointivakuuksia julkaisua varten ja pidättää oikeuden muokata kaikkea lähetettyä sisältöä. Lähetä kaikki tiedustelut osoitteeseen [email protected]