Memcached vs Redis?

Naudojame „Ruby“ žiniatinklio programą su „ Redis “ talpyklai. Ar prasminga išbandyti memcached ?

Kas suteiks mums geriausius rezultatus? Ar privalumai ar trūkumai tarp „Redis“ ir „Memcached“?

Svarstytini klausimai:

  • Skaitymo / rašymo greitis
  • Atminties naudojimas.
  • Disko I / O atstatymas.
  • Skaidymas.
1009
11 мая '12 в 23:52 2012-05-11 23:52 Sagiv Ofek paklausė gegužės 12 d., 12 val. 23:52 2012-05-11 23:52
@ 17 atsakymų

Santrauka (TL; DR)

Atnaujinta 2017 m. Birželio 3 d

„Redis“ yra galingesnis, labiau populiarus ir geriau palaikomas nei „memcached“. „Memcached“ gali atlikti tik nedidelę dalį „Redis“ veiksmų. Redis yra geresnis, net jei jų funkcijos sutampa.

Jei norite kažką naujo, naudokite „Redis“.

Memcached vs Redis: Tiesioginis palyginimas

Abu įrankiai yra galingi, greitai atminties duomenų saugyklos, kurios yra naudingos kaip talpykla. Abi gali padėti pagreitinti jūsų taikomąją programą spartinant duomenų bazės rezultatus, HTML fragmentus arba kažką kito, kuris gali būti kuriamas.

Taškai, kuriuos reikia apsvarstyti

Naudojant tą patį dalyką, kaip jie lyginami, naudojant pradinį klausimą „Taškai už atlygį“:

  • Skaitymo / rašymo greitis : abu yra labai greitai. Testai skiriasi priklausomai nuo darbo krūvio, versijų ir daugelio kitų veiksnių, tačiau paprastai rodo, kad redis turėtų būti toks pat greitas arba beveik toks pat greitas, kaip ir atmintyje. Aš rekomenduoju redis, bet ne todėl, kad memcached yra lėtas. Tai ne.
  • Atminties naudojimas : „Redis“ yra geresnis.
    • memcached: nurodote talpyklos dydį, o kai įterpsite elementus, demonas greitai auga šiek tiek didesnis už šį dydį. Niekada nėra jokio būdo grąžinti šią erdvę, išskyrus iš naujo paleisti atmintinę. Visi jūsų raktai gali būti pasibaigę, galite išvalyti duomenų bazę ir vis tiek naudos visą RAM bloką, su kuriuo jį sukonfigūravote.
    • redis: maksimalaus dydžio nustatymas priklauso nuo jūsų. „Redis“ niekada nenaudos daugiau nei būtina ir atiduos jums atmintį, kurią jis nebenaudoja.
    • Abiejose vietose išgelbėjau 100 000 ~ 2 KB eilių (~ 200 MB) atsitiktinių sakinių. Memcached atminties naudojimas padidėjo iki ~ 225 MB. Redis RAM naudojimas išaugo iki ~ 228 MB. Po to išplauti, redis sumažėjo iki ~ 29 MB, o memcached liko ~ 225 MB. Jie yra vienodai veiksmingi duomenų saugojimo srityje, tačiau tik vienas gali juos atkurti.
  • Disko I / O dempingas: aiškus pergalės laimėjimas, nes jis tai daro pagal nutylėjimą ir turi labai pritaikomą pastovumą. „Memcached“ neturi mechanizmų įkelti į diską be trečiosios šalies įrankių.
  • Skaidymas . Abu jums t tonų atsargų, prieš jums reikia daugiau nei vieno pavyzdžio kaip talpyklos. „Redis“ apima įrankius, padedančius eiti toliau, o memcached neveikia.

Memcached

„Memcached“ yra paprastas nepastovus talpyklos serveris. Tai leidžia išsaugoti raktų / vertybių poras, kai vertė yra apribota 1 MB eilute.

Gerai, bet viskas. Šias vertes galite pasiekti savo raktu labai dideliu greičiu, dažnai prisotinant prieinamą tinklą arba netgi pralaidumą.

Paleidus memcached, jūsų duomenys išnyko. Tai įprastas talpykloje. Jūs neturite ten saugoti nieko svarbaus.

Jei jums reikia didelio našumo ar aukšto prieinamumo, yra prieinamos trečiosios šalies priemonės, produktai ir paslaugos.

Redis

„Redis“ gali atlikti tas pačias užduotis, kaip ir atminties, ir gali juos padaryti geriau.

