Redis и Memcache или просто Redis?

85

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

Я думаю, что они достаточно разные, чтобы использовать оба. Однако на heroku за использование memcached и redis взимается отдельная плата. Имеет ли смысл использовать оба варианта или мне следует перейти на использование только Redis?

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

РЕДАКТИРОВАТЬ: Просто хотел быть более ясным с моим вопросом. Я знаю, что можно использовать только Redis вместо обоих. Думаю, я просто хочу знать, есть ли в этом какие-то особые недостатки? Учитывая как реализацию, так и инфраструктуру, есть ли причины, по которым мне не следует просто использовать Redis? (То есть, memcached быстрее для простого кеширования?) Я не нашел ничего окончательного в любом случае.

Markquezada
источник
5
Для всех, кто об этом думает: есть плагин redis-store для rails, который позволяет использовать redis в качестве хранилища кешей.
markquezada

Ответы:

49

Предполагая, что переход с memcached на redis для кэширования, который вы уже выполняете, достаточно прост, я бы выбрал redis только для упрощения.

В Redis постоянство не является обязательным, поэтому вы можете использовать его так же, как memcached, если вы этого хотите. Вы даже можете обнаружить, что постоянный кеш-память полезен, чтобы избежать большого количества промахов кеша после перезапуска. Также доступен срок действия - алгоритм немного отличается от memcached, но недостаточен для большинства целей - подробности см. На http://redis.io/commands/expire .

Том Кларксон
источник
1
Спасибо за ответ и соответствующие документы. Я немного отредактировал свой вопрос, чтобы было понятнее, что я ищу. Я не думал о сохранении кеша после перезапуска ... это хорошая особенность. (Хотя я не уверен, насколько это полезно, учитывая, что я бы использовал redis для работы с heroku.)
markquezada
1
Если вы хотите, чтобы некоторые элементы были эфемерными (кэширование фрагментов), а некоторые элементы были постоянными в Redis, нужно ли вам создавать два отдельных экземпляра Redis?
Брайан Армстронг
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. Достоинства Redis: 1. быстрее, чем memcached 2. более мощные команды 3. не требуется разогрев кеша 4. полезно для решения других проблем (например, очереди с Resque). МИНУСЫ: 1. вам нужен внешний гем 2. после перезапуска сервер не принимает команды при чтении данных из файла присоединения. Memcached. Достоинства: запечено в Rails. МИНУСЫ: 1. медленнее, чем Redis.
Лука Гуиди,
3
@LucaGuidi В настоящее время я использую RedisStore для своего кеша Rails. Я не могу понять, как установить URL-адрес Redis и значение по умолчанию :expires_in. Вы можете помочь?
Крис Винсент
Как и я, если вы столкнулись с проблемой настройки :expires_inс помощью redis_store, обратитесь к stackoverflow.com/questions/20907247/…
Anirudhan J
19

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

Подробнее:

Memcached: используется для кэширования страниц / фрагментов / ответов, и это нормально, чтобы достичь предела памяти в Memcached, потому что он будет LRU (наименее недавно использовавшимся), чтобы истечь старый материал, и часто сохраняет горячие клавиши в памяти. Важно, чтобы все, что есть в Memcached, при необходимости можно было воссоздать из БД (это не единственная ваша копия). Но вы можете продолжать сбрасывать в него что-то, и Memcached определит, какие из них используются наиболее часто, и сохранит их в памяти. Вам не нужно беспокоиться об удалении чего-либо из Memcached.

redis: вы используете это для данных, которые не хотите терять, и достаточно малы, чтобы поместиться в памяти. Обычно это включает задания resque / sidekiq, счетчики для ограничения скорости, результаты сплит-тестов или все, что вы не хотите терять / воссоздавать. Вы не хотите превышать здесь лимит памяти, поэтому вам нужно быть немного более осторожным с тем, что вы сохраняете и очищаете позже.

Redis начинает испытывать проблемы с производительностью, как только он превышает предел памяти (поправьте меня, если я ошибаюсь). Это можно решить, настроив Redis так, чтобы он действовал как Memcached и LRU expire, поэтому он никогда не достигает своего предела памяти. Но вы не захотите делать это со всем, что хранится в 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 для структур данных и более постоянного хранилища.

Efalcao
источник
Хотя я изначально планировал объединить их на основе первоначального ответа на мой вопрос, с тех пор я пришел в основном к такому же выводу. Я использую memcache для базового кеширования и redis для восстановления.
markquezada 03
6

Я спросил команду Redis Labs (которая предоставляет надстройки Memcached Cloud и Redis Cloud ) о том, какой продукт они бы порекомендовали для кэширования Rails. Они сказали, что в целом будут рекомендовать Redis Cloud, что Memcached Cloud в основном предлагается для устаревших целей, и указали, что их сервис Memcached Cloud фактически построен на базе Redis Cloud.

Ярин
источник
Итак, нет необходимости в memcached и redis, как упоминалось в ответе Брайана? «люди часто оставляют Rails.cache по умолчанию для использования memcached (используя dalli gem). А затем они сохраняют отдельную глобальную переменную $ 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. Например, если шард A кэширует конфигурацию вашего приложения, которая используется в каждом запросе, шард A получит больше запросов, чем другие шарды, которые не выполняются для каждого запроса.
ColinM