memcache 与 MySQL 是如何工作的


How does memcache with MySQL work?

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

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

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

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

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

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

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

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

它缓存PHP中的对象,

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

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

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

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