Google App Engine:Memcache还是Static variable?

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

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

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

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

感谢您的帮助!


答案 1

App Engine 会随着访问应用的用户数量的增加而通过创建应用的新实例进行扩展。正如 drudru 所说,不同的实例可能会为不同的用户提供服务。一般来说,memcache是存储您想要全局一致性的东西的最快地方。但是,就您而言,可能会有一些改进的余地。

您提到您有一个帖子列表,并且您随机选择5个向用户显示。如果 2 个不同的用户看到不同的 5 个用户集,这重要吗?如果你无论如何都要选择随机的,也许这并不重要。然后,您可以将完整的帖子列表存储在memcache中,并从memcache中提取5个随机帖子并将其存储在静态变量中。

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


答案 2

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

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

我也不会试图在那里过度使用内存,必须有一个关于你可以使用的内存量的配额。


推荐