2010-11-15 8 views
79

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

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

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

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

+5

Для всех, кто рассматривает это: есть плагин [redis-store] (https://github.com/jodosha/redis-store) для рельсов, который позволяет использовать redis в качестве хранилища кэш-памяти. – markquezada

ответ

47

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

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

+1

Спасибо за ответ и соответствующие документы. Я немного изменил свой вопрос, чтобы сделать его более ясным, что я ищу. Я не думал о сохранении кеша после перезагрузки ... это хорошая функция. (Хотя я не уверен, насколько полезно учитывать, что я буду использовать redis для игры с герокой.) – markquezada

+1

Если вы хотите сохранить некоторые элементы эфемерным (кэширование фрагментов) и некоторые элементы, повторяющиеся в redis, вам нужно создать два отдельных экземпляра redis? –

+1

Хотя мы используем Redis для обеих очередей заданий и кеша, мы запускаем их с различными конфигурациями для конкретных причин, которые @BrianArmstrong заявляет. Кэш является эфемерным, поэтому мы настраиваем его с быстрым, но все в порядке, чтобы потерять вещи в памяти и сбросить LRU. Для очереди мы действительно не хотим потерять работу, поэтому мы настраиваем ее с сохранением, чтобы она была восстановлена. – jwadsack

4

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

+1

Это не совсем так - redis использует несколько экземпляров, а не несколько потоков, поэтому сравнение одного экземпляра ядра redis с многоядерным экземпляром memcached не является особенно релевантным тестом. Кроме того, когда доступны тесты, показывающие, что обе системы будут самыми быстрыми, разница вряд ли будет иметь значение в реальном мире. –

+0

Многопроцессорный подход redis лучше масштабируется в многоядерных системах, чем подход (по умолчанию) memcached с многопоточным: http://antirez.com/post/update-on-memcached-redis-benchmark.html –

+3

Этот основной Недостаток Redis действительно преуменьшен. Если вы ищете высокий уровень параллелизма и имеете много ядер, Memcached может запускать круги вокруг Redis. Sharding не является хорошим решением, поскольку вы должны внедрять последовательное хеширование в своем приложении, и вы не получите идеального распространения между экземплярами Redis. Например, если shard A кэширует конфигурацию вашего приложения, которая используется в каждом запросе, shard A получит больше запросов, чем другие осколки, которые не попадают на каждый запрос. – ColinM

15

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

Rails and caching, is it easy to switch between memcache and redis?

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

+0

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

42

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

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

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

+0

Спасибо за ответ Luca. Я предполагаю, что вы можете переопределить: expires_in напрямую, когда вам нужно что-то хранить настойчиво? Я думаю, вопрос в том, что касается использования функций memcached типа * и *, используя redis как постоянное хранилище рядом друг с другом. – markquezada

+1

Да, конечно, вы можете переопределить ': expires_in'. –

+3

Я не думаю, что имеет смысл иметь как memcached, так и redis рядом, поскольку они находятся в одном и том же сегменте NoSQL: оба являются хранилищем k/v. Redis PROS: 1. быстрее, чем memcached 2. более мощные команды 3. нет необходимости в кеш-разминке 4. полезно для решения других проблем (например, очереди с Resque) CONS: 1. вам нужен внешний камень 2. после перезагрузки сервер не принимает команды при чтении данных из файла append. Memcached PROS: запеченный в Rails CONS: 1. медленнее, чем Redis 2. разминка кеша. –

16

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

Подробнее:

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

6

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

+0

Так что нет необходимости как для memcached, так и для redis as упомянутый в ответе Брайана? «люди часто используют установленный по умолчанию Rails.cache для использования memcached (используя драгоценный камень dalli), а затем они сохраняют отдельную глобальную переменную $ redis = ..., чтобы выполнять операции redis». – Marklar

Смежные вопросы