19

好吧,我想我在这里有一个非常基本的疑问:

我正在 GAE (Java) 上开发一个应用程序并对返回大量实体的数据存储执行查询,所以我需要缓存它。我使用的是 memcache,它工作得很好,但是如果我将实体列表保存在一个静态变量中,整个请求的速度是使用 memcache 的两倍。我认为那是因为我并没有一直反序列化实体。

在 memcache 上使用静态变量有什么缺点?我不知道云中是否有我的应用程序的多个实例,因此我的静态变量有几个实例?

我要缓存的实体列表是上周最好的(更高的分数)帖子。我拿了那个列表,随机选择了 5 个帖子,并在几页中显示它们。

谢谢您的帮助!

4

3 回答 3

16

随着用户数量的增加,App Engine 通过创建应用程序的新实例来进行扩展。正如 drudru 所说,不同的用户可能由不同的实例提供服务。通常,memcache 是存储您希望全局一致的内容的最快位置。但是,在您的情况下,可能还有一些改进的余地。

你提到你有一个帖子列表,你随机选择 5 个来显示给用户。如果 2 个不同的用户看到不同的 5 个,这有关系吗?如果您仍然选择随机的,也许没关系。然后,您可以将完整的帖子列表存储在 memcache 中,并从 memcache 中随机抽取 5 个帖子并将它们存储在静态变量中。

其次,你到底在缓存什么,你是如何把它拉出来的?您是否在 memcache 中存储了一大堆完整的帖子,将它们全部获取,然后选择 5 个?也许您可以下载帖子列表,选择 5 个,然后只获得您需要的 5 个?如果您认为是反序列化使您放慢了速度,这可能会有所帮助。您收到帖子后是否对它们进行任何处理?如果是这样,是否可以缓存该处理的结果?

于 2009-07-07T23:21:42.857 回答
6

当下一个请求命中时,您不能依赖静态变量(或 JVM 内存中的任何其他内容),因为 Google 可以在虚拟机需要时自由启动和停止。从表面上看,他们似乎更喜欢在同一个 JVM 中启动额外的 JVM 而不是额外的线程,这使这个问题更加复杂。

但是,您应该能够将静态变量用作缓存层,前提是您有办法在数据消失时从其他地方加载数据。

我也不会尝试过度使用那里的内存,您可以使用多少内存必须有配额。

于 2009-07-08T08:28:07.613 回答
3

是的,不能保证您的实例对于 Internet 上的各种用户都是相同的。在最坏的情况下,您最终可能会不断地将其读入静态。memcache 有更高的可用保证。我只会使用 memcache,你的应用程序在未来不应该有任何规模问题。

于 2009-07-07T22:15:53.520 回答