Спогад проти Redis?


1466

Ми використовуємо веб-додаток Ruby з сервером Redis для кешування. Чи є натомість тест на Memcached замість цього?

Що дасть нам кращі показники? Якісь плюси чи мінуси між Redis та Memcached?

Бали, які слід врахувати:

  • Швидкість читання / запису.
  • Використання пам'яті.
  • Демпінг диска вводу / виводу.
  • Масштабування.

38
Ще один аналіз, окрім наведених нижче коментарів: Google Trends: redis vs. memcached
MarkHu

3
Один коментар, який не гарантує відповіді: якщо ви дивитесь на хмарні сервіси для цих двох систем (наприклад, heroku addons), послуги Memcached іноді зовсім трохи дешевші за МБ з будь-якої причини.
Бен Робертс

Відповіді:


2103

Підсумок (TL; DR)

Оновлено 3 червня 2017 року

Redis є більш потужним, популярнішим і краще підтримується, ніж запам’ятовується. Спогад може зробити лише невелику частину речей, які може зробити Редіс. Redis краще навіть там, де їх функції перетинаються.

Для нічого нового використовуйте Redis.

Memcached vs Redis: Пряме порівняння

Обидва інструменти є потужними, швидкими сховищами пам'яті, які корисні як кеш. Обидва можуть допомогти пришвидшити ваше додавання, кешуючи результати бази даних, фрагменти HTML чи будь-що інше, що може бути дорого згенеровано.

Бали для розгляду

Якщо вони використовуються для однієї і тієї ж речі, ось як вони порівнюють, використовуючи оригінальне запитання "Бали до розгляду":

  • Швидкість читання / запису : Обидва надзвичайно швидкі. Орієнтовні показники залежать від завантаженості, версій та багатьох інших факторів, але, як правило, показують, що редис є таким же швидким або майже таким же швидким, як запам'ятоване. Я рекомендую redis, але не тому, що запам'ятовування відбувається повільно. Це не.
  • Використання пам’яті : кращий переділ.
    • memcached: Ви вказуєте розмір кеша, і при вставці елементів демон демонструє швидкість до трохи більше, ніж цей розмір. Ніколи не існує способу відновити будь-який з цього простору, не маючи можливості перезапустити запам'ятоване. Усі ваші ключі можуть закінчитися, ви можете промити базу даних, і вона все одно буде використовувати повний фрагмент оперативної пам’яті, з яким ви її налаштували.
    • redis: Встановлення максимального розміру залежить від вас. Redis ніколи не використовуватиме більше, ніж потрібно, і поверне вам пам'ять, яку він більше не використовує.
    • Я зберігав 100 000 ~ 2 КБ рядків (~ 200 МБ) випадкових речень в обидва. Використання оперативної пам'яті, що склалася, зросла до ~ 225 МБ. Використання оперативної пам’яті Redis зросло до ~ 228 МБ. Після промивання обох, redis знизився до ~ 29MB, а запам'ятоване залишилось на рівні ~ 225MB. Вони аналогічно ефективні в тому, як вони зберігають дані, але лише один здатний повернути їх.
  • Демпінг вводу / виводу диска : явний виграш для Redis, оскільки він робить це за замовчуванням і має дуже настроювану стійкість. Memcached не має механізмів скидання на диск без сторонніх інструментів.
  • Масштабування : і те, і інше дає тобі високий простір, перш ніж вам потрібно більше ніж один екземпляр як кеш. Redis включає в себе інструменти, які допоможуть вам вийти за рамки цього, поки це не зроблено.

запам’ятовується

Memcached - це простий серверний кеш-сервер. Це дозволяє зберігати пари ключів / значень, де значення обмежується рівнем до 1 МБ.

Це добре в цьому, але це все, що він робить. Ви можете отримати доступ до цих значень за їх ключем на надзвичайно високій швидкості, часто насичуючи доступну мережу або навіть пропускну здатність пам'яті.

При перезапуску запам’ятовування ваших даних більше немає. Це добре для кешу. Ви не повинні зберігати там нічого важливого.

Якщо вам потрібна висока продуктивність або висока доступність, доступні сторонні інструменти, продукти та послуги.

redis

Redis може виконувати ті ж завдання, що і memcached can, і може робити їх краще.

Redis також може діяти як кеш . Він також може зберігати пари ключ / значення. У Redis вони можуть бути до 512 Мб.

Ви можете вимкнути наполегливість, і він із задоволенням втратить ваші дані і при перезапуску. Якщо ви хочете, щоб кеш пережив перезавантаження, він дозволяє вам це зробити і. Насправді це за замовчуванням.

Це також дуже швидко, часто обмежене пропускною здатністю мережі або пам'яті.

