【问题标题】:Best practices for caching front page queries for Google App Engine (GAE)为 Google App Engine (GAE) 缓存首页查询的最佳做法
【发布时间】:2014-12-17 05:03:40
【问题描述】:

想问为谷歌应用引擎缓存首页查询的最佳做法是什么,其数据存储区仅提供最终一致性(除非使用祖先查询)

我遇到的问题是,如果我将一个项目放入数据存储区,我无法立即运行查询以获取正确和最新的结果,并且基于我正在阅读的文档,我无法知道所有索引值(或仅相关的索引值)何时更新以生成更新后的查询

我已经设置了手动并行添加到缓存中,但是我永远不会真正有一个入口点来确保缓存与数据存储同步,除非我为缓存到期设置了任意时间。 .

有没有办法解决这个问题?

谢谢!

【问题讨论】:

    标签: python google-app-engine memcached google-cloud-datastore


    【解决方案1】:

    您可以像往常一样缓存查询,但另外使用 _post_put_hook 使当前缓存值无效。这样,您的缓存中将几乎有最新的结果。

    class Foo(ndb.Model):
      CACHE_KEY = 'bla_cache'
      bla = ndb.StringProperty()
    
      @clasmethod
      def build_page(cls):
        result = memcache.get(CACHE_KEY)
        if result is None:
          result = cls.query().fetch(100)
        return result
    
      def _post_put_hook(self, future):
        memcache.delete(CACHE_KEY)
    

    【讨论】:

    • 谢谢德米特里!不知道 _post_put_hook 是在实体 put 完成后调用还是在索引更新后调用?如果是前者,我可能仍会在下次读取时将旧查询结果加载到缓存中(即,如果索引仍未更新)
    • A get(而不是查询)始终具有强一致性,因此如果您使用 get 结果填充缓存,它们将是最新的。我现在找不到参考,但我相信在实体 get 返回之前总是应用未完成的写入,以确保强一致性。
    • _post_put_hook 在 put 之后,而不是在索引更新之后。索引由其他服务异步更新。您无法看到索引更新。
    • 知道了,所以我想检查我是否有最新查询信息的唯一方法是查看放置项是否在查询结果中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多