„Redis“ gali veikti kaip talpykla . Jis taip pat gali saugoti raktų / verčių poras. Redis, jie gali būti net iki 512 MB.

Jūs galite išjungti atkaklumą, ir jis taip pat praras jūsų duomenis, kai paleisite iš naujo. Jei norite, kad jūsų talpykla išliktų iš naujo, tai taip pat leidžia jums tai padaryti. Tiesą sakant, tai yra numatytasis.

Tai labai greita, dažnai ribojama tinklo arba atminties pralaidumo.

Jei vienintelis redis / memcached atvejis nėra pakankamas jūsų darbo krūviui, redis yra aiškus pasirinkimas. „Redis“ apima klasterio palaikymą ir su geros prieinamumo įrankiais ( redis-sentinel ) dešinėje lauko pusėje. Per pastaruosius kelerius metus „redis“ tapo aiškiu trečiųjų šalių įrankių lyderiu. Tokios įmonės kaip „Redis Labs“, „Amazon“ ir kiti siūlo daug naudingų redis įrankių ir paslaugų. Ekosistema aplink redis yra daug didesnė. Dabar didelio masto diegimų skaičius tikriausiai yra didesnis nei atminties.

Superset redis

„Redis“ yra daugiau nei talpykla. Tai yra atminties duomenų struktūros serveris. Žemiau rasite trumpą apžvalgą apie tai, ką Redis gali atlikti už paprastos raktų / vertės talpyklos, pvz., Atminties. Dauguma redis funkcijų yra dalykai, kuriuos atminti negali.

Dokumentacija

„Redis“ yra geriau užfiksuojama nei atmintinė. Nors tai gali būti subjektyvi, viskas atrodo vis labiau teisinga.

redis.io yra fantastinis, lengvai naršomas šaltinis. Tai leidžia jums išbandyti redis naršyklėje ir netgi suteikia jums gyvus interaktyvius pavyzdžius su kiekviena dokumento komanda.

Šiuo metu „redis“ kaip „memcached“ yra dvigubai daugiau. Dvigubai daugiau „Google“ rezultatų. Daugiau prieinamų pavyzdžių kitomis kalbomis. Aktyvesnė plėtra. Aktyvesnis klientų vystymasis. Šie matavimai gali nereikšti daug individualiai, bet kartu jie aiškiai suvokia, kad parama ir dokumentai, skirti redisui, yra labiau ir labiau susiję.

Patvarumas

Pagal numatytuosius nustatymus redis išsaugo jūsų duomenis į diską naudodamas fotografavimo mechanizmą. Jei turite pakankamai laisvosios atminties, ji gali įrašyti visus jūsų duomenis į diską, beveik be žeminančių rezultatų. Tai beveik nemokama!

Snapshot režimu yra tikimybė, kad staigus gedimas gali sukelti nedidelį prarastų duomenų kiekį. Jei tikrai reikia įsitikinti, kad duomenys nėra prarasti, nesijaudinkite, redis taip pat turi nugarą su AOF („Only Only File“). Šiame saugojimo režime duomenys gali būti sinchronizuojami su disku, kaip jis yra parašytas. Tai gali sumažinti maksimalų įrašymo pralaidumą, tačiau gali būti įrašytas disko greitis, tačiau jis turėtų būti gana greitas.

Jei reikia, galite sutaupyti daug konfigūravimo parinkčių, tačiau numatytosios nuostatos yra labai pagrįstos. Šios parinktys leidžia lengvai redaguoti kaip saugią, nereikalingą saugojimo vietą. Tai tikra duomenų bazė.

Daug duomenų tipų

„Memcached“ yra tik stygos, tačiau „Redis“ yra duomenų struktūros serveris, kuris gali aptarnauti daug įvairių tipų duomenų. Jame taip pat pateikiamos komandos, reikalingos maksimaliam šių duomenų tipų naudojimui.

Linijos

Paprastas tekstas arba dvejetainės reikšmės, kurių dydis gali būti iki 512 MB. Tai yra vienintelis redis ir memcached duomenų tipas, nors memcached stygos yra apribotos iki 1 MB.

„Redis“ suteikia jums daugiau įrankių, kad galėtumėte naudoti šį duomenų tipą, siūlant komandas bitų operacijoms, bitų lygio manipuliavimui, kintamojo taško prieaugiui / sumažinimui palaikyti, diapazono užklausas ir daugia raktų operacijas. „Memcached“ to nepalaiko.

