sql >> Databáze >  >> NoSQL >> Redis

Memcached vs. Redis?

Souhrn (TL;DR)

Aktualizováno 3. června 2017

Redis je výkonnější, populárnější a lépe podporovaný než memcached. Memcached umí jen malý zlomek věcí, které umí Redis. Redis je lepší i tam, kde se jejich funkce překrývají.

Pro cokoli nového použijte Redis.

Memcached vs Redis:Přímé srovnání

Oba nástroje jsou výkonná, rychlá úložiště dat v paměti, která jsou užitečná jako mezipaměť. Obojí může pomoci urychlit vaši aplikaci tím, že do mezipaměti uloží výsledky databáze, fragmenty HTML nebo cokoli jiného, ​​jehož generování může být nákladné.

Body ke zvážení

Když se použijí pro stejnou věc, zde je návod, jak se porovnávají pomocí původní otázky „Body ke zvážení“:

  • Rychlost čtení/zápisu :Oba jsou extrémně rychlé. Benchmarky se liší podle pracovní zátěže, verzí a mnoha dalších faktorů, ale obecně ukazují, že redis je stejně rychlý nebo téměř stejně rychlý jako memcach. Doporučuji redis, ale ne proto, že memcached je pomalý. Není.
  • Využití paměti :Redis je lepší.
    • memcached:Určíte velikost mezipaměti a jak vkládáte položky, démon rychle naroste o něco více, než je tato velikost. Ve skutečnosti nikdy neexistuje způsob, jak získat zpět jakýkoli z toho prostoru, kromě restartování memcached. Platnost všech vašich klíčů by mohla vypršet, databázi byste mohli vyprázdnit a stále by používala celou část paměti RAM, se kterou jste ji nakonfigurovali.
    • redis:Nastavení maximální velikosti je na vás. Redis nikdy nepoužije více, než musí, a vrátí vám paměť, kterou již nepoužívá.
    • Do obou jsem uložil 100 000 ~2KB řetězců (~200MB) náhodných vět. Využití paměti RAM v paměti RAM vzrostlo na ~225 MB. Využití paměti RAM Redis vzrostlo na ~228 MB. Po vyprázdnění obou redis klesl na ~29 MB a memcached zůstal na ~225 MB. Jsou podobně efektivní ve způsobu ukládání dat, ale pouze jeden je schopen je získat zpět.
  • Disk I/O dump :Jasná výhra pro redis, protože to dělá ve výchozím nastavení a má velmi konfigurovatelnou perzistenci. Memcached nemá žádné mechanismy pro ukládání na disk bez nástrojů třetích stran.
  • Škálování :Obojí vám poskytne spoustu místa, než budete potřebovat více než jednu instanci jako mezipaměť. Redis obsahuje nástroje, které vám pomohou jít dál, zatímco memcached nikoli.

memcached

Memcached je jednoduchý volatilní cache server. Umožňuje vám ukládat páry klíč/hodnota, kde je hodnota omezena na řetězec o velikosti až 1 MB.

Je v tom dobrý, ale to je tak všechno. K těmto hodnotám můžete přistupovat pomocí jejich klíče extrémně vysokou rychlostí, která často zahlcuje dostupnou síť nebo dokonce šířku pásma paměti.

Po restartu memcached jsou vaše data pryč. To je pro cache v pořádku. Neměli byste tam ukládat nic důležitého.

Pokud potřebujete vysoký výkon nebo vysokou dostupnost, jsou k dispozici nástroje, produkty a služby třetích stran.

redis

Redis může dělat stejné úlohy jako memcached a umí je dělat lépe.

Redis může fungovat také jako mezipaměť. Může také ukládat páry klíč/hodnota. V redis mohou mít dokonce až 512 MB.

Můžete vypnout persistenci a při restartu šťastně ztratí vaše data. Pokud chcete, aby vaše mezipaměť přežila restarty, umožňuje vám to také. Ve skutečnosti je to výchozí nastavení.

Je také super rychlý, často omezený šířkou pásma sítě nebo paměti.

Pokud jedna instance redis/memcached nestačí na výkon pro vaši pracovní zátěž, redis je jasná volba. Redis zahrnuje podporu clusteru a přichází s nástroji vysoké dostupnosti (redis-sentinel) přímo „v krabici“. Během několika posledních let se redis také ukázal jako jasný lídr v oblasti nástrojů třetích stran. Společnosti jako Redis Labs, Amazon a další nabízejí mnoho užitečných nástrojů a služeb redis. Ekosystém kolem redis je mnohem větší. Počet nasazení ve velkém měřítku je nyní pravděpodobně větší než u memcached.

