Memcached - 它是如何工作的

6

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

  1. I have implemented MemCached in my php database class, where I am storing resultset (arrays) in memcache. My question is that as it is for website, say if 4 user access the same page and same query execution process, then what would memcache do? As per my understanding for 1 user, it will fetch from DB, for rest 3 system will use Memcache.? is that right?

  2. 4 users mean it objects of memcache will generate? but all will use same memory? IS same applies to 2 different pages on website? as bith pages will be using

    $obj = memcached->connect(parameter);
    
  3. I have run a small test. But results are starnge, when I execute query with normal mysql statements, execution time is lower than when my code uses memcached? why is that? if thats the case why every where its is written memcache is fast.?

  4. please give some example to effectively test memcached execution time as compare to mormal mysql_fetch_object.


1
这是你的代码,你将决定何时使用Memcache。 - Marcus Adams
如果mysql服务器存储在与web服务器相同的服务器上,并且如果您只是使用标准查询,则不会使用memcached看到任何性能提升。 - Rasmus Styrk
是的,数据库和Web服务器都安装在同一台服务器上。 - user1421407
@RasmusStyrk,我认为你这个评论有点宽泛了。即使在同一台服务器上,Memcached 也有许多用途(例如,如果您正在缓存预构建的 JSON 响应,或者如果您拥有非常重的 IO 箱并需要基于 RAM 的响应)。说“您将看不到任何性能提升”有点幼稚,我个人持不同意见。 - williamvicary
@williamvicary,是的,但我们正在谈论MySQL(以及可能是简单查询):) - Rasmus Styrk
3个回答

4
  1. Memcache并不自动工作,它只是一个键值映射。你需要确定如何使用它并实现它。

    首选方法是:
    A. 尝试从缓存中获取;
    B. 如果A失败,则从数据库中获取,并添加到缓存;
    C. 返回结果;
    D. 如果更新了该数据,则使所有相关的键失效。

    这并不能防止在数据库上执行相同查询多次。如果两个用户同时以几乎相同的时间获取相同的数据,而且所有操作也几乎同时执行,那么从缓存中获取的尝试都会失败并添加到缓存中。通常情况下这并不会有问题。

  2. 在代码中,它将为每个用户创建与当前用户相同数量的连接,因为它是由 PHP 运行的,而 PHP 会为每个用户执行一次。如果您没有注意代码,可能还会多次连接,所以这样做的次数可能会更多。

  3. 很多时候,无论是 Memcache 还是 SQL,最大的延迟实际上都是网络延迟。如果 SQL 在同一台计算机上,而 Memcache 在另一台计算机上,那么您可能会看到 Memcache 的速度较慢。

    此外,许多框架/人员没有正确实现多获取。因此,如果您有 100 个 ID,并从 Memcache 获取,那么它将执行 100 次单获取(而非 1 次多获取)。这会造成巨大的减速。

    Memcache 很快,对于简单查询使用查询缓存的 SQL 也很快。通常情况下,在以下情况下使用 Memcache:

    运行的查询比较复杂/较慢;

    使用 Memcache 更加经济,而不是让每个人都访问 SQL 服务器;

    您拥有如此之多的用户,以至于数据库无法跟上负载;

    您想尝试一种技术,因为您认为这很酷或者会增加您的履历。

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

或者,您可以按照以下步骤操作,尽管由于服务器上发生的其他事情,这种方法不太可靠:

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

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

3
您使用memcache有两个理由:
1. 卸载数据库服务器
如果您的数据库服务器的负载很高,因为您一遍又一遍地查询相同的内容而内部mysql缓存的速度不如预期快,或者您可能存在写入性能问题,这会使服务器变慢,那么使用memcache可以以一种更加一致和更好的方式卸载mysql。
如果您的服务器没有压力,则大多数情况下使用memcached没有任何优势。Memcached仍然是一个服务器,您仍然需要连接并与之通信,因此网络方面仍然需要维护。
2. 在不依赖数据库的情况下共享用户数据
在另一种场景中,您可能希望在网站应用程序的用户之间共享某些数据或状态,而不依赖于文件或SQL服务器。使用memcached,您可以从用户角度设置值,并从另一个用户中加载它。
这样做的好例子是用户之间的聊天记录,您不希望将所有内容存储在数据库中,因为这会进行大量的写入和读取,并且您希望共享数据并不关心在发生错误并且服务器重新启动时失去全部数据...
希望我的回答对您有所帮助。
祝您好运!

1
  1. 是的,没错。基本上这被称为缓存,与Memcached本身无关。

  2. 我不完全理解。如果所有4个用户连接到同一个Memcached守护程序,他们将使用共享内存,是吗。

  3. 您没有提供任何代码,因此很难说。原因可能有很多,所以在提供如此少的信息时,我不会轻易下结论。

  4. 您需要使用深度数据包检查来度量网络流量,以有效地测试和比较两个执行时间。我无法在此答案中给出示例。您可以尝试使用microtime并记录缓存是否命中(结果已经在缓存中)或未命中(尚未在缓存中,需要从数据库中获取)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接