Redis і Memcache чи просто Redis?


85

Я використовую memcached для кешування в моєму додатку Rails 3 за допомогою простого Rails.cacheінтерфейсу, і тепер я хотів би виконати фонову обробку роботи за допомогою redis та resque.

Я думаю, що вони досить різні, щоб гарантувати використання обох. Однак на героку існують окремі збори за використання як memcached, так і redis. Чи є сенс використовувати і те, і інше, чи я повинен перейти на просто використання redis?

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

РЕДАГУВАТИ: Я просто хотів прояснити своє питання. Я знаю, що можна використовувати лише Redis замість обох. Я думаю, я просто хочу знати, чи є якісь конкретні недоліки при цьому? Беручи до уваги як реалізацію, так і інфраструктуру, чи є причини, чому я не повинен просто використовувати Redis? (Тобто, memcached швидше для простого кешування?) Я не знайшов нічого остаточного в будь-якому випадку.


5
Для тих, хто розглядає це: Існує плагін redis-store для рейок, який дозволяє використовувати redis як кеш-пам’ять.
markquezada

Відповіді:


49

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

У redis наполегливість не є обов’язковою, тому ви можете використовувати її подібно memcached, якщо це те, що ви хочете. Можливо, ви навіть виявите, що робити кеш постійним є корисним, щоб уникнути багатьох помилок кешу після перезапуску. Також доступний термін дії - алгоритм дещо відрізняється від запам'ятовуваного, але недостатній, щоб мати значення для більшості цілей - див. Http://redis.io/commands/expire для деталей.


1
Дякую за відповідь та відповідні документи. Я трохи відредагував своє запитання, щоб чіткіше зрозуміти, що я шукаю. Я не думав про збереження кешу після перезапуску ... це приємна особливість. (Хоча я не впевнений, наскільки корисно це враховуючи, що я буду використовувати redis, щоб піти з heroku.)
markquezada

1
Якщо ви хочете зберегти деякі елементи швидкоплинними (кешування фрагментів), а деякі елементи зберігаються в redis, вам потрібно створити два окремі екземпляри redis?
Brian Armstrong

1
Хоча ми використовуємо Redis як для черг робочих місць, так і для кеш-пам’яті, ми запускаємо їх із різними конфігураціями з конкретних причин, які зазначає @BrianArmstrong. Кеш є ефемерним, тому ми налаштовуємо його швидко, але нормально втратити речі в пам'яті та скинути LRU. Що стосується черги, ми дійсно не хочемо втрачати роботу, тому ми налаштовуємо її наполегливо, щоб її можна було відновити.
jwadsack 02

@jwadsack у вас є публікація, де ви показуєте, як ви реалізували цю конфігурацію?
Marklar

1
@Marklar Хороша ідея. Я роблю зараз: ballardhack.wordpress.com/2015/09/30/…
jwadsack

44

Я автор redis-store , немає необхідності використовувати безпосередньо команди Redis, просто скористайтеся такою :expires_inопцією:

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

Перевагою використання Redis є стійкість, а з моїм самоцвітом є те, що у вас вже є магазини для Rack::Cache,Rails.cache або I18n.


Дякую за відповідь Лука. Я припускаю, що ви можете замінити: expires_in безпосередньо, коли вам потрібно постійно щось зберігати? Думаю, питання насправді полягає у використанні як функціональних можливостей типу memcached, так і у використанні redis як постійного сховища поряд.
markquezada

3
Я не думаю, що має сенс мати поряд і memcached, і redis, оскільки вони знаходяться в одному сегменті NoSQL: обидва є ak / v store. Redis PROS: 1. швидше, ніж memcached 2. більш потужні команди 3. не потрібна розминка кешу 4. корисно для вирішення інших проблем (наприклад, черги з Resque) ПРОТИВИ: 1. вам потрібен зовнішній камінь 2. після перезапуску сервер не приймає команд під час зчитування даних із файлу додавання Memcached PROS: запечений у Rails CONS: 1. повільніше, ніж Redis 2. Розминка кешу.
Luca Guidi

3
@LucaGuidi В даний час я використовую RedisStore для свого кешу Rails. Я не можу зрозуміти, як встановити як URL-адресу Redis, так і стандартну :expires_in. Ви можете допомогти?
Кріс Вінсент