Superset Redis

Redis je víc než jen cache. Je to server se strukturou dat v paměti. Níže naleznete rychlý přehled věcí, které Redis umí kromě toho, že je jednoduchou mezipamětí klíče a hodnoty, jako je memcached. Většina funkcí redis' jsou věci, které memcached neumí.

Dokumentace

Redis je lépe zdokumentován než memcached. I když to může být subjektivní, zdá se, že je to stále více pravdivé.

redis.io je fantastický zdroj se snadnou navigací. Umožňuje vám vyzkoušet redis v prohlížeči a dokonce vám poskytne živé interaktivní příklady s každým příkazem v dokumentech.

Nyní existuje 2x více výsledků stackoverflow pro redis než memcached. 2x tolik výsledků Google. Snadněji dostupné příklady ve více jazycích. Aktivnější vývoj. Aktivnější rozvoj klientů. Tato měření jednotlivě nemusí mnoho znamenat, ale v kombinaci poskytují jasný obrázek, že podpora a dokumentace pro redis je větší a mnohem aktuálnější.

Vytrvalost

Ve výchozím nastavení redis uchovává vaše data na disku pomocí mechanismu zvaného snapshotting. Pokud máte k dispozici dostatek paměti RAM, můžete zapsat všechna data na disk téměř bez snížení výkonu. Je to téměř zdarma!

V režimu snímku existuje možnost, že náhlý pád může způsobit ztrátu malého množství dat. Pokud se absolutně potřebujete ujistit, že se nikdy neztratí žádná data, nemějte obavy, redis vám také kryje záda s režimem AOF (Append Only File). V tomto trvalém režimu lze data synchronizovat na disk tak, jak jsou zapisována. To může snížit maximální propustnost zápisu na rychlost, kterou váš disk dokáže zapisovat, ale stále by to mělo být poměrně rychlé.

Existuje mnoho možností konfigurace pro jemné doladění perzistence, pokud potřebujete, ale výchozí hodnoty jsou velmi rozumné. Tyto možnosti usnadňují nastavení redis jako bezpečného a redundantního místa pro ukládání dat. Je to skutečné databáze.

Mnoho typů dat

Memcached je omezen na řetězce, ale Redis je server datové struktury, který může obsluhovat mnoho různých typů dat. Poskytuje také příkazy, které potřebujete k maximálnímu využití těchto datových typů.

Řetězce (příkazy)

Jednoduchý text nebo binární hodnoty, které mohou mít velikost až 512 MB. Toto je jediný datový typ sdílení redis a memcached, ačkoli řetězce memcached jsou omezeny na 1 MB.

Redis vám poskytuje více nástrojů pro využití tohoto datového typu tím, že nabízí příkazy pro bitové operace, manipulaci na bitové úrovni, podporu přírůstku/snižování s plovoucí desetinnou čárkou, dotazy na rozsah a operace s více klíči. Memcached nic z toho nepodporuje.

Řetězce jsou užitečné pro všechny druhy případů použití, a proto je memcached docela užitečný pouze s tímto typem dat.

Haše (příkazy)

Hashe jsou něco jako úložiště klíčových hodnot v rámci úložiště klíčových hodnot. Mapují mezi řetězcovými poli a řetězcovými hodnotami. Pole->mapy hodnot využívající hash jsou o něco málo efektivnější z hlediska prostoru než mapy klíčových->hodnot využívající běžné řetězce.

Hashe jsou užitečné jako jmenný prostor nebo když chcete logicky seskupit mnoho klíčů. Pomocí hashe můžete efektivně uchopit všechny členy, ukončit platnost všech členů společně, odstranit všechny členy dohromady atd. Skvělé pro jakýkoli případ použití, kdy máte několik párů klíč/hodnota, které je třeba seskupit.

Jedním příkladem použití hashe je ukládání uživatelských profilů mezi aplikacemi. Redis hash uložený s ID uživatele jako klíčem vám umožní uložit tolik bitů dat o uživateli, kolik je potřeba, a zároveň je uložit pod jeden klíč. Výhodou použití hashe namísto serializace profilu do řetězce je, že můžete nechat různé aplikace číst/zapisovat různá pole v uživatelském profilu, aniž byste se museli starat o to, že jedna aplikace přepíše změny provedené ostatními (což se může stát, pokud serializujete zastaralé údaje).