Stygos yra naudingos visų rūšių naudojimo atvejams, todėl atminties yra labai naudinga tik šiam duomenų tipui.

Hashes ( komandos )

Maišai yra kaip pagrindinės vertės parduotuvė pagrindinėje vertės parduotuvėje. Jie rodomi tarp eilutės laukų ir eilutės reikšmių. Lauko vertės vertės maišos kortelės yra šiek tiek efektyvesnės srityje nei pagrindiniai> vertės žemėlapiai, naudojant įprastines eilutes.

Hashes yra naudingos kaip vardų erdvė arba kai norite logiškai suskirstyti daug raktų. Su maišos pagalba jūs galite efektyviai naudoti visus narius, pasibaigti visiems nariams, pašalinti visus narius ir pan. Puikiai tinka bet kokiems naudojimo atvejams, kai turite keletą pagrindinių / vertės porų, kurias reikia sugrupuoti.

Vienas iš hash naudojimo pavyzdžių - išsaugoti naudotojų profilius tarp programų. „Redis hashes“ yra saugomi su vartotojo ID, nes raktas leis jums saugoti kuo daugiau vartotojų duomenų bitų, laikant juos vienu raktu. Naudojimasis „hash“, o ne profilio eilutėje, privalumas yra tas, kad jūs galite turėti skirtingas programas, skirtas skaityti / rašyti skirtingus laukus naudotojo profilyje, nesirūpindami, kad viena programa ignoruoja kitų padarytus pakeitimus (tai gali atsitikti, jei serializuojate pasenusį) duomenys).

Sąrašas ( komandos )

Redis sąrašai yra užsakomi styginių rinkiniai. Jie yra optimizuoti reikšmių įterpimui, skaitymui ar ištrynimui iš viršaus arba apačios (dar žinomas kaip: kairysis arba dešinysis) sąrašas.

„Redis“ suteikia daug komandų, skirtų naudoti sąrašus, įskaitant komandų, skirtų „push / pop“ elementams, „push / pop“ tarp sąrašų, apkarpymo sąrašus, įvairių užklausų atlikimą ir kt.

Sąrašuose pateikiamos didelės, atominės eilės. Jie puikiai tinka darbo eilėms, žurnalams, buferiams ir daugeliui kitų naudojimo būdų.

Nustato

Nustatymai yra nereguliuojamos unikalių vertybių kolekcijos. Jie yra optimizuoti, kad galėtumėte greitai patikrinti, ar rinkinyje yra nustatyta vertė, greitai pridėti / pašalinti vertes ir matuoti persidengimą su kitais rinkiniais.

Jie puikiai tinka tokiems dalykams kaip prieigos kontrolės sąrašai, unikalūs lankytojų stebėtojai ir kt. Daugumoje programavimo kalbų yra kažkas panašaus (paprastai vadinama „Set“). Tai panaši į tai, kas yra tik platinama.

„Redis“ suteikia kelias komandų valdymo komandas . Akivaizdu, pavyzdžiui, rinkinio pridėjimas, ištrynimas ir tikrinimas. Taigi, mažiau akivaizdžios komandos, pavyzdžiui, atsitiktinio elemento išskleidimas / skaitymas ir komandos, skirtos atlikti jungtis ir sankryžas su kitais rinkiniais.

Rūšiuotos komandos

Rūšiuoti rinkiniai taip pat yra unikalių vertybių rinkiniai. Kaip nurodyta pavadinime, jie yra užsakomi. Jie užsakomi pagal skaičių, po to leksikografiškai.

Šis duomenų tipas yra optimizuotas greitai paieškai pagal paskyrą. Didžiausių, mažiausių ar bet kokių vertybių diapazono tarp jų pasiekimas vyksta labai greitai.

Jei pridėsite naudotojus prie surūšiuoto rinkinio kartu su jų aukštu rezultatu, turėsite puikų lyderių sąrašą. Kai pasirodys nauji aukšti balai, paprasčiausiai pridėkite juos prie rinkinio su aukštu rezultatu, o tai pakeis jūsų vadovavimo lentą. Taip pat puikiai tinka, kad galėtumėte stebėti paskutinius naudotojų apsilankymus ir aktyvų naudotoją.

Taupant vertybes su tuo pačiu reitingu, jie verčia užsisakyti leksikografiškai (pagal abėcėlę). Tai gali būti naudinga tokioms funkcijoms kaip automatinis užbaigimas.

