6

我是 memcached 的新手,刚刚开始使用它。我有几个问题:

  1. 我在我的 php 数据库类中实现了 MemCached,我将结果集(数组)存储在 memcache 中。我的问题是,对于网站来说,如果 4 个用户访问相同的页面和相同的查询执行过程,那么 memcache 会做什么?根据我对 1 个用户的理解,它将从 DB 中获取,其余 3 个系统将使用 Memcache。?那正确吗?

  2. 4个用户意味着它的memcache对象会生成吗?但所有人都会使用相同的内存吗?是否同样适用于网站上的 2 个不同页面?因为 bith pages 将使用

    $obj = memcached->connect(parameter);
    
  3. 我进行了一个小测试。但是结果很惊人,当我使用普通的 mysql 语句执行查询时,执行时间比我的代码使用 memcached 时要短吗?这是为什么?如果是这样,为什么每个写入内存缓存的地方都很快。?

  4. 请举一些例子来有效地测试 memcached 与 mormal 相比的执行时间mysql_fetch_object

4

3 回答 3

4
  1. Memcache 不能“自动”工作。它只是一个键 => 值映射。您需要确定如何使用它并实施它。

    首选方法是:
    A. 尝试从 memcache 获取
    B. 如果 A. 失败,从 db 获取,添加到 memcache
    C. 返回结果
    D. 如果您更新了该数据,则使所有关联的键失效

    这不会阻止在数据库上多次执行相同的查询。如果 2 个用户同时获得相同的数据,并且几乎同时执行所有操作,则从 memcache 获取的两个尝试都将失败并添加到 memcache。这通常没问题。

  2. 在代码中,它将创建与当前用户一样多的连接,因为它是从为每个用户执行的 php 运行的。您也可能会连接多次(如果您对代码不小心的话),因此可能会连接更多次。

  3. 很多时候,memcache 和 sql 的最大延迟实际上是网络延迟。如果 sql 在同一台机器上而 memcache 在不同的机器上,您可能会看到 memcache 的时间较慢。

    此外,许多框架/人没有正确实现多获取。因此,如果您有 100 个 id,并且您通过 id 从 memcache 中获取,它将执行 100 次单次获取而不是 1 次多次获取。这是一个巨大的减速。

    内存缓存很快。带有用于简单选择的查询缓存的 SQL 也很快。通常,您在以下情况下使用内存缓存:

    您正在运行的查询很复杂/很慢,
    或者
    使用 memcache 更具成本效益,然后让每个人都访问 SQL 服务器,
    或者
    您有这么多用户,数据库不足以跟上负载,
    或者
    您想尝试一个技术,因为你认为在你的简历上有很酷或很好。

  4. 您可以使用各种分析软件,例如 xdebug 或 phprof。

或者,您可以这样做,尽管由于服务器上发生的其他事情不太可靠:

$start = microtime(true);
// do foo
echo microtime(true) - $start;

$start = microtime(true);
// do bar
echo microtime(true) - $start;
于 2012-07-20T15:23:12.310 回答
3

使用 memcache 有两个原因:

1. 卸载您的数据库服务器

也就是说,如果您的数据库服务器负载很高,因为您一遍又一遍地查询相同的内容,并且内部 mysql 缓存的工作速度没有预期的那么快。或者您可能会遇到阻塞服务器的写入性能问题,那么 memcache 将帮助您以一致且更好的方式卸载 mysql。

如果您自己的服务器没有压力,如果主要是为了提高性能,使用 memcached 可能没有任何优势。Memcached 仍然是一个服务器,你仍然必须连接到它并与之交谈,所以仍然保持网络方面。

2. 在用户之间共享数据而不依赖于数据库

在另一种情况下,您可能希望在 Web 应用程序的用户之间共享一些数据或状态,而不依赖于文件或 sql 服务器。使用 memcached,您可以从用户的角度设置一个值并从另一个用户加载它。

很好的例子是用户之间的聊天日志,你不想将所有内容都存储在数据库中,因为它会进行大量的写入和读取,并且你想共享数据并且不在乎丢失所有内容以防出错来了,服务器重新启动......

我希望我的回答是令人满意的。

祝你好运

于 2012-07-20T14:58:23.570 回答
1
  1. 是的,这是正确的。基本上,这称为缓存,与 Memcached 本身无关。

  2. 我不完全明白。如果所有 4 个用户都连接到同一个 memchache 守护程序,他们将使用共享内存,是的。

  3. 你没有给出任何代码,所以很难说。可能有很多原因,所以我不会在提供这么少的信息的情况下得出结论。

  4. 您需要通过深度数据包检测来衡量您的网络流量,以有效地测试和比较两个执行时间。我不能在这个答案中举一个例子。您可能只需要使用microtime并记录缓存是否被命中(结果已经在缓存中)或错过(尚未在缓存中,需要从数据库中获取)。

于 2012-07-20T15:00:17.270 回答