Seznamy (příkazy)

Seznamy Redis jsou uspořádané kolekce řetězců. Jsou optimalizovány pro vkládání, čtení nebo odebírání hodnot z horní nebo dolní části seznamu.

Redis poskytuje mnoho příkazů pro využití seznamů, včetně příkazů pro push/pop položky, push/pop mezi seznamy, zkracování seznamů, provádění dotazů na rozsah atd.

Seznamy dělají skvělé trvanlivé, atomové, fronty. Tyto fungují skvěle pro fronty úloh, protokoly, vyrovnávací paměti a mnoho dalších případů použití.

Sady (příkazy)

Sady jsou neuspořádané kolekce jedinečných hodnot. Jsou optimalizovány tak, aby vám umožnily rychle zkontrolovat, zda je hodnota v sadě, rychle přidat/odebrat hodnoty a změřit překrytí s jinými sadami.

Jsou skvělé pro věci, jako jsou seznamy řízení přístupu, jedinečné sledovače návštěvníků a mnoho dalších věcí. Většina programovacích jazyků má něco podobného (obvykle se nazývá Set). Toto je takové, pouze distribuované.

Redis poskytuje několik příkazů pro správu sad. Jsou přítomny zřejmé ty, jako je přidávání, odebírání a kontrola sady. Stejně tak jsou méně zřejmé příkazy, jako je vyskakování/čtení náhodné položky a příkazy pro provádění spojení a průniků s jinými sadami.

Seřazené sady (příkazy)

Sorted Sets jsou také kolekce jedinečných hodnot. Tyto, jak název napovídá, jsou seřazené. Jsou seřazeny podle partitury a poté lexikograficky.

Tento datový typ je optimalizován pro rychlé vyhledávání podle skóre. Získání nejvyšší, nejnižší hodnoty nebo jakéhokoli rozsahu hodnot mezi nimi je extrémně rychlé.

Pokud přidáte uživatele do seřazené sady spolu s jejich vysokým skóre, máte perfektní žebříček. Jakmile přijdou nové vysoké skóre, stačí je znovu přidat do sady s jejich vysokým skóre a změní pořadí vašeho žebříčku. Skvělé také pro sledování, kdy uživatelé naposledy navštívili a kdo je aktivní ve vaší aplikaci.

Uložení hodnot se stejným skóre způsobí, že budou seřazeny lexikograficky (myšleno abecedně). To může být užitečné pro věci, jako jsou funkce automatického dokončování.

Mnoho příkazů setříděných sad je podobných příkazům pro sady, někdy s dodatečným parametrem skóre. Zahrnuty jsou také příkazy pro správu skóre a dotazování podle skóre.

Geografické údaje

Redis má několik příkazů pro ukládání, načítání a měření geografických dat. To zahrnuje dotazy na poloměr a měření vzdáleností mezi body.

Technicky jsou geografická data v redis uložena v seřazených sadách, takže se nejedná o skutečně samostatný datový typ. Je to spíše rozšíření nad tříděné sady.

Bitmapa a HyperLogLog

Stejně jako geo se nejedná o zcela samostatné datové typy. Jedná se o příkazy, které vám umožňují zacházet s řetězcovými daty, jako by šlo buď o bitmapu nebo hyperloglog.

Bitmapy jsou operátory na bitové úrovni, na které jsem odkazoval pod Strings jsou pro. Tento datový typ byl základním stavebním kamenem pro nedávný společný umělecký projekt redditu:r/Place.

HyperLogLog vám umožňuje používat konstantní extrémně malé množství prostoru k počítání téměř neomezených jedinečných hodnot s šokující přesností. S použitím pouhých ~16 kB můžete efektivně spočítat počet unikátních návštěvníků vašeho webu, i když jde o miliony.

Transakce a atomicita

Příkazy v redis jsou atomické, což znamená, že si můžete být jisti, že jakmile zapíšete hodnotu do redis, tato hodnota je viditelná pro všechny klienty připojené k redis. Není třeba čekat, až se tato hodnota rozšíří. Technicky je memcached také atomický, ale když redis přidává všechny tyto funkce nad rámec memcached, stojí za zmínku a poněkud působivé, že všechny tyto dodatečné datové typy a funkce jsou také atomické.

