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