首页 文章

Google App Engine:Memcache还是Static变量?

提问于
浏览
18

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

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

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

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

谢谢您的帮助!

3 回答

  • 16

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

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

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

  • 3

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

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

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

  • 6

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

相关问题