【问题标题】:How does memcache with MySQL work?内存缓存与 MySQL 的工作原理是什么?
【发布时间】:2012-04-25 11:55:02
【问题描述】:

我正在尝试了解(并可能部署)我们环境中的 memcached。

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

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

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

【问题讨论】:

    标签: php mysql memcached apc


    【解决方案1】:

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

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

    【讨论】:

    • 我们可以将常规变量存储到 memcached 中吗?在实践中吗?
    • 更具体地说,我有很多常量变量在整个应用程序中使用。我可以将它们存储在缓存中吗?
    • 你能给我一个'常量'变量的例子吗?根据定义,常量不是动态的。
    • define('VARIABLE') = 'xyz'; $another_var = 'abc' $yetanothervar = array(x,y,z);等
    • 谢谢!但遗漏了一个问题。 “当数据是动态的时,不确定要缓存什么以及如何利用它。”显然,即使来自同一个表,每个结果集的数据也不相同。
    【解决方案2】:

    有几个关于 memcache 工作原理的示例。 Here 是链接之一。

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

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

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

    【讨论】:

    • 谢谢!。但我想我的问题还不清楚。假设这是查询:` **SELECT Name, age from Person ** code 这是结果:code Krish, 45 Josh, 25 Kevin, 60 code 下一次,当我调用相同的查询,它可能会返回:code Joe, 45 Jay, 25 Chris, 60 code
    • 抱歉转贴:谢谢!。但我想我的问题还不清楚。假设这是查询:`SELECT Name, age from Person`,结果如下:`Krish, 45 Josh, 25 Kevin, 60` 下一次,当我调用相同的查询时,它可能返回:` Joe, 45 Jay, 25 Chris, 60 ` 缓存在这里是如何工作的?查询是如何被缓存的?
    • 无法从您的缓存中回答此查询。缓存假定数据自上次请求以来没有更改。实际上,它所做的只是将一些数据临时存储在内存中以便快速访问。这样看:如果你刚刚请求查看数据库中所有名字以“Kev”开头且年龄超过 25 岁的人。当你的应用第一次收到这个请求时,它必须要求 MySQL获取结果。如果您随后告诉您的应用缓存这些结果,那么下次有人运行 exact 相同的查询时,它可以简单地从缓存中回答。如果数据不同,这将不起作用。
    • 好的,我明白了。但是如果结果集每次都在变化,那么我认为缓存没有任何用处。
    【解决方案3】:

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

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

    【讨论】:

    • 非常感谢!这个视频很有帮助!
    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2015-08-20
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多