2

我知道这是一个非常模糊的问题,但我正在寻找一个非常抽象的答案。自从几个月前我开始使用 GAE 以来,我一直认为 memcache 没有用,而且会带来不必要的麻烦,因为它真的没那么重要。但似乎 memcache 被称赞为一个非常有益的功能,谷歌甚至说“高性能可扩展 Web 应用程序通常在某些任务之前使用分布式内存数据缓存或代替健壮的持久存储。”,等等我认为这一定有一些值得研究的地方。

我只是不明白。它对性能有什么好处?首先你必须检查内存缓存中是否有东西,如果没有,查询。我一直认为不必处理它会更快,无论如何都可以查询,但这似乎是一种幼稚的方法?这有多大的不同?

我想我从来不明白 memcache 的用处。我可以看到它在 Stackoverflow 主页上的用处,所有用户几乎都看到相同的东西,所以它会很有用,实际上在这种情况下不使用 memcache 是愚蠢的。但是说像Facebook这样的社交网络。每个用户都会看到不同的东西。没有两个人看到相同的数据和内容,而且事情变化如此之快,以至于 memcache 可能需要不断更新。在这样的场景下,memcache 能起到什么作用呢?

另外,在像社交网络这样的私人网站中,如果每个用户都必须在 memcache 中存储不同的信息,那么 memcache 到底能适应多少?我知道 GAE 没有提及其内存缓存的大小,那么存储数十万条记录是否安全?

4

2 回答 2

7

您将 memcache 用于您可能经常需要的东西。检查内存缓存中是否有东西很快。从 memcache 中获取它很快。如果您可以省去自己进行查询的工作,那么您就可以节省大量时间。

例如,考虑以下两种情况:

  • 两个人请求您的主页。这两个请求都作为页面加载的一部分进行查询。
  • 两个人请求您的主页。两者都检查缓存;一个执行查询并存储它,另一个获取缓存的结果。

从 memcache 中获取(或存储)某些东西的时间大约为 2-3 毫秒。从数据库获取东西的大概时间是 100 毫秒。

因此,对于第一种情况,您总共有 100 毫秒 x2 = 200 毫秒。

在第二种情况下,您有 3 毫秒(查找失败)+ 100 毫秒(查询)+ 3 毫秒(存储)+ 3 毫秒(成功查找)= 总共 109 毫秒。

您总共节省了近 50%。

现在考虑可能有 10 个人请求您的主页。在第一种情况下,每增加一个人将是另外 100 毫秒。第二种情况每个人只有3ms。


另请注意,您不必一次将整个页面存储在内存缓存中。您也可以存储部分页面。当然,并非所有用户都拥有所有相同的数据,但他们之间肯定有一些东西是共享的。

于 2012-10-25T04:03:59.623 回答
1

尺寸

您不能依赖内存缓存的大小。为了弄清楚每个应用程序有多少数据,人们进行了各种尝试,结果各不相同。

可靠性

这不可靠。您的 memcache 条目的生命周期与一组黑盒(对用户)值有关,例如请求它们的频率以及自上次请求以来已经过去了多长时间。

Google 将尝试保留经常使用的条目,并随机(从您的角度)将它们从内存缓存中删除。

提示

尝试将其用于所有人共享、经常请求或计算成本高昂的项目。很好的例子是用户实体,因为只有一个用户被加载,他们可能会多次与您的应用交互。另一个可能是您在其中放置用户特定数据的模板,或者如果只有一小部分会更改,则可以是整个页面。对于 Facebook,它可能是整个模板、诸如“这些朋友正在聊天”之类的部分、诸如“您可能想试试这个游戏”之类的公司范围的部分,或者将推送给许多当前在线朋友的新帖子。

对每种类型的实体使用不同的缓存期。通过将一个实体的到期日期设置为比另一个更短,提示 App Engine 最有用的是保留更长时间。一个缓存页面可能只有用 30 秒,一个用户条目可能有用一个小时。

这是一种有限的资源,Google 将针对多个客户/应用程序进行优化,以造福所有客户。如果您的应用程序没有受到攻击,而另一个应用程序需要更多的内存缓存,那么 Google 会退出您的内存缓存条目。

于 2012-10-26T06:24:28.170 回答