Кеширование на основе ключей - PullRequest
1 голос
/ 07 марта 2012

Я читаю эту статью:

http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works

Я не использую рельсы, поэтому я не очень понимаю их пример.

В нем говорится# 3:

Когда ключ изменяется, вы просто записываете новое содержимое в этот новый ключ.Поэтому, если вы обновляете задачу, ключ меняется с todos / 5-20110218104500 на todos / 5-20110218105545, и, таким образом, новое содержимое записывается на основе обновленного объекта.

Как представление узнаетчитать из нового todos / 5-20110218105545 вместо старого?

1 Ответ

2 голосов
/ 19 апреля 2012

Вначале я тоже был озадачен - как это сохранить поездку в базу данных, если вам все равно нужно читать из базы данных, чтобы проверить, действителен ли кэш? Однако см. Комментарии Джесси ( 1 , 2 ) от 12 февраля:

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

Я что-то упустил?

, а затем

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

И Комментарий Пола Лидера 2 ниже:

Бинго. Вот почему так хорошо работает. Если вы все сделаете правильно, это не просто избавит вас от необходимости генерировать HTML, но и от необходимости попадать в БД. С этой системой кеширования наше приложение для обработки данных практически мгновенно, оно действительно применимо, а код гораздо приятнее.

Итак, учитывая модели, которые DHH перечисляет на шаге 5 статьи, и представления, которые он перечисляет на шаге 6, и учитывая, что вы правильно настроили свои отношения на touch родительские объекты при обновлении, и учитывая, что ваши частичные обращайтесь к вашим дочерним данным как parent.children или даже child.children во вложенных партиалах, тогда эта система кэширования должна иметь чистый выигрыш, поскольку, пока ключ кеша родителя остается в силе, поиск parent.children никогда не произойдет и будет также вытащить из кеша и т.п.

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

Или, по крайней мере, это мое понимание того, как это работает. НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...