Якщо redis вже є частиною стека, чому Memcached все ще використовується поряд з Redis?


85

Redis може робити все, що надає Memcached (кеш LRU, термін дії елемента та тепер кластеризація у версії 3.x +, на даний момент у бета-версії) або за допомогою таких інструментів, як twemproxy. Виступ теж подібний. Більше того, Redis додає стійкості, завдяки якій вам не потрібно робити розігрівання кешу у разі перезапуску сервера.

Посилання на деякі старі відповіді, які порівнюють Redis та Memcache, деякі з яких віддають перевагу Redis як заміну Memcache (якщо він вже присутній у стеку):

Незважаючи на це, вивчаючи стеки великих веб-компаній, таких як Instagram, Pinterest, Twitter тощо, я виявив, що вони використовують і Memcached, і Redis для різних цілей, а не Redis для основного кешування. Первинний кеш все ще є Memcached, а Redis використовується для його логічних структур керованих структур даних.

Починаючи з 2014 року, чому memcached все ще варто докласти біль як додатковий компонент у ваш стек, коли у вас вже є компонент Redis, який може робити все, що memcached може? Які сприятливі моменти схиляють архітекторів / інженерів до цього часу включати memcached, крім вже існуючих Redis?

Оновлення:

Для наших платформ ми повністю відкинули Memcached і використовуємо redis як для звичайних, так і для логічних вимог кешування. Високопродуктивний, гнучкий та надійний.

Деякі приклади сценаріїв:

  • Перерахуйте всі кешовані ключі за певним зразком і прочитайте або видаліть їх значення. Дуже легко в реді, не здійсненно (легко) у пам’яті.
  • Зберігання корисного навантаження більше 1 Мб, що легко зробити в redis, вимагає налаштування розміру плити в memcached, що має власні побічні ефекти.
  • Легкі знімки поточного вмісту кешу
  • Кластер Redis також готовий до виробництва разом із мовними драйверами, отже, кластерне розгортання теж є простим.

Відповіді:


122

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

Інші речі, які є корисними щодо memcached:

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

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

Порівняння між Redis LRU та memcached LRU.

І memcached, і Redis не виконують реальних виселень LRU, а лише наближення цього.

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

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

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

Чому memcached має кращий розмір пам'яті, ніж Redis, для простих рядків -> рядкові карти.

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

Коли Redis починає ефективніше використовувати пам’ять

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

Ви можете, власне, зберегти об'єкт у memcached як єдину величину BLOB-коду JSON (або в двійковому кодуванні), але на відміну від Redis, це не дозволить вам отримати або оновити незалежні поля.

Перевага Redis в контексті інтелектуального кешування.

Через структури даних Redis, звичайний шаблон, що використовується з memcached знищення об'єктів, коли кеш недійсний, щоб відтворити його з БД пізніше, є примітивним способом використання Redis.

Наприклад, уявіть, що вам потрібно кешувати останні новини N, розміщені в Hacker News, щоб заповнити розділ "Найновіші" на сайті. Що ви робите з Redis, це складаєте список (обмежений до M елементів) із введеними найновішими новинами. Якщо ви використовуєте інше сховище для своїх даних, а Redis - як кеш, потрібно лише заповнити обидва подання (Redis і БД), коли буде опубліковано новий елемент. Немає можливості скасувати кеш.

Однак програма завжди може мати логіку, так що якщо список Redis виявляється порожнім, наприклад після запуску, початковий вигляд можна створити заново з БД.

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


Дякую творцеві Антірез. Але ** чому розмір пам'яті Redis для простих рядків більше, ніж у memcached? ** Чи є компресія фактором? Або Redis зберігає деякі інші додаткові дані, коли SET використовується для зберігання простого рядка? Було б чудово, якби ви могли включити цю інформацію у відповідь.
DhruvPathak

3
Я намагався покращити відповідь. Дякуємо за відгуки.
антирез

3
Інший аспект вищезгаданого "інтелекту", або використання типів даних Redis та логіки на стороні сервера за допомогою операцій та / або сценаріїв, полягає в тому, що ви економите як на складності додатків, так і на мережі (як обговорював @antirez в antirez. com / news / 73 та Yiftach на redislabs.com/blog/the-proven-redis-performance ).
Ітамар Хабер

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

3
Відмінна відповідь, треба любити, наскільки відданий батько Редіса спільноті.
Ман,

13

Звички важко зламати :)

Однак, якщо серйозно, є дві основні причини, наскільки я розумію, чому Memcached все ще використовується:

  1. Спадщина - там розробники, яким комфортно і добре знайомі Memcached, а також додатки, які його підтримують. Це також означає, що це зріла і добре перевірена технологія.
  2. Масштабування - стандартний Memcached легко масштабується по горизонталі, тоді як Redis (до і за винятком скоро випущеної версії 3) вимагає додаткової роботи з цією метою (тобто шардування).

Однак:

  1. Re. спадщина - враховуючи надійність Redis (структури даних, команди, стійкість ...), вона активно розробляється та клієнти на будь-якій мовній мові - разом із нею зазвичай розробляються нові програми .
  2. Повторне масштабування - крім майбутнього v3, є рішення, які можуть значно спростити масштабування. Наприклад, Redis Cloud пропонує плавне масштабування без втрати даних або переривання роботи. Ще одним популярним підходом до масштабування / шардінгу Redis є twemproxy .

1
Тільки примітка: як це підтвердив поточний супровідник у Twitter, Memcached все ще активно розробляється / підтримується. Думаю, той факт, що він часто не додає нових матеріалів, пов’язаний із зрілістю досягнення проекту та небажанням додавати нові матеріали, тому нові розробки спрямовані на оптимізацію / виправлення.
антирез

1
ТІЛ, що Мемкеш все ще живий і штовхає - відредагував мою відповідь / ty antirez & dormando
Itamar Haber

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

1
RedisLabs відмінний. Це ключова технологія, що стоїть за Userify Cloud.
fatal_error

1
Я також надзвичайно підозрілий щодо будь-якої реалізації, яка не є багатопотоковою та на основі циклу подій. ... Добре, де де всі присутні апологети виступу, я виклав їх вечерю. Тепер redis міг це зробити, і я був би набагато більш проредісом з боку системи. На даний момент, крім випадків, коли група розробників надзвичайно здатна кешувати, memcached - це проста та більш ефективна реалізація .... функції НІКОЛИ не безкоштовні, не дозволяйте апологетам казати вам, що вони є, або що ваші витрати незначні.
Дж. М. Беккер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.