22

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

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

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

整个内存缓存(或者就此而言,任何缓存的工作)是如何工作的?

4

3 回答 3

26

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

对于 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 文档以获取更多信息,这里有一些很好的示例和评论。

于 2012-04-13T05:09:10.150 回答
1

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

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

于 2012-04-13T06:37:44.803 回答
1

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

其次,Memcache 可以在有或没有 MySQL 的情况下工作。

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

APC 为您提供了比 Memcache 更多的功能。除了存储/缓存 PHP 对象外,它还缓存 PHP-executable-machine-readable-opcodes,这样您的 PHP 文件就不会经历加载到内存中的过程-> 被编译,而是直接运行已经编译的操作码从记忆中。

于 2012-04-13T04:55:01.803 回答