Я работаю над реализацией кэша на уровне представления в приложении MVC.Приложение представляет собой пользовательский php MVC + несколько Zend-библиотек, но я думаю, что этот вопрос применим к любому стеку MVC.
Чего я хотел бы добиться, так это кеша, который делает недействительными партиалы / блоки, но не целые страницы.Представление состоит из макетов, и каждый макет может состоять из блоков / частичных значений, а каждый частичный элемент может снова состоять из частичных частей.Ничего необычного.Многие из партиалов используют одни и те же данные, и если они изменяют данные, все они должны быть аннулированы.Точно так же некоторые партиалы используют данные из разных моделей и должны быть признаны недействительными в случае изменения каких-либо данных.
Чего я хотел бы добиться, так это системы, в которой мне не пришлось бы возвращаться к своей модели для изменениякод всякий раз, когда создается новый фрагмент или макет.Я думал, что было бы здорово, если бы каждый элемент кэша мог как-то быть «помечен», поэтому, когда я нахожусь на уровне данных, я могу просто сделать недействительными все элементы кэша, используя этот тег.Если я затем создаю новый фрагмент, мне просто нужно убедиться, что я помечаю его всеми тегами, которые используются в этом кэшированном блоке.
Я мог бы представить, что вы сохраните индекс в кеше, связывающий тег свсе связанные CacheId.
Вопрос 1: Существует ли такая библиотека?Я бы не хотел изобретать велосипед.
Вопрос 2: ИЛИ есть ли другая «лучшая практика», и мои рассуждения ошибочны.
Разработка:
Только что натолкнулсяэто близко к тому, чего я не хочу достигнуть, но в php http://37signals.com/svn/posts/3112-how-basecamp-next-got-to-be-so-damn-fast-without-using-much-client-side-ui
Мой вопрос: как мне сопоставить ключи кеша с данными, чтобы при обновлении данных я знал, какие кешировать нужно сделать недействительными?Ключ кеша устанавливается в представлении, очистка производится в модели (onSave, onDelete).Как модель узнает, какие кэши она должна удалить?
Например:
Следующее кэшируется в представлении, каждый из которых генерирует уникальный ключ для извлечения.
Частичное 1:
продукт x для пользователя y = частичное1 / x.id-y.id
продукт z для пользователя y = частичное1 / z.id-y.id
И я снова использую того же пользователя, но на этот раз для комментариев
частичное 2:
Комментарий a от пользователя y = частичный2 / a.id-y.id
Комментарий b для пользователя y = частичный2 / b.id-y.id
Теперь, если я обновлю пользователя y, в onSave я не смогу узнать все кэшированные частичные, зависящие от y.Я мог бы, но мне нужно было бы извлечь все ключи кэша и проверить один за другим, если в них есть y.
Поэтому я подумал, что если я буду поддерживать карту, ключи которой зависят от y.id, я легко смогуочистить кеш без необходимости знать, как называются ключи.Уровень представления заполняет индекс, модель может использовать его для поиска ключей и аннулирования этих кэшей.Таким образом, в приведенном выше примере после создания кэша у меня будет следующий индекс:
x.id = [partial1/x.id-y.id]
z.id = [partial1/z.id-y.id]
a.id = [partial2/a.id-y.id]
b.id = [partial2/b.id-y.id]
y.id = [partial1/x.id-y.id, partial1/x.id-y.id, partial1/z.id-y.id,
partial2/a.id-y.id, partial2/b.id-y.id]