Google App Engine:Memcache还是Static变量?

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

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

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

我正在尝试缓存的实体列表是上周的最佳(更高分)post。 我拿这个列表并选择5个随机post并在几页中显示它们。

谢谢您的帮助!

App Engine通过创建应用程序的新实例来扩展,因为用户数量会增加。 正如drudru所说,不同的用户可能会被不同的实例服务。 通常,memcache是​​存储您希望全局一致的最快的地方。 但是,在您的情况下,可能还有一些改进空间。

你提到你有一个post列表,你随机选择5向用户显示。 如果2个不同的用户看到不同的5个集合,这是否重要? 无论如何,如果你选择随机的,也许没关系。 然后你可以在memcache中存储完整的post列表,并从memcache中拉出5个随机的post并将它们存储在一个静态变量中。

第二,你到底记得什么,你是如何把它拉出来的? 你是否在memcache中存储了一大堆完整post,将它们全部存入,然后选择5? 也许你可以只下载post列表,选择5,只获得你需要的5? 如果你认为这会减慢你的速度,那么这可能会有所帮助。 你得到它们后,你正在对post进行任何处理吗? 如果是这样,是否可以缓存该处理的结果?

当下一个请求命中时,您不能依赖静态变量(或JVM内存中的任何其他内容),因为Google可以在他们感觉到这一点时自由启动和停止虚拟机。 从它的外观来看,它们似乎更喜欢在同一个JVM中启动其他JVM而不是其他线程,从而加剧了这个问题。

但是,您应该能够将静态变量用作缓存层,前提是您可以从其他位置加载数据(如果它已经消失)。

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

是的,无法保证您的实例对于互联网上的各种用户都是相同的。 在最坏的情况下,你最终可能会不断地将其读入静态。 memcache有更高的可用保证。 我只想使用内存缓存,你的应用程序将来不应该有任何扩展问题。