Підсумок (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. Це вірно, чи вам потрібно масштабувати межу, чи потрібна додаткова функціональність.