Как внедрить кеширование в Zend_Db - PullRequest
0 голосов
/ 18 ноября 2011

Я ищу способы уменьшить количество запросов, которые выполняются на моем сервере MySQL.

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

Сначала я думал, что могу легко включить какую-то формукеширования запросов в объекте Zend_Db, однако ближе всего я увидел что-то перекрестное: Zend_Db_Profiler.

Один из подходов, который я рассматривал, - создать прокси для моего объекта Zend_Db_Adapter.Кое-что с эффектом:

/**
 * Initialize the database.
 *
 * @return void
 */
protected function _initDb() {
    // Instantiate a connection to the database
    $config = Zend_Registry::get('config');
    $db = new MyProject_Db_Proxy (
                Zend_Db::factory($config->resources->db->adapter, 
                                 $config->resources->db->params)
              );

    // Store the database object in the registry
    Zend_Registry::set('db', $db);

    Zend_Db_Table::setDefaultAdapter('db');
}

Я просмотрел различные Zend_Db интерфейсы и классы, и кажется возможным, что я мог бы внедрить кэширование в метод Zend_Db_Adapter_Abstract::query() через прокси.Что-то с эффектом:

public MyProject_Db_Proxy() {

  private $_adapter = null;
  ...
  public function query($sql, $bind = array()) {
    // Generate the cache key by joining and hashing $sql and $bind
    // Check to see if key is in cache, return if found
    // Execute query
    $stmt = this->_adapter->query($sql, $bind);
    // Cache result
  }
  ...
}

Мой вопрос: Есть ли лучший / более простой способ добавить кеширование в Zend_Db?

1 Ответ

1 голос
/ 18 ноября 2011

Я бы не пытался внедрить кэширование напрямую в Zend_Db.

Что если у вас есть один запрос, который вы хотите кэшировать в течение 24 часов, и один, который вы хотите кэшировать только в течение 60 секунд? Как / где вы контролируете это? Также вам понадобится логика, чтобы убедиться, что она кэширует только запросы SELECT, в противном случае вы теряете место в кеше.

Я бы просто использовал Zend_Cache, используя адаптер по вашему выбору (libmemcached / apc / xcache для лучшей производительности), и обрабатывал бы кэширование в вашем приложении или классах доступа к данным.

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

The query cache does not return stale data. When tables are modified, any relevant entries in the query cache are flushed.

Таким образом, если ваши таблицы изменяются в результате вставки / обновления / удаления, кэш запросов очищается. Если таблицы часто меняются, то кеш запросов не очень полезен, потому что он недолговечный.

Еще одна распространенная вещь, которую вы должны сделать в рабочей среде для Zend_Db, - это кэшировать метаданные таблицы. Как вы, наверное, заметили, Zend выдает запросы DESCRIBE до запросов insert (), find () или info (). Использование мета-кэша таблицы может устранить эти запросы. Инструкции о том, как это сделать, см. В метаданных кэшируемой таблицы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...