Есть ли библиотека для кеширования с использованием индекса или тегов - PullRequest
2 голосов
/ 14 марта 2012

Я работаю над реализацией кэша на уровне представления в приложении 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]  

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

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

Механизм кэширования выглядит так:

(1) No caching for POST requests

(2) Save all rendered pages for GET requests, save to files, eg. 
$Cache_File = "cache/".md5($_SERVER["REQUEST_URI"]).".html";

(3) Up on a new GET request, get the md5 of URI,
then check if file existing in cache, take it out and 
flush to browser.
0 голосов
/ 14 марта 2012

Я не знаю, куда вы идете с историей тегов, возможно, вы захотите объяснить это немного подробнее.

Однако, частичное кэширование может быть выполнено с использованием серверных включений (что может быть легкообрабатывается PHP): просто используйте <?include('cached/partial1.html')?>, где partial1.html - это кэшированный блок html-данных, сгенерированных из вашей серверной части.Таким образом, вы можете хранить, например, текст статьи, а затем обновлять html-файл при редактировании статьи.

...