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


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

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

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

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

6 81

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 Гэм). И тогда они держат отдельный $ 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, и другой для постоянного хранения? Я не видел, чтобы это использовалось, но я предполагаю, что это было бы выполнимо.

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

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

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

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

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