如何将memcache添加到我的数据库类?

时间:2011-08-13 23:27:47

标签: php memcached

我只想弄清楚如何将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 个答案:

答案 0 :(得分:2)

我不会保证语法,因为我不编码PHP,但它看起来像是正确的方法,具有以下观察结果。

你不应该真正接受'query'的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/

因此,我倾向于在数据更改时显式地使相应的缓存键无效,而不是使用任意时间约束。但不管怎样,试着去了解你所采取的任何方法的后果。

BUT

我实际上要说的第一件事是......你有没有调整过你的数据库?特别是,您使用的是可以启用和配置的查询缓存吗?与添加memcached相比,这可能会对性能产生更大的影响 - 当然,除非您的扩展远远超出单个服务器的容量。