Резюме (TL;DR)
Актуализирано на 3 юни 2017 г.
Redis е по-мощен, по-популярен и по-добре поддържан от memcached. Memcached може да направи само малка част от нещата, които Redis може да направи. Redis е по-добър дори там, където функциите им се припокриват.
За всичко ново използвайте Redis.
Memcached срещу Redis:Директно сравнение
И двата инструмента са мощни, бързи хранилища на данни в паметта, които са полезни като кеш. И двете могат да помогнат за ускоряване на приложението ви, като кешират резултати от база данни, HTML фрагменти или нещо друго, което може да е скъпо за генериране.
Точки за разглеждане
Когато се използват за едно и също нещо, ето как те се сравняват с помощта на „Точки за разглеждане“ на оригиналния въпрос:
- Скорост на четене/запис :И двете са изключително бързи. Бенчмарковете варират според натоварването, версиите и много други фактори, но обикновено показват, че redis е толкова бърз или почти толкова бърз, колкото memcached. Препоръчвам redis, но не защото memcached е бавен. Не е.
- Използване на памет :Redis е по-добър.
- memcached:Вие задавате размера на кеша и докато вмъквате елементи, демонът бързо нараства до малко повече от този размер. Всъщност никога няма начин да възстановите това пространство, освен да рестартирате memcached. Всичките ви ключове може да са с изтекъл срок на валидност, можете да изчистите базата данни и тя все още ще използва цялата част RAM, с която сте я конфигурирали.
- redis:Задаването на максимален размер зависи от вас. Redis никога няма да използва повече, отколкото трябва, и ще ви върне паметта, която вече не използва.
- Запазих 100 000 ~2KB низове (~200MB) произволни изречения и в двете. Използването на Memcached RAM нарасна до ~225MB. Използването на Redis RAM нарасна до ~228MB. След прочистване и на двете, redis падна до ~29MB и memcached остана на ~225MB. Те са също толкова ефективни в начина, по който съхраняват данни, но само един е в състояние да ги възстанови.
- Изхвърляне на I/O диск :Ясна победа за redis, тъй като той прави това по подразбиране и има много конфигурируема устойчивост. Memcached няма механизми за изхвърляне на диск без инструменти на трети страни.
- Мащабиране :И двете ви дават много място за глава, преди да имате нужда от повече от един екземпляр като кеш. Redis включва инструменти, които да ви помогнат да надхвърлите това, докато memcached не го прави.
memcached
Memcached е прост непостоянен кеш сървър. Позволява ви да съхранявате двойки ключ/стойност, където стойността е ограничена до низ до 1MB.
Добър е в това, но това е всичко, което прави. Можете да получите достъп до тези стойности чрез техния ключ с изключително висока скорост, често насищаща наличната мрежа или дори честотната лента на паметта.
Когато рестартирате memcached вашите данни са изчезнали. Това е добре за кеш. Не трябва да съхранявате нищо важно там.
Ако имате нужда от висока производителност или висока наличност, има налични инструменти, продукти и услуги на трети страни.
редис
Redis може да върши същите задачи като memcached и може да ги върши по-добре.
Redis може да действа и като кеш. Може да съхранява и двойки ключ/стойност. В redis те могат да бъдат дори до 512MB.
Можете да изключите постоянството и то с радост ще загуби вашите данни при рестартиране. Ако искате кешът ви да оцелее при рестартиране, той ви позволява да направите и това. Всъщност това е по подразбиране.
Освен това е супер бърз, често ограничен от мрежата или честотната лента на паметта.
Ако един екземпляр на redis/memcached не е достатъчна производителност за вашето работно натоварване, redis е ясният избор. Redis включва поддръжка на клъстери и се предлага с инструменти за висока наличност (redis-sentinel) точно „в кутията“. През последните няколко години redis също се очерта като безспорен лидер в инструментите на трети страни. Компании като Redis Labs, Amazon и други предлагат много полезни инструменти и услуги за Redis. Екосистемата около redis е много по-голяма. Броят на широкомащабните разгръщания сега вероятно е по-голям, отколкото за memcached.
Супернаборът Redis
Redis е нещо повече от кеш. Това е сървър за структура на данни в паметта. По-долу ще намерите бърз преглед на нещата, които Redis може да направи, освен да бъде прост кеш ключ/стойност като memcached. Повечето от функциите на redis са неща, които memcached не може да направи.
Документация
Redis е по-добре документиран, отколкото memcached. Макар че това може да е субективно, изглежда, че е все по-вярно през цялото време.
redis.io е фантастичен лесно ориентиран ресурс. Позволява ви да опитате redis в браузъра и дори ви дава интерактивни примери на живо с всяка команда в документите.
Вече има 2 пъти повече резултати от stackoverflow за redis, отколкото memcached. 2 пъти повече резултати от Google. По-лесно достъпни примери на повече езици. По-активно развитие. По-активно развитие на клиенти. Тези измервания може да не означават много поотделно, но в комбинация те дават ясна картина, че поддръжката и документацията за redis са по-големи и много по-актуални.
Постоянство
По подразбиране redis запазва вашите данни на диск, използвайки механизъм, наречен моментни снимки. Ако имате достатъчно налична RAM, той може да запише всичките ви данни на диск без почти никакво влошаване на производителността. Почти безплатно е!
В режим на моментна снимка има вероятност внезапният срив да доведе до малко количество загубени данни. Ако абсолютно трябва да се уверите, че никакви данни не са загубени, не се притеснявайте, redis има и вашият гръб с режим AOF (Добавяне само на файл). В този режим на постоянство данните могат да се синхронизират с диска, докато са записани. Това може да намали максималната пропускателна способност на запис до толкова бързо, колкото може да записва вашият диск, но все пак трябва да е доста бързо.
Има много опции за конфигуриране за фина настройка на постоянството, ако имате нужда, но настройките по подразбиране са много разумни. Тези опции улесняват настройката на redis като безопасно, излишно място за съхранение на данни. Това е истинско база данни.
Много типове данни
Memcached е ограничен до низове, но Redis е сървър за структура на данни, който може да обслужва много различни типове данни. Той също така предоставя командите, от които се нуждаете, за да се възползвате максимално от тези типове данни.
Стрингове (команди)
Прости текстови или двоични стойности, които могат да бъдат с размер до 512MB. Това е единственият тип данни redis и memcached share, въпреки че мемкешираните низове са ограничени до 1MB.
Redis ви предоставя повече инструменти за използване на този тип данни, като предлага команди за побитови операции, манипулация на ниво битове, поддръжка за увеличаване/намаляване с плаваща запетая, заявки за диапазон и операции с няколко клавиша. Memcached не поддържа нищо от това.
Низовете са полезни за всякакви случаи на употреба, поради което memcached е доста полезен само с този тип данни.
Хешове (команди)
Хешовете са нещо като хранилище за ключови стойности в хранилище за стойност на ключове. Те картографират между низови полета и низови стойности. Картите на поле->стойност, използващи хеш, са малко по-ефективни от пространството, отколкото картите на ключ->стойност, използващи обикновени низове.
Хешовете са полезни като пространство от имена или когато искате логически да групирате много ключове. С хеш можете ефективно да вземете всички членове, да изтечете всички членове заедно, да изтриете всички членове заедно и т.н. Чудесно за всеки случай на употреба, при който имате няколко двойки ключ/стойност, които трябва да се групират.
Един пример за използване на хеш е за съхраняване на потребителски профили между приложения. Редис хеш, съхранен с потребителския идентификатор като ключ, ще ви позволи да съхранявате толкова битове данни за потребител, колкото са необходими, като същевременно ги съхранявате под един ключ. Предимството на използването на хеш вместо сериализиране на профила в низ е, че можете да имате различни приложения да четат/записват различни полета в потребителския профил, без да се притеснявате, че едно приложение отменя промените, направени от други (което може да се случи, ако сериализирате остарели данни).
Списъци (команди)
Redis списъците са подредени колекции от низове. Те са оптимизирани за вмъкване, четене или премахване на стойности от горната или долната част (известна още като:отляво или отдясно) на списъка.
Redis предоставя много команди за използване на списъци, включително команди за натискане/изкарване на елементи, натискане/изкарване между списъци, съкращаване на списъци, изпълнение на заявки за диапазон и т.н.
Списъците правят страхотни издръжливи, атомни, опашки. Те работят чудесно за опашки за задачи, журнали, буфери и много други случаи на употреба.
Набори (команди)
Наборите са неподредени колекции от уникални стойности. Те са оптимизирани, за да ви позволят бързо да проверите дали дадена стойност е в набора, бързо да добавяте/премахвате стойности и да измервате припокриването с други набори.
Те са чудесни за неща като списъци за контрол на достъпа, уникални проследяващи посетители и много други неща. Повечето езици за програмиране имат нещо подобно (обикновено наричано Set). Това е така, само разпределено.
Redis предоставя няколко команди за управление на набори. Налице са очевидни такива като добавяне, премахване и проверка на набора. По-малко очевидни са командите като изскачане/четене на произволен елемент и команди за извършване на обединения и пресичания с други набори.
Сортирани набори (команди)
Сортираните набори също са колекции от уникални стойности. Тези, както подсказва името, са поръчани. Те са подредени по партитура, след това лексикографски.
Този тип данни е оптимизиран за бързи справки по резултат. Получаването на най-високата, най-ниската или всеки диапазон от стойности между тях е изключително бързо.
Ако добавите потребители към сортиран набор заедно с техния висок резултат, ще имате перфектна таблица с лидери. Когато се появят нови високи резултати, просто ги добавете отново към набора с техния най-висок резултат и това ще пренареди класацията ви. Също така чудесно за проследяване на последното посещение на потребителите и кой е активен във вашето приложение.
Съхраняването на стойности с еднакъв резултат кара те да бъдат подредени лексикографски (мислете по азбучен ред). Това може да бъде полезно за неща като функции за автоматично довършване.
Много от командите за сортирани набори са подобни на командите за набори, понякога с допълнителен параметър за оценка. Включени са и команди за управление на резултати и запитване по резултат.
География
Redis има няколко команди за съхранение, извличане и измерване на географски данни. Това включва заявки за радиус и измерване на разстояния между точките.
Технически географските данни в redis се съхраняват в сортирани набори, така че това не е наистина отделен тип данни. Това е по-скоро разширение върху сортираните набори.
Растрово изображение и HyperLogLog
Подобно на geo, това не са напълно отделни типове данни. Това са команди, които ви позволяват да третирате низовите данни, сякаш са или растерна карта, или хиперлог.
Растерните изображения са това, което операторите на битово ниво споменах под Strings
са за. Този тип данни беше основният градивен елемент за скорошния съвместен арт проект на reddit:r/Place.
HyperLogLog ви позволява да използвате постоянно изключително малко пространство, за да преброите почти неограничени уникални стойности с шокираща точност. Използвайки само ~16KB, можете ефективно да преброите броя на уникалните посетители на вашия сайт, дори ако този брой е в милиони.
Транзакции и атомност
Командите в redis са атомарни, което означава, че можете да сте сигурни, че веднага щом напишете стойност в redis, тази стойност е видима за всички клиенти, свързани с redis. Няма чакане тази стойност да се разпространи. Технически memcached също е атомен, но с добавянето на redis цялата тази функционалност извън memcached, заслужава да се отбележи и донякъде впечатляващо, че всички тези допълнителни типове данни и функции също са атомарни.
Въпреки че не е съвсем същото като транзакциите в релационни бази данни, redis също има транзакции, които използват „оптимистично заключване“ (WATCH/MULTI/EXEC).
Тръбопровод
Redis предоставя функция, наречена „тръбопровод“. Ако имате много команди за redis, които искате да изпълните, можете да използвате конвейер, за да ги изпратите на redis наведнъж вместо един по един.
Обикновено, когато изпълнявате команда към redis или memcached, всяка команда е отделен цикъл на заявка/отговор. С конвейера, redis може да буферира няколко команди и да ги изпълни наведнъж, като отговаря с всички отговори на всичките ви команди в един отговор.
Това може да ви позволи да постигнете още по-голяма производителност при групово импортиране или други действия, които включват много команди.
Pub/Sub
Redis има команди, посветени на функционалността на pub/sub, което позволява на redis да действа като високоскоростен разпространител на съобщения. Това позволява на един клиент да публикува съобщения до много други клиенти, свързани към канал.
Redis прави pub/sub, както и почти всеки инструмент. Специализираните брокери на съобщения като RabbitMQ може да имат предимства в определени области, но фактът, че същият сървър може също да ви даде постоянни трайни опашки и други структури от данни, от които вероятно ще се нуждаят вашите работни натоварвания на pub/sub, Redis често ще се окаже най-добрият и най-прост инструмент за работата.
Скриптове на Lua
Можете да мислите за lua скриптове като собствен SQL на redis или съхранени процедури. И повече, и по-малко от това, но аналогията най-вече работи.
Може би имате сложни изчисления, които искате да извърши redis. Може би не можете да си позволите да върнете транзакциите си назад и имате нужда от гаранции, че всяка стъпка от сложен процес ще се случи атомарно. Тези и много други проблеми могат да бъдат решени с lua скриптове.
Целият скрипт се изпълнява атомарно, така че ако можете да вместите логиката си в lua скрипт, често можете да избегнете да се забърквате с оптимистични заключващи транзакции.
Мащабиране
Както бе споменато по-горе, redis включва вградена поддръжка за клъстериране и е в комплект със собствен инструмент за висока достъпност, наречен redis-sentinel
.
Заключение
Без колебание бих препоръчал redis над memcached за всякакви нови проекти или съществуващи проекти, които все още не използват memcached.
Горното може да звучи така, сякаш не харесвам memcached. Напротив:това е мощен, прост, стабилен, зрял и закален инструмент. Има дори някои случаи на използване, при които е малко по-бърз от redis. Обичам memcached. Просто не мисля, че има много смисъл за бъдещо развитие.
Redis прави всичко, което прави memcached, често по-добре. Всяко предимство на производителността за memcached е незначително и специфично за натоварването. Има и работни натоварвания, за които redis ще бъде по-бърз, и много повече натоварвания, които redis може да направи, но memcached просто не може. Малките разлики в производителността изглеждат незначителни в лицето на гигантската пропаст във функционалността и факта, че и двата инструмента са толкова бързи и ефективни, че може да са последната част от вашата инфраструктура, за която някога ще трябва да се притеснявате за мащабиране.
Има само един сценарий, при който memcached има повече смисъл:когато memcached вече се използва като кеш. Ако вече кеширате с memcached, продължете да го използвате, ако отговаря на вашите нужди. Вероятно не си струва усилията да преминете към redis и ако ще използвате redis само за кеширане, това може да не предложи достатъчно полза, за да си струва времето. Ако memcached не отговаря на вашите нужди, тогава вероятно трябва да преминете към redis. Това е вярно, независимо дали трябва да мащабирате извън memcached или имате нужда от допълнителна функционалност.