Бэкэйн кэша скриптов в памяти в zend framework

Я ищу решение для кеша сценариев памяти, используя 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, поскольку скрипт уже загружает эти данные, я хочу использовать сценарий «память» и не запрашивать внешний сервер.