#ruby-on-rails #database #performance #caching #optimization
#ruby-on-rails #База данных #Производительность #кэширование #оптимизация
Вопрос:
Я разрабатываю приложение на Rails, в котором у меня есть таблица, содержащая статические данные, которые в основном будут доступны только для чтения и будут обновляться очень, очень редко.
Но один и тот же запрос к таблице будет выполняться несколько раз (запрос не связан с какой-либо другой таблицей).
Чтобы избежать повторения этой работы, целесообразно ли реализовать какой-либо механизм кэширования с помощью кода??
Если да, то какой метод наилучший для реализации этого?
Я планирую создать ГЛОБАЛЬНУЮ хэш-переменную с первичным ключом в качестве хэш-ключа и значением в качестве результата запроса.
-
Есть ли какие-либо недостатки этого метода???
-
Одна вещь, которую я вижу, заключается в том, что при обновлении таблицы сервер необходимо перезапустить.
-
Есть ли более приятный способ сделать это?
Спасибо
Ответ №1:
-
Да, вы переделываете что-то, что существует и работает идеально.
-
Ну, не понимаю, почему вы так думаете
-
Конечно, да:
Ваш выбор более или менее:
-
встроенный:
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 %>