Якщо один екземпляр redis / memcached не має достатньої продуктивності для вашого робочого навантаження, redis - це зрозумілий вибір. Redis включає підтримку кластерів і постачається з інструментами високої доступності ( redis-sentinel ) прямо "у полі". Протягом останніх кількох років Redis також став чітким лідером у розробці інструментів сторонніх виробників. Такі компанії, як Redis Labs, Amazon та інші пропонують багато корисних інструментів і послуг Redis. Екосистема навколо redis набагато більша. Кількість широкомасштабних розгортань зараз, ймовірно, більша, ніж для запам’ятовуваних.

Суперсет Redis

Redis - це більше, ніж кеш. Це сервер структури даних в пам'яті. Нижче ви знайдете короткий огляд того, що Redis може зробити за винятком простого кеша клавіш / значення, як запам'ятоване. Більшість функцій Redis - це те, що запам'ятовувати не може.

Документація

Redis краще задокументовано, ніж запам'ятоване. Хоча це може бути суб’єктивним, воно, здається, все більше істинно відповідає.

redis.io - це фантастичний ресурс, який легко орієнтується. Це дозволяє спробувати переробити в браузері і навіть дає вам живі інтерактивні приклади з кожною командою в документах.

Зараз є 2 рази стільки результатів, як stackoverflow для redis, як запам'ятоване. У 2 рази більше результатів Google. Більш доступні приклади на більшості мов. Більш активний розвиток. Більш активний розвиток клієнтів. Ці вимірювання можуть не означати багато індивідуально, але в поєднанні вони малюють чітку картину про те, що підтримка та документація для Redis є більшою та набагато актуальнішою.

Наполегливість

За замовчуванням redis зберігає ваші дані на диску за допомогою механізму, який називається знімком. Якщо у вас є достатня кількість оперативної пам’яті, вона зможе записати всі ваші дані на диск майже без погіршення продуктивності. Це майже безкоштовно!

У режимі знімка є ймовірність, що раптовий збій може призвести до невеликої кількості втрачених даних. Якщо вам абсолютно потрібно переконатися, що жодні дані ніколи не втрачаються, не хвилюйтеся, у Redis також є ваша спина в режимі AOF (додавати лише файл). У цьому режимі збереження дані можуть бути синхронізовані на диск, як записано. Це може знизити максимальну пропускну здатність запису до того, наскільки швидко ваш диск може записати, але все одно має бути досить швидким.

Існує безліч варіантів конфігурації, щоб точно налаштувати стійкість, якщо вам потрібно, але значення за замовчуванням дуже зрозумілі. Ці параметри дозволяють легко налаштувати Redis як безпечне, зайве місце для зберігання даних. Це справжня база даних.

Багато типів даних

Memcached обмежений рядками, але Redis - це сервер структури даних, який може обслуговувати безліч різних типів даних. Він також надає команди, необхідні для максимального використання цих типів даних.

Рядки ( команди )

Простий текстовий або двійковий значення, розміром до 512 Мб. Це єдиний тип даних "redis and memcached share", хоча рядки, що запам'ятовуються, обмежені 1 Мб.

Redis надає більше інструментів для використання цього типу даних, пропонуючи команди для побітових операцій, маніпуляцій на рівні бітів, підтримки збільшення / зменшення плаваючої точки, запитів діапазону та операцій з декількома ключами. Memcached не підтримує нічого з цього.

Рядки корисні для всіляких випадків використання, тому запам’ятовування є досить корисним лише для цього типу даних.

Хеші ( команди )

Хеші схожі на сховище ключових значень у сховищі ключових значень. Вони відображають між рядковими полями та значеннями рядків. Карти значень поля> за допомогою хеша трохи ефективніше простору, ніж карти значень ключа>>, використовуючи звичайні рядки.

Хеші корисні як простір імен, або коли ви хочете логічно згрупувати багато клавіш. За допомогою хеша ви можете захопити всіх членів ефективно, термін дії всіх членів разом, видалити всі члени разом і т. Д. Відмінно підходить для будь-якого випадку використання, коли у вас є кілька пар ключів / значень, які потрібно згрупувати.

Один із прикладів використання хешу - для зберігання профілів користувачів між додатками. Хед Redis, що зберігається з ідентифікатором користувача в якості ключа, дозволить вам зберігати стільки бітів даних про користувача, скільки потрібно, зберігаючи їх під одним ключем. Перевага використання хеша замість серіалізації профілю в рядок полягає в тому, що ви можете мати різні програми для читання / запису різних полів у профілі користувача, не турбуючись про те, що одне додаток перевершує зміни, внесені іншими (що може статися, якщо ви серіалізуєте несвіжий дані).

Списки ( команди )

Списки Redis - це упорядковані колекції рядків. Вони оптимізовані для вставки, читання або видалення значень зверху або внизу (також: зліва або справа) списку.

