Почему: memory_store cache быстрее, чем: dalli_store для memcached? Должен ли я просто придерживаться: memory_store?

Просто начните вводить кеширование в новое приложение Rails. Сначала мы установили cache_store для использования :memory_store в application.rb

config.cache_store = :memory_store

Затем я провел некоторые тесты производительности через NewRelic, чтобы увидеть производительность до/после кэширования модели.

После этого я переключил cache_store на использование: dalli_store, так как в настоящее время рекомендуется использовать gem для использования memcached с Rails.

config.cache_store = :dalli_store

Затем я повторю то же самое до/после тестов кеширования с memcached. Все еще было очевидное улучшение между кэшированным или не кэшированным запросом/ответом; однако производительность кэширования memcached в два раза медленнее (примерно) в качестве стандартного Rails: memory_store.

Просто для выяснения, во время этих тестов я запустил сервер memcached локально в веб-приложении rails, чтобы избежать добавления проблем с задержкой в ​​сети.

Все это приводит меня к следующим реальным вопросам.

  • Является ли типичным, чтобы увидеть более высокую производительность от :memory_store более :dalli_store?

  • Если это не типично, есть ли какие-то "трюки", которые я не знаю помимо стандартной настройки, необходимой для получения надлежащей производительности от memcached?

  • Если это типично, то почему люди, использующие memcached и: dalli_store на Rails, в первую очередь? Это вопрос масштабируемости и т.д.?

Ответ 1

Из руководства по кэшированию рельсов относительно memory_store:

В этом хранилище кешей хранятся записи в памяти в том же процессе Ruby.

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

Однако вы не можете хранить слишком много информации, как до того, как она станет громоздкой. Процессы для вашего сервера будут расти, и ваш кеш будет очень быстро избавляться от самой старой кешированной информации (размер по умолчанию этого кеша - 32 МБ).

Кроме того, при выполнении нескольких процессов, как и для производственного сервера, вы будете дублировать кешированную информацию в каждом процессе. Например, если ваша домашняя страница кэширована, вам нужно будет кэшировать ее для каждого из процессов, которые выполняются на сервере.

У вас также будут проблемы с истечением срока действия вручную из кеша, который находится внутри серверных процессов, потому что вам необходимо либо взаимодействовать со всеми запущенными процессами, чтобы истечь кешированную информацию, либо получить их, чтобы проверить, не является ли эта информация устаревшей до доступа он.

Используя что-то вроде memcached или redis, вы можете иметь все процессы вашего сервера, обращаясь к одному и тому же кешу, и у вас может быть гораздо больший кеш, который означает, что кешированная информация становится устаревшей намного реже. Вы можете написать один раз в кэш, и все процессы сервера будут полезны, и вы можете очистить один раз, и все процессы узнают, что он очищен.

Как вы уже определили, компромисс - это производительность записи и чтения из кеша, но в системе любого размера, которую компромисс производительности не стоит, по сравнению с более сложным кэшированием магазин.