Daugelis rūšiuojamų komandų yra panašios į komandų komandas, kartais su neprivalomu reitingų parametru. Taip pat įtrauktos partitūros ir rezultatų užklausų valdymo komandos.

Geo

„Redis“ turi kelias komandas, skirtas saugoti, gauti ir matuoti geografinius duomenis. Tai apima spindulių užklausas ir atstumų tarp taškų matavimą.

Techniniu požiūriu geografiniai duomenys redis yra saugomi rūšiuojamuose rinkiniuose, todėl tai nėra atskiras duomenų tipas. Tai daugiau išrūšiuotų rinkinių viršelis.

„Bitmap“ ir „HyperLogLog“

Kaip ir geo, tai nėra visiškai atskiri duomenų tipai. Tai yra komandos, leidžiančios apdoroti eilutės duomenis taip, tarsi jis būtų rastras arba hiperlogas.

„Bitmaps“ yra tai, ką nurodo bitų lygio operatoriai, kuriuos Strings . Šis duomenų tipas buvo pagrindinis pastarasis pastarasis bendrasis reddit meno projektas: r / Place .

„HyperLogLog“ leidžia naudoti pastovią, labai mažą erdvę, kad galėtumėte skaičiuoti beveik neribotas unikalias vertes su nuostabiu tikslumu. Naudodami tik ~ 16 KB, galite efektyviai suskaičiuoti unikalių lankytojų skaičių jūsų svetainėje, net jei šis skaičius yra milijonais.

Sandoriai ir atomiškumas

Redizavimo komandos yra atominės, o tai reiškia, kad galite būti tikri, kad įrašę redis reikšmę, ši vertė bus matoma visiems klientams, prijungtiems prie redis. Nėra laukiama šios vertės sklaidos. Techniniu požiūriu, memcached taip pat yra atominė, bet redis pridedant šią funkciją ne tik memcached, verta paminėti ir įspūdingai, kad visi šie papildomi duomenų tipai ir funkcijos taip pat yra atominės.

Nors reliacinėse duomenų bazėse ji nėra lygiai tokia pati, kaip sandoriai reliacinėse duomenų bazėse, redis taip pat turi sandorius, kuriuose naudojamas „optimistinis užraktas“ ( WATCH / MULTI / EXEC ).

Vamzdynai

Redis suteikia funkciją, vadinamą pipelining'u . Jei turite daug redis komandų, kurias norite paleisti, galite naudoti vamzdyną, kad galėtumėte juos siųsti daugkartiniam naudojimui, o ne vieną kartą per dieną.

Paprastai, kai vykdote komandą redis arba memcached, kiekviena komanda yra atskiras užklausos / atsakymo ciklas. Naudojant pipelining, redis gali apsaugoti kelias komandas ir jas visus vienu metu atlikti, atsakydamas į visus atsakymus į visas jūsų komandas.

Tai gali leisti pasiekti dar didesnį dažnių juostos plotį, kai importuojami dideli kiekiai arba vykdoma kita veikla, apimanti daug komandų.

Pub / Sub

„Redis“ turi „ pub / sub“ funkcijų komandas , leidžiančias redis veikti kaip didelės spartos transliuotojas. Tai leidžia vienam klientui skelbti pranešimus daugeliui kitų prie kanalo prijungtų klientų.

„Redis“ atlieka pub / sub, taip pat beveik bet kokį įrankį. Specialiosios žiniasklaidos tarpininkai, pvz., „ RabbitMQ“ , gali turėti pranašumų tam tikrose srityse, tačiau tai, kad tas pats serveris taip pat gali suteikti jums nuolatines ilgąsias eilutes ir kitą savo baro / pagalbinės apkrovos struktūrą, tikriausiai reikalingas, „Redis“ dažnai pasirodo esanti geriausia ir labiausiai paprastas įrankis darbui.

Lua scenarijus

Galbūt galvojate apie „ lua“ scenarijus , pvz., Pakeiskite savo SQL arba išsaugotas procedūras. Tai vis daugiau ir mažiau, bet analogija iš esmės veikia.

Gali būti sudėtingų skaičiavimų, kuriuos norite atlikti su redis. Galbūt jūs negalite sau leisti grąžinti savo sandorių ir reikalauti garantijų, kiekvienas sudėtingo proceso žingsnis bus atominis. Šios problemos ir daugelis kitų gali būti išspręstos naudojant lua scenarijus.