Redis надає безліч команд для використання списків, включаючи команди для перемикання / виправлення елементів, натискання / перемикання між списками, скорочення списків, виконання запитів про діапазон тощо.

Списки створюють великі довговічні, атомні, черги. Вони чудово підходять для черг на роботу, журналів, буферів та багатьох інших випадків використання.

Набори ( команди )

Набори - це не упорядковані колекції унікальних цінностей. Вони оптимізовані, щоб швидко перевірити, чи є значення в наборі, швидко додати / вилучити значення та виміряти накладення з іншими наборами.

Вони чудово підходять для таких речей, як списки контролю доступу, унікальні відстежувачі відвідувачів та багато інших речей. Більшість мов програмування мають щось подібне (зазвичай його називають набором). Це так, тільки поширюється.

Redis надає кілька команд для управління наборами. Присутні такі очевидні, як додавання, видалення та перевірка набору. Так менш менш очевидні команди, як вискакування / читання випадкового елемента та команди для виконання об'єднань та перетинів з іншими наборами.

Відсортовані набори ( команди )

Відсортовані набори - це також колекції унікальних значень. Ці, як випливає з назви, впорядковані. Вони упорядковуються за рахунком, потім лексикографічно.

Цей тип даних оптимізований для швидкого пошуку за рахунком. Отримати найвищий, найнижчий або будь-який діапазон значень між ними надзвичайно швидко.

Якщо ви додасте користувачів до відсортованого набору разом з їх високим балом, у вас є ідеальна дошка лідерів. Коли нові високі бали надходять, просто додайте їх до набору разом із їх високим балом, і він буде переупорядкований вашим лідером. Також чудово підходить для того, щоб відслідковувати останній раз відвідувачів та тих, хто активно працює у вашій програмі.

Збереження значень з однаковим балом змушує їх упорядковуватись лексикографічно (мислити алфавітно). Це може бути корисно для таких речей, як функції автоматичного заповнення.

Багато впорядкованих наборів команд схожі на команди для наборів, іноді з додатковим параметром оцінки. Також включені команди для управління балами та запити за балом.

Гео

Redis має кілька команд для зберігання, пошуку та вимірювання географічних даних. Сюди входять радіусні запити та вимірювання відстаней між точками.

Технічно географічні дані в Redis зберігаються в сортованих наборах, тому це не справді окремий тип даних. Це більше розширення поверх відсортованих наборів.

Растрові зображення та HyperLogLog

Як і гео, це не зовсім окремі типи даних. Це команди, які дозволяють обробляти рядкові дані так, ніби це або растрова карта, або гіперлог.

Растрові карти - це те, для чого призначені оператори бітового рівня Strings. Цей тип даних був основним блоком для недавнього мистецького проекту Reddit: r / Place .

HyperLogLog дозволяє використовувати постійний надзвичайно малий простір для підрахунку майже необмежених унікальних значень з шокуючою точністю. Використовуючи лише ~ 16 КБ, ви зможете ефективно підрахувати кількість унікальних відвідувачів вашого сайту, навіть якщо ця кількість становить мільйони.

Транзакції та атомність

Команди redis є атомними, тобто ви можете бути впевнені, що як тільки ви напишете значення redis, це значення буде видимим для всіх клієнтів, підключених до redis. Немає очікування, коли ця величина пошириться. Технічно запам’ятовується також атомно, але, додаючи червоний додаток всієї цієї функціональності за межі згаданого, варто зазначити і дещо вражаюче, що всі ці додаткові типи даних і функції також є атомними.

Незважаючи на транзакції в реляційних базах даних, Redis також має транзакції, які використовують "оптимістичне блокування" ( WATCH / MULTI / EXEC ).

Трубопровідна

Redis надає функцію під назвою " трубопровід ". Якщо у вас є багато команд redis, які ви хочете виконати, ви можете скористатися конвеєрним шляхом, щоб надіслати їх на redis all-at-one, а не на один раз.

Зазвичай, коли ви виконуєте команду або повторно, або запам'ятовується, кожна команда є окремим циклом запиту / відповіді. У конвеєрному режимі redis може буферувати декілька команд та виконувати їх усі одночасно, відповідаючи на всі відповіді на всі ваші команди в одній відповіді.

Це може дозволити вам досягти ще більшої пропускної здатності при масовому імпорті або інших діях, що передбачають безліч команд.

Паб / Під

Redis має команди, присвячені функцій pub / sub , що дозволяють redis діяти як широкомовна транслятор повідомлень. Це дозволяє одному клієнту публікувати повідомлення багатьом іншим клієнтам, підключеним до каналу.

Redis робить паб / суб, а також майже будь-який інструмент. Виділені брокери з повідомленнями, такі як RabbitMQ, можуть мати переваги в певних областях, але той факт, що той самий сервер також може надавати вам стійкі довговічні черги та інші структури даних, які, можливо, потребуватимуть навантаження на паб / підряд, Redis часто виявиться найкращим і найпростішим інструментом за роботу.

