Я размещал некоторые комментарии в связанном вопросе о кэшировании MVC, и некоторые вопросы о фактической реализации появились. Как реализовать кеш-память на уровне модели, которая работает прозрачно, если разработчику не требуется вручную кэшировать, но все же остается эффективным?
Я бы сохранил кеширование ответственности в модель. Это не или просмотреть бизнес, где модель получение данных. Все, о чем они заботятся, это что, когда запрашиваются данные, данные при условии - это то, как MVC парадигма должна работать.
(Источник: Сообщение от Jarrod)
Причина, по которой я настроен скептически, заключается в том, что кеширование обычно не должно выполняться, если нет реальной потребности, и не должно быть сделано для таких вещей, как результаты поиска. Итак, каким-то образом сама Модель должна знать, стоит ли выставлять на нее инструкцию SELECT. Разве Модель не должна быть астрономически умной и/или хранить статистику того, что чаще всего запрашивается в течение длительного периода времени, чтобы точно принять решение? И не будет ли накладные расходы на все это сделать кеширование бесполезным?
Как бы вы однозначно идентифицировали запрос из другого запроса (или, точнее, результат из другого набора результатов)? Что делать, если вы используете подготовленные операторы, только с изменением параметров в соответствии с пользовательским вводом?
Другой плакат сказал это:
Я бы предложил использовать хеш md5 ваш запрос в сочетании с сериализованным версии ваших входных аргументов.
Не стоит ли беспокоиться о минимальной вероятности столкновения?
Концептуально, кэширование в модели кажется для меня хорошей идеей, но, по-видимому, в практичности и из-за характера кеширования разработчик должен иметь прямой контроль над ним и объяснять его код логикой контроллера.
Обновление для Bounty
Я действительно использую чрезвычайно легкий ORM, несколько похожий на ActiveRecord, но способный выполнять сложные объединения и подзапросы без проблемы n^2
. Я сам его создал, поэтому он является гибким и не является ограничительным с точки зрения отношений или имен столбцов, и я просто хочу понять, как я должен реализовать механизм кэширования.
Следуя советам полезных людей, я бы взял хэш (возможно, md5) запроса, объединенного со списком его параметров, и использовал его как ключ для этого конкретного хранилища данных. Должен ли я реализовать кеширование отдельно в классах Model, которые его требуют, или он должен быть частью слоя ORM?
Как я узнаю, когда это должно быть признано недействительным? Должен ли я вручную анализировать запросы UPDATE/DELETE/INSERT и вспомогательные параметры, чтобы узнать, какие записи изменяются? Или, что еще хуже, делать дополнительные запросы, когда данные изменяются, чтобы отслеживать, какие вещи изменились и что должно быть недействительным?
Я награжу награду тем, кто может дать мне четкое концептуальное объяснение (действительно ли это действительно необходимо/эффективно сделать прозрачно), и если да, то есть некоторые детали реализации для кэширования модели. Я использую PHP и MySQL, если это помогает сузить фокус.