Як і я, якщо ви зіткнулися настройки випуску з :expires_inвикористанням redis_store см stackoverflow.com/questions/20907247 / ...
Anirudhan J

19

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

Детальніше:

Запам'ятовується: використовується для кешування сторінок / фрагментів / відповідей, і нормально встановити обмеження пам’яті на Memcached, оскільки це LRU (принаймні нещодавно використовуваний) закінчує термін дії старих матеріалів і часто зберігає доступні клавіші гарячими в пам’яті. Важливо, щоб у БД можна було відтворити що-небудь у Memcached (це не єдина ваша копія). Але ви можете продовжувати скидати речі, і Memcached визначить, які найчастіше використовуються, і збереже їх у пам'яті. Вам не потрібно турбуватися про те, щоб видалити речі з Memcached.

redis: ви використовуєте це для даних, які ви не хотіли б втратити, і вони досить малі, щоб поміститися в пам’яті. Зазвичай це включає завдання reque / sidekiq, лічильники обмеження швидкості, результати розділених тестів або все, що ви не хотіли б втратити / відтворити. Ви не хочете перевищувати обмеження пам’яті тут, тому вам слід бути трохи обережнішими щодо того, що ви зберігаєте та прибираєте пізніше.

Redis починає страждати від продуктивності, коли він перевищує ліміт пам'яті (виправте мене, якщо помиляюся). Це можна вирішити, налаштувавши Redis, щоб він діяв як Memcached і LRU закінчується, тому він ніколи не досягає межі пам'яті. Але ви не хотіли б робити це з усім, що ви тримаєте в Redis, як відновлювані роботи. Отже, замість того, щоб люди часто зберігали за замовчуванням, Rails.cache встановив використовувати Memcached (використовуючи dalliсамоцвіт). А потім вони зберігають окрему глобальну змінну $ redis = ... для виконання операцій redis.

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

Це може бути простий спосіб зробити все в Redis - можливо, маючи два окремі екземпляри Redis, один із обмеженим обсягом пам'яті LRU, подібний до Memcache, а інший для постійного зберігання? Я не бачив, щоб це використовувалося, але я думаю, це було б здійсненно.


15

Я хотів би перевірити свою відповідь на цю тему:

Rails та кешування, чи легко перемикатися між memcache та redis?

По суті, завдяки своєму досвіду, я б виступав за те, щоб тримати їх окремо: memcached для кешування та redis для структур даних та більш стійке зберігання


Хоча спочатку я планував закріпити їх на основі оригінальної відповіді на моє запитання, з тих пір я дійшов фактично до того самого висновку. Я використовую memcache для базового кешування та redis для відновлення.
markquezada

6

Я запитав команду в Redis Labs (яка надає доповнення Memcached Cloud та Redis Cloud ) про те, який продукт вони рекомендують для кешування Rails. Вони сказали, що загалом рекомендують Redis Cloud, що Memcached Cloud пропонується в основному для застарілих цілей, і зазначили, що їх послуга Memcached Cloud насправді побудована на вершині Redis Cloud.


Тож немає потреби як в memcached, так і в redis, як зазначено у відповіді Брайана? "люди часто зберігають за замовчуванням Rails.cache, встановлений для використання memcached (за допомогою самоцвіту dalli). А потім вони зберігають окрему глобальну змінну $ redis = ... для виконання операцій redis."
Marklar

4

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


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

Багатопроцесорний підхід redis масштабується краще в багатоядерних системах, ніж (за замовчуванням) підхід memcached з багатопотоковістю: antirez.com/post/update-on-memcached-redis-benchmark.html
Людгер Шпренкер,

3
Цей головний недолік Redis справді дуже применшений. Якщо ви шукаєте високу одночасність і маєте багато ядер, Memcached може керувати колами навколо Redis. Шардінг не є хорошим рішенням, оскільки вам доводиться застосовувати послідовне хешування у своєму додатку, і ви не отримаєте ідеального розподілу між екземплярами Redis. Наприклад, якщо shard A кешує конфігурацію вашої програми, яка використовується у кожному запиті, shard A отримає більше запитів, ніж інші осколки, які не вражаються для кожного запиту.
ColinM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.