Redis и memcache или Redis для всего?

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

Я думаю, что они достаточно различны, чтобы оправдать использование обоих. На heroku, однако, есть отдельные сборы за использование как memcached, так и redis. Имеет ли смысл использовать оба или я должен мигрировать только с помощью redis?

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

EDIT: просто хотел быть более ясным с моим вопросом. Я знаю, что можно использовать только Redis вместо обоих. Думаю, я просто хочу знать, есть ли какие-то конкретные недостатки в этом? С учетом реализации и инфраструктуры, есть ли причины, почему я не должен использовать Redis? (То есть, memcached быстрее для простого кэширования? В любом случае, я не нашел ничего определенного.

6 ответов


предполагая, что миграция из memcached в redis для кэширования, которое вы уже делаете, достаточно проста, я бы пошел с redis только для того, чтобы все было просто.

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


Я автор книги redis-store, нет необходимости использовать непосредственно команды Redis, просто используйте такой:

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

преимущество использования Redis-это быстрота, а с моим камнем-то, что у вас уже есть магазины для Rack::Cache, Rails.cache или I18n.


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

Подробнее:

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

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

Redis начинает страдать проблемы с производительностью, как только он превышает лимит памяти (поправьте меня, если я ошибаюсь). Это можно решить, настроив Redis, чтобы действовать как Memcached и LRU истекают, поэтому он никогда не достигает предела памяти. Но вы не хотели бы делать это со всем, что вы держите в Redis, например, resque jobs. Поэтому вместо людей часто держат дефолт, рельсы.кэш, установленный для использования Memcached (используя dalli gem). И тогда они сохраняют отдельный $ 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, и другое для постоянного хранения? Я не видел, чтобы это использовалось, но я предполагаю, что это было бы выполнимо.


Я бы хотел проверить свой ответ на эту тему:

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

по сути, благодаря моему опыту, я бы выступил за их разделение: memcached для кэширования и redis для структур данных и более устойчивого хранения


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


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