Php 如何将memcache添加到数据库类中?

Php 如何将memcache添加到数据库类中?,php,memcached,Php,Memcached,我只是想弄清楚如何将memcache添加到数据库类中。我还没有测试下面的代码(这甚至是我第一次尝试将memcache添加到我的代码中),但它至少有意义吗?或者有人能想出更好的方法吗 数据库类(简化) PHP(简化) PHP(加载器) 我不会为语法担保,因为我没有编写PHP代码,但是通过以下观察,它看起来是正确的方法 您不应该真正接受'query.$sql'的md5。最好执行'query'.md5($sql),这样前缀就像一个伪名称空间,您可以保证'ns1:'.md5($sql)不会与'ns2:'

我只是想弄清楚如何将memcache添加到数据库类中。我还没有测试下面的代码(这甚至是我第一次尝试将memcache添加到我的代码中),但它至少有意义吗?或者有人能想出更好的方法吗

数据库类(简化)

PHP(简化)

PHP(加载器)


我不会为语法担保,因为我没有编写PHP代码,但是通过以下观察,它看起来是正确的方法

您不应该真正接受'query.$sql'的md5。最好执行'query'.md5($sql),这样前缀就像一个伪名称空间,您可以保证'ns1:'.md5($sql)不会与'ns2:'.md5($sql)冲突。下面的FAQ可以很好地处理使用这种伪名称空间的更聪明的方法

?

接下来我要说的是,我会对明确的到期时间保持警惕。在需要空间时,最好让缓存处理要转储的项。如果您有一个繁忙的站点,您会发现显式过期将导致不必要的缓存转储和性能问题,您应该通过添加缓存来解决这些问题。这里的一些问题有一个很好的起点

鉴于标题,我也忍不住要链接到这篇文章

因此,我倾向于在数据更改时显式地使适当的缓存键无效,而不是使用任意的时间约束。但无论哪种方式,都要试着理解你所采取的任何方法的后果

但是
我想说的第一件事是。。。你调整过你的数据库了吗?特别是,您是否正在使用可以启用和配置的查询缓存?这可能比添加Memcache对性能的影响要大得多-当然,除非您的扩展远远超出单个服务器的容量。

您可能会将对连接的Memcache的引用传递给数据库类,这样您就不必像引用全局$Memcache.Wow这样做,感谢您提供的信息,罗杰。实际上,我还没有检查是否启用了ot not查询缓存(我假设没有),但我现在肯定会研究它。再次感谢!
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;
    }
}
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);
$database = new database();

$memcache = new Memcache;

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