Я видел несколько крупных рельсовых сайтов, в которых используются как 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, а другой для постоянного хранения? Я не видел, чтобы это использовалось, но я предполагаю, что это выполнимо.
Для всех, кто рассматривает это: есть плагин [redis-store] (https://github.com/jodosha/redis-store) для рельсов, который позволяет использовать redis в качестве хранилища кэш-памяти. – markquezada