Я видел несколько крупных рельсовых сайтов, которые используют как 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.
config.cache_store = :dalli_store
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])
Может быть, есть простой способ сделать все это в Redis - возможно, имея два отдельных экземпляра Redis, один с жестким пределом памяти LRU, похожий на Memcache, а другой для постоянного хранилища? Я не видел, чтобы это использовалось, но предполагаю, что это выполнимо.