Сомнения в повышении производительности приложения Rails

#ruby-on-rails #database #performance #caching #optimization

#ruby-on-rails #База данных #Производительность #кэширование #оптимизация

Вопрос:

Я разрабатываю приложение на Rails, в котором у меня есть таблица, содержащая статические данные, которые в основном будут доступны только для чтения и будут обновляться очень, очень редко.

Но один и тот же запрос к таблице будет выполняться несколько раз (запрос не связан с какой-либо другой таблицей).

Чтобы избежать повторения этой работы, целесообразно ли реализовать какой-либо механизм кэширования с помощью кода??

Если да, то какой метод наилучший для реализации этого?

Я планирую создать ГЛОБАЛЬНУЮ хэш-переменную с первичным ключом в качестве хэш-ключа и значением в качестве результата запроса.

  1. Есть ли какие-либо недостатки этого метода???

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

  3. Есть ли более приятный способ сделать это?

Спасибо

Ответ №1:

  1. Да, вы переделываете что-то, что существует и работает идеально.

  2. Ну, не понимаю, почему вы так думаете

  3. Конечно, да:

Ваш выбор более или менее:

  • встроенный: memory store

  • требуется некоторая настройка: memcached

  • альтернативное хранилище ключей / значений: redis http://redis.io /

Взгляните сюда: http://railslab.newrelic.com/scaling-rails

Комментарии:

1. Это Memcached!!! Я слышал об этом так много раз, но на самом деле не прилагал усилий, чтобы узнать, что это такое : (. Спасибо за ваше обновление. Также спасибо за редактирование моего оригинального поста. Теперь все выглядит намного понятнее. В следующий раз все будет именно так.

Ответ №2:

Вы могли бы использовать Rails.cache — когда вам нужно обновить кеш, просто истекает срок действия ключей?

Ответ №3:

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

Единственное, чего не касается руководство, довольно очевидно, что вам нужно использовать фрагмент с глобальным ключом и включить идентификатор вашей записи в строку ключа. Нравится: <% cache( "foo_stuff_#{@foo.id}" ) do %>