Redis и Memcache или просто Redis? - PullRequest
84 голосов
/ 15 ноября 2010

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

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

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

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

Ответы [ 6 ]

49 голосов
/ 16 ноября 2010

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

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

44 голосов
/ 04 октября 2011

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

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

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

19 голосов
/ 21 сентября 2012

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

Подробнее:

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

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

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

15 голосов
/ 03 декабря 2010

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

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

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

6 голосов
/ 15 февраля 2014

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

4 голосов
/ 16 ноября 2010

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

...