嗯,我想我在这里有一个非常基本的疑问:
我正在开发一个关于GAE(Java)的应用程序,并对返回很多的数据存储区执行查询 实体,所以我需要缓存它。我使用的是memcache并且工作得很好,但是如果我将实体列表保存在静态变量中,整个请求的速度是使用memcache的两倍。我认为那是因为我不是一直在反序列化实体。
在memcache上使用静态变量会有什么缺点?我不知道我的应用程序在云中是否有多个实例,因此我的静态变量有多个实例?
我正在尝试缓存的实体列表是上周的最佳(更高分)帖子。我拿这个列表并选择5个随机帖子并在几页中显示它们。
感谢您的帮助!
答案 0 :(得分:16)
App Engine通过创建应用程序的新实例来扩展,因为用户数量会增加。正如drudru所说,不同的用户可能会被不同的实例服务。通常,memcache是存储您希望全局一致的最快的地方。但是,在您的情况下,可能还有一些改进空间。
你提到你有一个帖子列表,你随机选择5向用户显示。 2个不同的用户是否看到不同的5个集合是否重要?无论如何,如果你选择随机的,也许没关系。然后你可以在memcache中存储完整的帖子列表,并从memcache中拉出5个随机的帖子并将它们存储在一个静态变量中。
其次,你到底记得什么,以及你是如何把它拉出来的?你是否在memcache中存储了一大堆完整的帖子,将它们全部存入,然后选择5?也许你可以只下载帖子列表,选择5,只获得你需要的5个?如果您认为反向排序会减慢您的速度,那么这可能会有所帮助。你得到它们后,你是否正在对帖子进行任何处理?如果是这样,是否可以缓存该处理的结果?
答案 1 :(得分:6)
当下一个请求命中时,您不能依赖静态变量(或JVM内存中的任何其他内容),因为Google可以随时启动和停止虚拟机。从它的外观来看,它们似乎更喜欢在同一个JVM中启动其他JVM而不是其他线程,这会加剧这个问题。
但是,你应该能够使用静态变量作为缓存层,只要你有办法从其他地方加载数据就可以了。
我也不会尝试过度使用内存,必须有一个可以使用多少内存的配额。
答案 2 :(得分:3)
是的,无法保证您的实例对于互联网上的各种用户都是相同的。在最坏的情况下,你最终可能会不断地将其读入静态。内存缓存有更高的可用保证。我只想使用内存缓存,你的应用程序将来不应该有任何扩展问题。