Бэкэнд кеша скриптов In-Memory в Zend Framework - PullRequest
1 голос
/ 20 марта 2012

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

1 Ответ

2 голосов
/ 04 апреля 2012

Взгляните на FaZend , есть реализация этого.При взгляде на код он должен работать немного по-другому (например, без TTL, test () возвращает логическое значение), но этого может быть достаточно для вас.Не проверено!

Редактировать:

Начиная с Zend Framework 2, есть реализация для него: Zend \ Cache \ Storage \ Adapter \ Memory

...