Я использую memcached для некоторого кеширования в моем приложении Rails 3 через простой Rails.cache
интерфейс, и теперь я хотел бы выполнить некоторую фоновую обработку заданий с помощью redis и resque.
Я думаю, что они достаточно разные, чтобы использовать оба. Однако на heroku за использование memcached и redis взимается отдельная плата. Имеет ли смысл использовать оба варианта или мне следует перейти на использование только Redis?
Мне нравится использовать memcached для кеширования, потому что наименее недавно использованные ключи автоматически выталкиваются из кеша, и мне не нужно, чтобы данные кеша сохранялись. Redis для меня в основном новичок, но я понимаю, что по умолчанию он постоянен и ключи не истекают из кеша автоматически.
РЕДАКТИРОВАТЬ: Просто хотел быть более ясным с моим вопросом. Я знаю, что можно использовать только Redis вместо обоих. Думаю, я просто хочу знать, есть ли в этом какие-то особые недостатки? Учитывая как реализацию, так и инфраструктуру, есть ли причины, по которым мне не следует просто использовать Redis? (То есть, memcached быстрее для простого кеширования?) Я не нашел ничего окончательного в любом случае.
источник
Ответы:
Предполагая, что переход с memcached на redis для кэширования, который вы уже выполняете, достаточно прост, я бы выбрал redis только для упрощения.
В Redis постоянство не является обязательным, поэтому вы можете использовать его так же, как memcached, если вы этого хотите. Вы даже можете обнаружить, что постоянный кеш-память полезен, чтобы избежать большого количества промахов кеша после перезапуска. Также доступен срок действия - алгоритм немного отличается от memcached, но недостаточен для большинства целей - подробности см. На http://redis.io/commands/expire .
источник
Я автор redis-store , нет необходимости напрямую использовать команды Redis, просто используйте такую
:expires_in
опцию:ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes
Преимущество использования Redis - это скорость, а с моей жемчужиной - то, что у вас уже есть магазины для
Rack::Cache
,Rails.cache
илиI18n
.источник
:expires_in
. Вы можете помочь?:expires_in
с помощью redis_store, обратитесь к stackoverflow.com/questions/20907247/…Я видел несколько крупных рельсовых сайтов, которые используют как 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, а другой для постоянного хранилища? Я не видел, чтобы это использовалось, но предполагаю, что это выполнимо.
источник
Я бы подумал о том, чтобы проверить свой ответ по этому поводу:
Rails и кеширование, легко ли переключаться между memcache и redis?
По сути, исходя из своего опыта, я бы рекомендовал хранить их отдельно: memcached для кеширования и redis для структур данных и более постоянного хранилища.
источник
Я спросил команду Redis Labs (которая предоставляет надстройки Memcached Cloud и Redis Cloud ) о том, какой продукт они бы порекомендовали для кэширования Rails. Они сказали, что в целом будут рекомендовать Redis Cloud, что Memcached Cloud в основном предлагается для устаревших целей, и указали, что их сервис Memcached Cloud фактически построен на базе Redis Cloud.
источник
Я не знаю, для чего вы их используете, но на самом деле использование обоих может дать вам преимущество в производительности: Memcached имеет гораздо лучшую производительность, работающую на нескольких ядрах, чем Redis, поэтому кэширование наиболее важных данных с помощью Memcached и сохранение остальных в Redis , используя его возможности в качестве базы данных, может повысить производительность.
источник