Java 谷歌应用引擎:Memcache还是静态变量?

Java 谷歌应用引擎:Memcache还是静态变量?,java,google-app-engine,memcached,google-cloud-datastore,static-variables,Java,Google App Engine,Memcached,Google Cloud Datastore,Static Variables,我想我有一个基本的疑问: 我正在GAE(Java)上开发一个应用程序,并对返回大量数据的数据存储执行查询 实体的数量,所以我需要缓存它。我使用了memcache,它工作得很好,但是如果我将实体列表保存在一个静态变量中,整个请求的速度将是使用memcache的两倍。我想那是因为我不是一直在反序列化实体 在memcache上使用静态变量的缺点是什么?我不知道云中是否会有我的应用程序的多个实例,以及静态变量的多个实例 我试图缓存的实体列表是上周最好(得分更高)的帖子。我从列表中随机选择5篇文章,并在几

我想我有一个基本的疑问:

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

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

我试图缓存的实体列表是上周最好(得分更高)的帖子。我从列表中随机选择5篇文章,并在几页中展示它们


谢谢你的帮助

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

应用程序引擎通过创建新的应用程序实例来扩展,因为点击它的用户数量会增加。正如drudru所说,不同的实例可能为不同的用户提供服务。一般来说,memcache是存储您希望全局一致的内容的最快的地方。然而,在您的情况下,可能有一些改进的空间

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


第二,你到底在缓存什么,你是如何将其取出的?您是否在memcache中存储了一大堆完整的帖子,将它们全部获取,然后选择5篇?也许你可以下载帖子列表,选择5篇,然后只得到你需要的5篇?如果你认为是反序列化拖了你的后腿,这可能会有所帮助。你收到这些帖子后是否在处理它们?如果是这样的话,处理的结果可以被缓存吗?

你不能依赖静态变量(或JVM内存中的任何其他东西)在下一个请求命中时出现,因为谷歌可以在虚拟机需要时自由启动和停止虚拟机。从外观上看,他们似乎更喜欢启动额外的JVM,而不是在同一JVM中启动额外的线程,这加剧了这个问题

但是,您应该能够使用静态变量作为缓存层,前提是如果数据丢失,您可以从其他地方加载数据


我也不会试图在内存使用方面做得太过火,必须对您可以使用的内存量设定配额。

是的:我正在对所有帖子列表进行内存缓存并获取它们,然后选择5。如果我只得到我想要的5个,它会更快(更聪明!)。正如你所说,如果两个不同的用户看到一组不同的5,这并不重要。事实上,如果一个用户重新加载页面,那么集合就会不同,所以我可以继续使用静态变量吗?我真的不在乎列表中是否有几个不同的实例。谢谢你,彼得!!如果您希望尽可能获得最后一点性能,可以尝试两级缓存。当一个请求传入时,首先检查静态变量缓存中是否有有效值,如果没有,则检查memcache。如果memcache中没有有效的内容,那么您将从数据存储中获取数据,并填充memcache和静态变量。最后一件事——这一操作对您的总页面加载时间有多大影响?如果你让这个操作从10毫秒变为5毫秒,这很酷,但是如果你有其他需要300毫秒的操作,你应该首先集中精力:)从我所看到的,这个操作在加载时间中占有非常重要的一部分。谢谢彼得的回答!!我开始了一个实验,以了解GAE多长时间为您提供一个新JVM:。显然,当负载较高时,它们会产生新的虚拟机(与同一虚拟机中的新线程相反)。他们也会在一段时间后关闭未使用的虚拟机(但不会太频繁)。