Луа сценаріїв

Ви можете думати про такі сценарії, як власний SQL Redis або збережені процедури. Це і більше, і менше, але аналогія здебільшого працює.

Можливо, у вас є складні обчислення, які ви хочете виконати. Можливо, ви не можете дозволити собі, щоб ваші транзакції були відмовлені, і вам потрібні гарантії, що кожен крок складного процесу відбуватиметься атомно. Ці проблеми та багато іншого можна вирішити за допомогою сценаріїв Луа.

Весь сценарій виконується атомно, тому, якщо ви можете вписати свою логіку в скрипт lua, ви часто можете уникати возитися з оптимістичними блокуваннями транзакцій.

Масштабування

Як було сказано вище, Redis включає вбудовану підтримку кластеризації та постачається разом із власним інструментом підвищеної доступності redis-sentinel.

Висновок

Без вагань я рекомендую перераховувати memcached для будь-яких нових проектів або існуючих проектів, які вже не використовують memcached.

Сказане може здатися так, що мені не подобається запам’ятовування. Навпаки: це потужний, простий, стабільний, зрілий і загартований інструмент. Існують навіть деякі випадки використання, коли це трохи швидше, ніж редис. Я люблю запам’ятовувати. Я просто не думаю, що це має багато сенсу для подальшого розвитку.

Redis робить все, що запам'ятовує, часто краще. Будь-яка перевага продуктивності для пам’яті незначна та навантаження. Існують також робочі навантаження, для яких перероблення буде швидше, і ще багато робочих навантажень, які може переробити Redis, які запам'ятовувати просто не можуть. Невеликі відмінності в продуктивності виглядають незначними в умовах гігантської затоки функціональності і того факту, що обидва інструменти настільки швидкі та ефективні, що вони можуть бути останньою частиною вашої інфраструктури, яку вам коли-небудь доведеться турбуватися про масштабування.

Є лише один сценарій, коли memcached має більше сенсу: де memcached вже використовується як кеш. Якщо ви вже кешуєте з memcached, тоді продовжуйте використовувати його, якщо він відповідає вашим потребам. Напевно, не варто докладати зусиль, щоб перейти на redis, і якщо ви збираєтеся використовувати Redis лише для кешування, це може не запропонувати достатньо користі, щоб бути вашим часу. Якщо запитання не відповідає вашим потребам, ви, ймовірно, повинні перейти до redis. Це вірно, чи вам потрібно масштабувати межу, чи потрібна додаткова функціональність.


11
Як Memcached пропонує кластеризацію таким чином, що існує на сервері? Я завжди використовував бібліотеки, які поширювали на пул сформованих серверів, використовуючи алгоритми хешування або модуль. Те ж саме сказано і для Редіса. Я в основному використовую Python, і, здається, є досить багато модулів, які не покладаються на запам’ятовувану бібліотеку для обробки пулів підключення.
причал

2
"Операції з оптимістичним блокуванням (WATCH / MULTI / EXEC)" - Redis не має правильних транзакцій. Тобто, якщо [multi, cmd1, cmd2, cmd3 (виняток), exec], тоді cmd1 та cmd2 будуть виконані.
Олег

10
@ Олег, це насправді не так. Якщо ви використовуєте multi-exec, команди буферуються (тобто: не виконуються) до появи exec, тож якщо у вас є виняток перед exec, тоді жодні команди фактично не виконуються. Якщо exec викликається, всі буферизовані команди виконуються атомно, якщо, звичайно, зміна вахти не була змінена з моменту першого виклику multi. Цей останній механізм є оптимістичною блокувальною частиною.
Карл Зулауф

3
@whardier Ви маєте рацію. Оновлений відповідь, що відображає, що "підтримка" кластера в пам'яті включена додатковими інструментами. Повинні були дослідити це краще.
Карл Зулауф

3
як щодо кластеризації з couchbase-сервером? (сумісне сумісне)
Ken Liu

142