I když to není úplně stejné jako transakce v relačních databázích, redis má také transakce, které používají "optimistické zamykání" (WATCH/MULTI/EXEC).

Potrubí

Redis poskytuje funkci zvanou 'pipelining'. Máte-li mnoho příkazů redis, které chcete provést, můžete použít zřetězení k jejich odeslání do redis najednou namísto jednoho po druhém.

Normálně, když spustíte příkaz do redis nebo memcached, každý příkaz je samostatný cyklus žádost/odpověď. Díky zřetězení může redis ukládat do paměti několik příkazů a provádět je všechny najednou, přičemž na všechny vaše příkazy reaguje v jediné odpovědi.

To vám umožní dosáhnout ještě větší propustnosti hromadného importu nebo jiných akcí, které zahrnují spoustu příkazů.

Pub/Sub

Redis má příkazy vyhrazené pro funkce pub/sub, které umožňují redis fungovat jako vysokorychlostní vysílatel zpráv. To umožňuje jednomu klientovi publikovat zprávy mnoha dalším klientům připojeným ke kanálu.

Redis dělá pub/sub stejně jako téměř jakýkoli nástroj. Dedikovaní zprostředkovatelé zpráv, jako je RabbitMQ, mohou mít v určitých oblastech výhody, ale skutečnost, že stejný server vám také může poskytnout trvalé trvalé fronty a další datové struktury, které vaše pub/sub pracovní zátěž pravděpodobně potřebuje, se Redis často ukáže jako nejlepší a nejjednodušší nástroj. pro práci.

Lua Scripting

Můžete si představit lua skripty, jako jsou vlastní SQL společnosti Redis nebo uložené procedury. Je to více i méně, ale analogie většinou funguje.

Možná máte složité výpočty, které chcete provést redis. Možná si nemůžete dovolit vrátit své transakce zpět a potřebujete záruky, že každý krok složitého procesu proběhne atomicky. Tyto problémy a mnoho dalších lze vyřešit pomocí lua skriptování.

Celý skript je spouštěn atomicky, takže pokud dokážete vměstnat svou logiku do lua skriptu, můžete se často vyhnout problémům s optimistickými zamykacími transakcemi.

Škálování

Jak bylo zmíněno výše, redis obsahuje vestavěnou podporu pro clustering a je dodáván s vlastním nástrojem vysoké dostupnosti s názvem redis-sentinel .

Závěr

Bez váhání bych doporučil redis přes memcached pro všechny nové projekty nebo stávající projekty, které ještě memcached nepoužívají.

Výše uvedené může znít, že nemám rád memcached. Naopak:je to výkonný, jednoduchý, stabilní, vyzrálý a odolný nástroj. Existují dokonce případy použití, kdy je to o něco rychlejší než redis. Miluju memcached. Jen si myslím, že to pro budoucí vývoj nedává moc smysl.

Redis dělá vše, co memcached, často lépe. Jakákoli výkonnostní výhoda pro memcached je malá a specifická pro pracovní zatížení. Existují také zátěže, pro které bude redis rychlejší, a mnohem více úloh, které redis zvládne a které memcached prostě neumí. Drobné rozdíly ve výkonu se zdají být nepatrné tváří v tvář obrovské propasti ve funkčnosti a skutečnosti, že oba nástroje jsou tak rychlé a efektivní, že mohou být velmi dobře tou poslední částí vaší infrastruktury, o kterou se budete muset starat.

Existuje pouze jeden scénář, kdy memcached dává větší smysl:kde se memcached již používá jako mezipaměť. Pokud již ukládáte do mezipaměti pomocí memcached, pokračujte v používání, pokud to vyhovuje vašim potřebám. Pravděpodobně nestojí za námahu přejít na redis a pokud hodláte používat redis pouze pro ukládání do mezipaměti, nemusí to nabídnout dostatek výhod, aby to stálo za váš čas. Pokud memcached nesplňuje vaše potřeby, pravděpodobně byste měli přejít na redis. To platí, ať už potřebujete škálovat mimo memcached nebo potřebujete další funkce.



  1. Redis:je možné skončit platnost prvku v poli nebo tříděné sadě?

  2. Jak mohu vygenerovat ObjectId pomocí mongoose?

  3. Nastavte výchozí datum při vkládání dokumentu s polem time.Time

  4. MongoDB $last Aggregation Pipeline Operator