Больше подробностей о том, как используется кэш Redis?

Привет!

Я проводил тесты нагрузки на экземпляре Discourse и заметил, что при многократном повторном запросе одного и того же потока комментариев процент попаданий в кэш Redis падал, а не рос, что было несколько неожиданно (для смеси операций чтения/записи мы наблюдали процент попаданий в кэш до 85%, а для 10% операций чтения он падал до 22%).

Я поискал в базе кода и на форумах здесь, но точный механизм использования кэша Redis остался для меня неясным. В файле README сказано:

Мы используем Redis в качестве кэша и для временных данных.

Я использовал redis-cli, чтобы выгрузить команды, отправленные в кэш Redis во время упомянутого теста нагрузки, и в основном видел команды «get» для запланированных задач и для ключей с префиксом «__mb_backlog_id_n_» (я полагаю, это относится к компонентам MessageBus).

У меня есть следующие вопросы:

  • Есть ли «простой» способ найти в базе кода, какие именно данные кэшируются в Redis? Я бы хотел самостоятельно ответить на эти вопросы, но, к сожалению, я не очень хорошо знаком с приложениями Ruby on Rails (да и с Ruby в целом, если честно). :slight_smile:
  • Влияет ли вход в систему/выход из системы на процент попаданий в кэш? Для справки: в вышеупомянутом тесте нагрузки использовался ключ API администратора.
  • Кэшируются ли в Redis часто запрашиваемые или относительно статичные данные, такие как содержимое постов? Или Redis используется в основном для планирования задач и фоновой обработки с помощью Sidekiq и подобных инструментов?

Заранее спасибо!

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

Есть несколько методов, которые можно найти через grep, например Discourse.cache.fetch и DistributedCache.new.

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

Redis активно используется для Sidekiq и MessageBus.

Круто, спасибо за такой полезный ответ!

Я только что повторно запустил тестирование нагрузки, но на этот раз с анонимными запросами, и мы увидели огромный прирост производительности! Ранее на одном хосте мы могли обрабатывать лишь около 25 запросов в секунду, а теперь — 380! Показатель попаданий в кэш Redis также вырос с ~22% до ~66%. :slight_smile:

Решил поделиться результатами, на случай если кому-то было интересно.

Ещё раз спасибо за помощь!