Використовуйте Redis, якщо

  1. Вам потрібно вибірково видалити / закінчити термін дії елементів кешу. (Вам це потрібно)

  2. Вам потрібна можливість запиту ключів певного типу. екв. 'blog1: posts: *', 'blog2: kategorija: xyz: повідомлення: *'. о так! це дуже важливо. Використовуйте це для вибіркового визнання певних типів кешованих елементів. Ви також можете використовувати це для визнання недійсним кешем фрагментів, кеша сторінки, лише AR-об’єктів заданого типу тощо.

  3. Наполегливість (Вам це також знадобиться, якщо ви не в порядку, якщо кеш повинен розігріватися після кожного перезавантаження. Дуже важливо для об'єктів, які рідко змінюються)

Використовуйте memcached, якщо

  1. Спогад дає вам головний біль!
  2. гмм ... кластеризація? мех. якщо ви підете так далеко, використовуйте Varnish та Redis для кешування фрагментів та AR-об’єктів.

З мого досвіду я мав набагато кращу стабільність з Redis, ніж Memcached


7
Документація Redis говорить, що використання шаблонів вимагає сканування таблиці. blog1: posts: * може знадобитися сканування таблиці O (N). Звичайно, це все ще швидко на наборах даних розумного розміру, оскільки Redis швидкий. Це повинно бути добре для тестування або адміністратора.
wisty

182
Головний біль - це жарт, правда? :-) Я погуглився на голову, але я не знайшов нічого розумного. (Я новачок у Memcached and Redis)
KajMagnus

11
проголосували вниз з тієї ж причини , ніж @pellucide. Redis може бути кращим, ніж Memcached, але Memcached банально використовувати. У мене ніколи не було проблем з цим, і це тривіально конфігурувати.
Дієго Янчич

5
Дякую @KajMagnus за те, що ви зробили мій день .. можливо весь мій тиждень 😂
alex

@DiegoJancic Redis - одна з найпростіших технологій використання. Не маючи попередніх знань про Redis, мені знадобилося всього 20 хвилин, щоб встановити його на Ubuntu за допомогою менеджера пакунків у хмарі та почати робити прості запити. Через 4 години я міг створити складніші сценарії POC із пакетними вставками за допомогою сценарію Lua та вибору правильної (NIO) бібліотеки Java для підвищення продуктивності. Я не можу уявити нічого більш доброзичливого та простого у використанні, ніж Redis.
Лось на

105

Спогад багатошаровий і швидкий.

Redis має безліч функцій і дуже швидкий, але повністю обмежений одним ядром, оскільки заснований на циклі подій.

Ми використовуємо і те, і інше. Memcached використовується для кешування об'єктів, в першу чергу зменшення завантаження читання в базах даних. Redis використовується для таких речей, як відсортовані набори, зручні для збирання даних часових рядів.


2
Веб-сайти з високим трафіком, які сильно інвестують у певну пам’ять і мають вузькі місця на нереляційних даних типу "профіль користувача", повинні оцінювати обкладку паралельно зі звичайним

2
@siliconrockstar - досить впевнений, що Redis 3 все ще є одноядерним; принаймні AWS Redis (для якого застосовується 3.2.6 або 3.2.10) попереджає це враховувати, переглядаючи, наприклад, Metric EngineCpuUtilization Metrics
dwanderson

1
Схоже, ти маєш рацію, я думаю, що коли я робив цей коментар, я грунтувався на неповних джерелах. Видалений коментар.
siliconrockstar

але ви все одно можете запустити $ core_count екземпляри Redis
Imaskar

2
Redis вкрай орієнтований на ефективність - тож вам потрібно запитати себе, чому купа розумних розробників вирішила зберегти його єдиною ниткою? З документів Redis "Не дуже часто CPU стає вашим вузьким місцем з Redis, як зазвичай Redis або пам'ять, або мережа пов'язана". Якщо ви використовували грубий сервер, який був пов'язаний з процесором, то, ймовірно, у вас є багато користувачів і в будь-якому випадку ви повинні мати кілька зайвих серверів. Якщо ви хочете збільшити максимум декількох процесорів на одному сервері, використовуйте розділення. Читайте: redis.io/topics/…
robocat

91

Це занадто довго, щоб розміщувати його як коментар до вже прийнятої відповіді, тому я ставлю це як окрему відповідь

Також слід врахувати, чи очікується, що у вашому екземплярі кешу буде встановлено жорсткий верхній межа пам'яті.

Оскільки redis - це база даних nosql, що має безліч функцій, а кешування - це лише одна опція, для якої вона може використовуватися, вона виділяє пам'ять у міру необхідності - чим більше об'єктів ви помістите в неї, тим більше пам'яті вона використовує. Цей maxmemoryпараметр не суворо застосовує верхнє обмеження використання пам'яті. Під час роботи з кешем ключі вилучаються та закінчуються; швидше за все, ваші клавіші не однакового розміру, тому відбувається внутрішня фрагментація пам'яті.

За замовчуванням redis використовує аллокатор пам'яті jemalloc , який намагається зробити його компактним і швидким, але це розподільник пам’яті загального призначення, і він не може йти в ногу з великою кількістю виділень і чищенням об'єктів, що виникають з високою швидкістю. Через це, на деяких шаблонах навантаження процес перепрофілювання може, очевидно, просочитися в пам'яті через внутрішню фрагментацію. Наприклад, якщо у вас є сервер із 7 Гб оперативної пам’яті і ви хочете використовувати redis як непостійний кеш LRU, ви можете виявити, що процес перероблення з maxmemoryвстановленим рівнем 5Gb з часом використовує все більше і більше пам’яті, врешті-решт потрапляючи на загальний ліміт оперативної пам’яті до вбивця поза пам'яттю втручається.

