Как добавить memcache в мой класс базы данных? - PullRequest
1 голос
/ 14 августа 2011

Я просто пытаюсь понять, как я могу добавить memcache в класс базы данных. Я не тестировал приведенный ниже код (это даже первый раз, когда я пытаюсь добавить memcache к своему коду), но имеет ли это смысл? Или кто-то может придумать лучший способ сделать это?

Класс базы данных (упрощенный)

database
{
    protected $result;

    protected $row;

    protected $cache_result;

    public function query($sql, $cache = false)
    {
        /* only use memcache for selected queries */

        if($cache)
        {
            $key = md5('query'.$sql);

            $this->result = $memcache->get($key);

            if($this->result == null)
            {
                $this->result = mysql_query($sql);

                $this->cache_result = mysql_fetch_object($sql);

                /* cache for 1 hour */

                $memcache->set($key, $this->cache_result, 0, 3600);
            }
        }
        else
        {
            $this->result = mysql_query($sql);
        }

        return $this->result;
    }

    public function fetch($sql)
    {
        $this->row = mysql_fetch_assoc($sql);

        return $this->row;
    }
}

PHP (упрощенно)

include_once $_SERVER['DOCUMENT_ROOT'].'/loader.php';

$sql = "SELECT * FROM `table` WHERE `this` = 'that'";

/* use memcache for the query below */

$a = $database->query($sql, true);

$b = $database->fetch($a);

PHP (загрузчик)

$database = new database();

$memcache = new Memcache;

$memcache->connect('127.0.0.1', 11211);

1 Ответ

2 голосов
/ 14 августа 2011

Я не буду ручаться за синтаксис, так как я не кодирую PHP, однако это выглядит как правильный подход со следующими наблюдениями.

Вы не должны принимать md5 «запроса».$ SQL.Было бы лучше сделать 'query'.md5 ($ sql), чтобы префикс действовал как псевдо-пространство имен, так как вы можете гарантировать, что' ns1: '. Md5 ($ sql) не будет конфликтовать с' ns2: '.md5 ($ SQL).Существуют более разумные способы использования таких псевдо-пространств имен, которые хорошо справляются со следующими часто задаваемыми вопросами:

http://code.google.com/p/memcached/wiki/FAQ#How_do_I_access_memcached?

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

http://highscalability.com/strategy-break-memcache-dog-pile

И учитывая заголовок, я не могу удержаться от ссылки на эту статью;

http://blog.craigambrose.com/past/2007/11/13/caching_makes_your_brain_explode/

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

НО

Первое, что я бы сказал на самом деле: вы уже настроили свою базу данных?В частности, используете ли вы кеш запросов, который можно включить и настроить?Это, вероятно, окажет гораздо более существенное влияние на производительность, чем добавление memcached - конечно, пока вы не масштабируете возможности, значительно превышающие возможности одного сервера.

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