Visas scenarijus veikia atominiu būdu, todėl, jei galite įdėti logiką į lua scenarijų, dažnai galite išvengti painiavos su optimistiniais blokuojančiais sandoriais.

mastelio keitimas

Kaip minėta pirmiau, redis apima integruotą klasterizacijos paramą ir yra susietas su savo aukštos kokybės įrankiu, vadinamu redis-sentinel .

Išvada

Be abejonių, norėčiau rekomenduoti perskaičiuoti atmintinę į visus naujus projektus ar esamus projektus, kurie dar nenaudoja memcached.

Pirmiau minėti dalykai gali skambėti kaip nemėgstu atminties. Priešingai, tai yra galingas, paprastas, stabilus, brandus ir sukietėjęs įrankis. Yra net kai kurių naudojimo atvejų, kai tai šiek tiek greičiau nei redis. Man patinka memcached. Aš nemanau, kad tai yra prasminga ateities plėtrai.

„Redis“ atlieka visus memcached, dažnai geriau. Bet koks memcached privalumas yra nereikšmingas ir priklauso nuo apkrovos. Taip pat yra darbo krūvis, dėl kurių redis bus greitesnis, ir daugelis kitų darbo krūvių, kuriuos galima padaryti, gali būti neįmanoma. Nedideli veikimo skirtumai atrodo nereikšmingi, kai yra milžiniškas funkcionalumo įlanka, ir tai, kad abu įrankiai yra tokie greiti ir efektyvūs, kad jie gali būti paskutinis jūsų infrastruktūros elementas, jums kada nors reikės nerimauti.

Yra tik vienas scenarijus, kuriame memcached yra prasmingesnis: kai memcached jau naudojamas kaip talpykla. Jei jau išsaugote atmintinę, naudokite jį, jei jis atitinka jūsų poreikius. Labiausiai tikėtina, kad neturėtumėte pabandyti persijungti į redis, o jei ketinate naudoti redisą tik talpyklai, tai gali būti nepakankama, kad jums kainuotų. Jei memcached neatitinka jūsų poreikių, tikriausiai turėtumėte persikelti. Taip yra, nesvarbu, ar jums reikia skalės už atminties, ar jums reikia papildomų funkcijų.

1410
29 июня '12 в 9:54 2012-06-29 09:54 atsakymą pateikė Carl Zulauf , birželio 29 d. 12 val. 9:54 2012-06-29 09:54

Naudokite redis, jei

  • Turite pasirinktinai ištrinti / ištrinti talpykloje esančius elementus. (Jums reikia)

  • Jums reikia gebėjimo reikalauti tam tikro tipo raktų. e. 'blog1: posts: *', 'blog2: categories: xyz: posts: *'. oh yeah tai labai svarbu. Naudokite tai, kad pasirinktinai pašalintumėte tam tikrų tipų talpykloje saugomus elementus. Taip pat galite naudoti, kad panaikintumėte fragmento talpyklą, puslapio talpyklą, tik šio tipo AR objektus ir tt

  • Atsparumas (jums taip pat reikės, nebent būsite pasiruošę talpyklai sušilti po kiekvieno naujo paleisties. Labai svarbu, kad daiktai retai keičiasi)

Naudokite „memcached“, jei

border=0
  • Memcached suteikia jums galvos apdangalą!
  • umm ... klasterizacija? Kailis jei ketinate eiti iki šiol, naudokite laką ir „Redis“, kad talpintumėte fragmentus ir AR objektus.

Mano patirtimi aš turėjau daug geresnį stabilumą su „Redis“ nei „Memcached“

121
05 июля '12 в 9:04 2012-07-05 09:04 atsakymą pateikė SMathew liepos 5 d. 12 d. 9:04 2012-07-05 09:04

Memcached yra daugiapakopis ir greitas.

Redis turi daug funkcijų ir yra labai greitai, bet visiškai apribotas vienu branduoliu, nes jis yra pagrįstas įvykių ciklu.

Mes naudojame abu. Memcached используется для кэширования объектов, в основном уменьшая нагрузку на чтение в базах данных. Redis используется для таких вещей, как отсортированные наборы, которые удобны для свертывания данных временных рядов.

65
ответ дан W. Andrew Loe III 03 мая '13 в 19:41 2013-05-03 19:41

Это слишком долго, чтобы быть отправленным как комментарий к уже принятому ответу, поэтому я поместил его как отдельный ответ