memcached краще підходить до описаного вище сценарію, оскільки він управляє своєю пам'яттю зовсім по-іншому. memcached виділяє один великий шматок пам'яті - все, що йому коли-небудь знадобиться, - а потім керує цією пам’яттю сам, використовуючи власний реалізований розподільник плит . Більше того, memcached намагається утримати внутрішню фрагментацію на низькому рівні, оскільки він фактично використовує алгоритм LRU на планку , коли виселення LRU проводяться з врахуванням розміру об'єкта.

Зважаючи на це, memcached все ще має сильне становище в середовищах, коли використання пам'яті повинно бути примусовим та / або бути передбачуваним. Ми спробували використати найновіший стабільний редис (2.8.19) як випадок непостійної заміни на основі LRU з замішеним навантаженням у робочому навантаженні 10–15 кт / с, і це просочилося пам’яттю A LOT; той самий навантаження збиває випадки перегляду ElastiCache Amazon через один день через ті самі причини.


2
З redis.io/topics/faq : Redis має вбудований захист, що дозволяє користувачеві встановити максимальний ліміт використання пам'яті, використовуючи параметр maxmemory у конфігураційному файлі, щоб встановити обмеження на пам'ять, яку може використовувати Redis. Якщо цей ліміт досягнуто, Redis почне відповідати з помилкою в написанні команд (але надалі буде приймати команди лише для читання), або ви можете налаштувати її для вимкнення клавіш, коли буде досягнуто максимального обмеження пам'яті у випадку, коли ви використовуєте Redis для кешування У нас є документація, якщо ви плануєте використовувати Redis в якості кешу LRU. посилання
StefanNch

8
@StefanNch maxmemoryопція redis не враховує фрагментацію внутрішньої пам'яті. Будь ласка, дивіться мій коментар вище для детальної інформації - проблеми, які я там описав, бачилися в сценарії, описаному на сторінці "Редіс як кеш LRU" із включеними параметрами обмеження пам'яті. з іншого боку, memcached, використовує інший підхід, щоб уникнути проблеми з фрагментацією пам'яті, тому обмеження її пам'яті набагато "важче".
artyom

46

Memcached корисний тим, що він є простим сховищем ключів / значень і добре робить ключ => STRING. Це робить його справді хорошим для зберігання сеансів.

Redis добре робить ключ => SOME_OBJECT.

Це дійсно залежить від того, що ви збираєтеся туди вкласти. Я розумію, що з точки зору продуктивності вони досить рівні.

Також удачі в пошуку будь-яких об'єктивних орієнтирів, якщо ви знайдете якісь люб'язно надішліть їх моїм шляхом.


2
IMO тип даних Redis Hash має набагато більше сенсу для зберігання змінних сеансу, ніж їх серіалізація у складений рядок.
Карл Зулауф

6
Якщо ви дбаєте про досвід користувачів, не кладіть свої сеанси в кеш. dormando.livejournal.com/495593.html
sleblanc

4
@sebleblanc Теоретично це не повинно бути проблемою з Redis, однак, оскільки існує і стійкість диска.
haknick

2
Пам’ятка @sebleblanc все ще гарна при зберіганні сеансу, ви її погано реалізуєте чи ні. так, виселення - це проблема, але ні в якому разі не є непереборною, також це не проблема пам’яті, якщо ви не переживаєте про виселення. Більшість рішень сеансу пам’яті використовують файли cookie як резервну копію.
Ерік Петерсен

11
"Не кладіть свої сеанси в кеш-пам'ять" вводить в оману. Що ви маєте на увазі - "Не зберігайте свої сеанси лише в кеші". Кожен, хто зберігає важливі дані лише в пам'яті, повинен бути негайно звільнений.
Яків

37

Якщо ви не заперечуєте проти стилю письма, Redis vs Memcached на блозі Systoilet варто прочитати з точки зору зручності, але не забудьте прочитати відповіді та коментарі, перш ніж робити будь-які висновки щодо ефективності; є деякі методологічні проблеми (тести з однопоточним зайнятим циклом), і Redis вніс деякі вдосконалення з моменту написання статті.

І жодне посилання на орієнтир не є повним, не плутаючи щось, тому також ознайомтеся з деякими суперечливими орієнтирами в LiveJournal Dormondo та у веб-журналі Antirez .

Правка - як зазначає Антірез, аналіз Systoilet є досить непродуманим. Навіть за винятком нестачі в одній нитці значна частина розбіжностей у виконанні цих орієнтирів може бути віднесена до клієнтських бібліотек, а не пропускної здатності сервера. Тести на в Antirez веблогів дійсно є порівняння набагато більше яблук з яблуками (з тим же ротом).



