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, а другой для постоянного хранения? Я не видел, чтобы это использовалось, но я предполагаю, что это выполнимо.
Ответ 4
Я хотел бы проверить свой ответ на эту тему:
Рельсы и кеширование, легко ли переключаться между memcache и redis?
По существу, по моему опыту, я бы защищал их для их разделения: memcached для кеширования и redis для структур данных и более стойкого хранения
Ответ 5
Я спросил команду в Redis Labs (которые предоставляют облако Memcached и Redis Cloud) о том, какой продукт они рекомендуют для кеширования Rails. Они сказали, что в целом они рекомендуют Redis Cloud, что Memcached Cloud в основном предлагается для устаревших целей и указывает, что их сервис Memcached Cloud фактически построен поверх Redis Cloud.
Ответ 6
Я не знаю, для чего вы их используете, но на самом деле использование обоих может дать вам преимущество в производительности: у Memcached намного лучшая производительность, работающая на нескольких ядрах, чем у Redis, поэтому кэширование наиболее важных данных с помощью Memcached и сохранение отдых в Redis, использование его возможностей в качестве базы данных, может повысить производительность.