如何使用MySQL的memcache工作?

时间:2012-04-13 04:50:20

标签: php mysql memcached apc

我试图在我们的环境中理解(并可能部署)memcached。

我们在loadbalancer上有4个Web服务器,运行用PHP开发的大型Web应用程序。我们已经在使用APC了。 我想看看memcached是如何工作的?至少,我可能不明白缓存是如何工作的。

我们有一些复杂的动态查询,它们结合了几个表来提取数据。每次,数据都来自不同的客户端数据库,数据不断变化。根据我的理解,如果某些数据存储在缓存中,并且下次请求相同,则返回相同的数据。 (或者我在这里可能完全错了。)

整个内存缓存(或者就此而言,任何缓存内容都有效)?

3 个答案:

答案 0 :(得分:25)

缓存通常是一个非常快速的键/值存储引擎,您可以通过预定键存储值(通常是序列化的),因此您可以使用相同的键检索存储的值。

关于MySQL,您应该以这样的方式编写应用程序代码,以便在向数据库发出请求之前检查缓存中是否存在数据。如果找到匹配项(存在匹配项),则可以访问与该项关联的数据。如果可以避免,我们的目标是不向更昂贵的数据库发出请求。

一个例子(仅示范):

$cache = new Memcached();

$cache->addServer('servername', 11211);

$myCacheKey = 'my_cache_key';

$row = $cache->get($myCacheKey);

if (!$row) {

    // Issue painful query to mysql
    $sql = "SELECT * FROM table WHERE id = :id";

    $dbo->prepare($sql);
    $stmt->bindValue(':id', $someId, PDO::PARAM_INT);

    $row = $stmt->fetch(PDO::FETCH_OBJ);

    $cache->set($myCacheKey, serialize($row));
}

// Now I have access to $row, where I can do what I need to
// And for subsequent calls, the data will be pulled from cache and skip
// the query altogether
var_dump(unserialize($row));

查看memcached上的PHP文档以获取更多信息,有一些很好的示例和评论。

答案 1 :(得分:1)

有几个关于memcache如何工作的例子。 Here是其中一个链接。

其次,Memcache可以使用或不使用MySQL。

它缓存PHP中的对象,现在无论是来自MySQL还是其他任何地方,如果它是一个PHP对象,它可以存储在MemCache中。

APC为您提供了一些比Memcache更多的功能。除了存储/缓存PHP对象之外,它还缓存PHP可执行机器可读操作码,以便您的PHP文件不会经历内存加载过程 - >正如Comiled,它直接从内存中运行已编译的操作码。

答案 2 :(得分:1)

如果您的数据不断变化(请求之间),那么缓存是徒劳的,因为该数据将变得陈旧。但是大多数时候(我甚至在你的缓存中都打赌)对数据库的多个请求导致相同的数据集,在这种情况下,缓存(在内存中)非常有用。

P.S:我做了一个快速的谷歌搜索,发现这个关于memcached的视频质量相当高=> http://www.bestechvideos.com/2009/03/21/railslab-scaling-rails-episode-8-memcached。唯一的问题可能是它谈论Ruby On Rails(我也没有那么多使用,但很容易理解)。希望它能帮助你更好地掌握这个概念。