28
Ви не жартували з приводу тріщини.
ocodo

1
Більше за його застарілий блог за 2010 рік
Сіддхарт

24

У мене з’явилася можливість використовувати як запам'ятоване, так і повторне повторне використання в кексі-проксі, над яким я працював, дозвольте мені поділитися з вами, де саме я використав те, що і причину за тим же ...

Redis>

1) Використовується для індексації вмісту кешу над кластером. У мене більше ніж мільярд ключів у розповсюджених кластерах Redis, час реакції на redis є зовсім меншим та стабільним.

2) В основному це сховище ключів / цінностей, тож де в будь-якій програмі у вас є щось подібне, ви можете користуватися redis з багато чого.

3) Постійність Redis, відмова та резервне копіювання (AOF) полегшать вашу роботу.

Memcache>

1) так, оптимізована пам'ять, яка може використовуватися як кеш. Я використовував його для зберігання вмісту кешу, який отримує доступ дуже часто (з 50 зверненнями в секунду) розміром менше 1 Мб.

2) Я виділив лише 2 ГБ з 16 ГБ для пам’яті, що теж коли мій єдиний розмір вмісту був> 1 Мб.

3) Оскільки вміст зростає поблизу меж, я періодично спостерігаю більш високий час відгуку в статистиці (що не стосується Redis).

Якщо ви попросите загального досвіду, Redis набагато зелений, так як його легко налаштувати, набагато гнучкіший із стабільними надійними функціями.

Крім того, за цим посиланням доступний результат тестування , нижче - кілька підсвіток із цього ж,

введіть тут опис зображення

введіть тут опис зображення

Сподіваюся, це допомагає !!


14

Тест. Запустіть кілька простих орієнтирів. Довгий час я вважав себе носорогом зі старої школи, оскільки я в основному використовував печериці і вважав Редіса новим малюком.

З моєю нинішньою компанією Redis використовувався як основний кеш. Коли я заглибився в статистику продуктивності і просто почав тестувати, Redis був, з точки зору продуктивності, порівнянним або мінімально повільнішим, ніж MySQL.

Memcached, хоча спрощено, дув Redis з води повністю . Це масштабується набагато краще:

  • для більших значень (потрібна зміна розміру плити, але відпрацьована)
  • для декількох одночасних запитів

Також, на мій погляд, політика вилучення, що зберігається, набагато краще реалізована, що призводить до загального стабільного середнього часу відгуку при обробці більшої кількості даних, ніж кеш.

Деякий бенчмаркінг виявив, що Redis у нашому випадку працює дуже погано. Я вважаю, що це стосується багатьох змінних:

  • тип апаратного забезпечення, на якому ви запускаєте Redis
  • типи даних, які ви зберігаєте
  • кількість отримань та наборів
  • наскільки сумісний ваш додаток
  • чи потрібно зберігання структури даних

Особисто я не поділяю точку зору авторів Redis на паралельність та багатопоточність.


поясніть, будь ласка, "мінімально повільніше, ніж MySQL."
Анірудха Гупта

Треба сказати, що я не маю цих даних орієнтиру, але конкретний випадок був дуже багато для читання / запису операцій
mdomans

13

Ще один бонус полягає в тому, що може бути дуже зрозуміло, як керуватиме memcache в сценарії кешування, в той час як redis зазвичай використовується як стійка сховище даних, хоча він може бути налаштований так, щоб він поводився так, як запам’ятовуваний ака-но вимкнення найменш нещодавно використаних елементів, коли він досягає макс. ємність.

Деякі програми, над якими я працював, використовуються як для того, щоб зрозуміти, як ми маємо намір поводитись дані - вміщуємо в пам’ять, ми пишемо код для обробки випадків, коли його немає - речі в redis, ми розраховуємо на те, що він є там .

Крім того, Redis, як правило, вважається вищим, оскільки більшість випадків використання більш багаті на функції та, таким чином, гнучкі.


10

Не було б помилково, якщо сказати, що redis - це комбінація (кеш + структура даних), а memcached - це лише кеш.


1
це хороша відповідь - Laravel використовує redis як кеш і як механізм зберігання даних
Мирослав Трнініч

8

Дуже простий тест, щоб встановити та отримати 100k унікальних ключів та значень проти redis-2.2.2 та запам’ятовується. Обидва вони працюють на Linux VM (CentOS), а мій клієнтський код (вставлений нижче) працює на робочому столі Windows.

Редіс

  • Час, необхідний для зберігання 100000 значень, = 18954 мс

  • Час, необхідний для завантаження 100000 значень, = 18328 мс

Спогад

  • Час, необхідний для зберігання 100000 значень, = 797 мс

  • Час, необхідний для отримання 100000 значень, = 38984 мс


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

