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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Я видел несколько сайтов с большими рельсами, которые используют как memcached, так и redis. Memcached используется для emphemeral вещей, которые приятно хранить в памяти, но может быть потеряно/регенерировано, если необходимо, и повторно использовать для постоянного хранения. Оба используются для снятия нагрузки с основного db для тяжелых операций чтения/записи.

Подробнее:

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

redis: вы используете это для данных, которые вы не хотите потерять, и достаточно малы, чтобы вписаться в память. Обычно это задания resque/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, а другой для постоянного хранения? Я не видел, чтобы это использовалось, но я предполагаю, что это выполнимо.

Ответ 5

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

Ответ 6

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