Я ищу решение для кэша скриптов в памяти, используя Zend_Cache
и Zend Framework.
В нашем приложении есть несколько случаев, когда для отображения таблицы, скажем, из 100 элементов, логика выглядит следующим образом:
- получить 100 элементов изтаблицу содержимого (один запрос)
- для каждого элемента, получите пользователя-создателя и пользователя, которые одобрили содержимое из бэкэнда db / memcache (обычно это делается из цикла for)
В большинстве случаев пользователь, который утвердил содержимое, является 2 или 3 пользователями-администраторами, однако сценарий вызывает базу данных / memecache несколько раз.Ситуация ухудшается, так как пользовательская модель должна запросить 3 разные таблицы, чтобы узнать, к какой роли принадлежит пользователь и к какому сообществу он также принадлежит.
В общем, чтобы отобразить таблицу из 100 элементов,мы запрашиваем базу данных (или сервер memcache) 600 раз: -)
Я думал о двух решениях:
Не запрашивать таблицу пользователей внутри цикла.Цикл по 100 элементам, получить все идентификаторы пользователей и получить всех пользователей в одном запросе.Я не уверен, что это будет хорошим решением, так как это означает, что мне придется писать sql-соединения, в результате чего функции модели будут возвращать не Zend_Db_Table_Row
, который мы интенсивно используем.
другое решение - сохранить пользовательский объект в массиве кэша в памяти при первой загрузке, и в следующий раз, когда цикл попытается прочитать идентификатор пользователя, он сначала будет искать этот «специальный» в кэше памяти.Я думал об использовании Zend_Registry
в качестве бэкэнда кеша, аналогично приведенному здесь решению: http://sameerparwani.com/posts/using-zend_registry-as-a-zend_cache-backend
Мы используем сервер memcache, но скрипт просто запрашивает сервер memcache несколько сотен раз вместозапросите базу данных mysql.Однако запрос к серверу memcache происходит быстрее, так как скрипт уже загружает эти данные, я хочу использовать скрипт «память», а не запрашивать внешний сервер.