6
Оскільки ви, очевидно, використовували Java для вимірювання .... ви "розігрівали" свої тестові випадки? Це дуже важливо для вимірювання такого короткого часу ... щоб СТІ склав "гарячі точки".
cljk

7

Однією з головних відмінностей, на яку тут не було вказано, є те, що Memcache має верхню межу пам’яті постійно, тоді як Redis не за замовчуванням (але може бути налаштовано на). Якщо ви завжди хочете зберігати ключ / значення протягом певного часу (і ніколи не вилучати його через недостатню пам'ять), ви хочете піти з Redis. Звичайно, ви також ризикуєте вичерпати пам'ять ...


6

Найбільша причина, що залишилася - спеціалізація.

Redis може робити багато різних речей, і один з побічних ефектів цього розробники можуть почати використовувати безліч цих різних наборів функцій в одному і тому ж екземплярі. Якщо ви використовуєте функцію LRU Redis для кешу поруч із жорстким сховищем даних, який НЕ є LRU, цілком можливо втратити пам'ять.

Якщо ви збираєтеся встановити виділений екземпляр Redis, який буде використовуватися ТІЛЬКИ як екземпляр LRU, щоб уникнути цього конкретного сценарію, то насправді немає переконливих причин використовувати Redis над Memcached.

Якщо вам потрібен надійний кеш-пам'ять LRU "ніколи не знижується" ... Memcached відповідатиме законопроекту, оскільки це неможливо, щоб у нього не вистачало пам'яті по дизайну, а спеціалізована функціональність не дозволяє розробникам намагатися зробити це так, що може загрожувати цьому. Просте розділення проблем.


6

Спогад буде швидшим, якщо ви зацікавлені в продуктивності, навіть навіть тому, що Redis передбачає мережу (виклики TCP). Також внутрішньо Memcache швидше.

Redis має більше можливостей, як це було зазначено в інших відповідях.


6

Ми розглядали Redis як зліт навантаження для нашого проекту на роботі. Ми думали, що, використовуючи модуль у nginxдзвонив HttpRedis2Moduleчи щось подібне, ми мали б приголомшливу швидкість, але під час тестування з тестом AB ми виявились неправильними.

Можливо, модуль був поганий або наш макет, але це було дуже простою задачею, і було ще швидше взяти дані з php, а потім вкласти їх у MongoDB. Ми використовуємо APC в якості системи кешування, а також із цим php та MongoDB. Це було набагато швидше, ніж nginxмодуль Redis.

Моя порада - перевірити це самостійно, адже це покаже вам результати для вашого оточення. Ми вирішили, що використовувати Redis в нашому проекті не потрібно, оскільки це не має сенсу.


Цікава відповідь, але не впевнений, чи допоможе це ОП
Скотт Шультесс

Вставлення до Redis та використання його як кешу проходило повільніше, ніж використання APC + PHP + MongoDB. Але просто вставка в Redis була набагато повільнішою, ніж вставлення безпосередньо в MongoDB. Без APC я думаю, що вони досить рівні.
Ms01

2
Це тому, що монго не дає вам жодної гарантії, що те, що ви вставили, коли-небудь буде записано на диск ...
Даміан

21
але це веб-масштаби, mongodb буде бігати навколо вас по колах, поки ви пишете. Сьогодні я пишу лише в / dev / null, оскільки це найшвидше.
Ms01

1

Редіс краще.

Плюси Redisє,

  1. У ньому багато варіантів зберігання даних, таких як рядок, набори, відсортовані набори, хеші, растрові карти
  2. Накопичуваність диска записів
  3. LUAПідтримка збереженої процедури ( сценаріїв)
  4. Може виступати в ролі посередника повідомлень за допомогою PUB / SUB

Тоді Memcacheяк система кеш-значень типу кеш-значень ключа пам'яті.

  1. Немає підтримки для різних сховищ даних, таких як списки, набори, як у редакції.
  2. Основна проблема - Memcache не має збереження диска.

0

Ну, я здебільшого використовував як мої програми, Memcache для кешування сеансів, так і редагування для об'єктів запитів доктрини / орми. За рівнем продуктивності обидва майже однакові.


0

Ось справді чудова стаття / відмінності, надані Amazon

Redis - це чіткий переможець порівняно з печеристими.

Лише один плюс для Memcached Це багатопотокове та швидке. Redis має безліч чудових функцій і дуже швидкий, але обмежений одним ядром.

Чудові моменти про Redis, які не підтримуються в Memcached

  • Знімки - Користувач може зробити знімок кешу Redis та зберігатись у вторинному сховищі в будь-який час.
  • Вбудована підтримка багатьох структур даних, таких як Set, Map, SortedSet, List, BitMaps тощо.
  • Підтримка сценаріїв Lua в Redis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.