Python appengine:缓存的引用属性?

Python appengine:缓存的引用属性?,python,database,performance,google-app-engine,google-cloud-datastore,Python,Database,Performance,Google App Engine,Google Cloud Datastore,如何在Google App Engine中缓存引用属性 例如,假设我有以下模型: class Many(db.Model): few = db.ReferenceProperty(Few) class Few(db.Model): year = db.IntegerProperty() 然后我创建了许多只指向一个少数的多个: one_few = Few.get_or_insert(year=2009) Many.get_or_insert(few=one_few) Many

如何在Google App Engine中缓存引用属性

例如,假设我有以下模型:

class Many(db.Model):
    few = db.ReferenceProperty(Few) 

class Few(db.Model):
    year = db.IntegerProperty()
然后我创建了许多只指向一个
少数
多个

one_few = Few.get_or_insert(year=2009)
Many.get_or_insert(few=one_few)
Many.get_or_insert(few=one_few)
Many.get_or_insert(few=one_few)
Many.get_or_insert(few=one_few)
Many.get_or_insert(few=one_few)
Many.get_or_insert(few=one_few)
现在,如果我想迭代所有的
多个
,读取它们的
少数
值,我会这样做:

for many in Many.all().fetch(1000):
  print "%s" % many.few.year
问题是:

  • 每个对
    的访问是否都会触发数据库查找
  • 如果是,是否可以缓存到某个地方,因为每次只需一次查找就足以带来相同的实体

正如一条评论中提到的:我知道memcache,但我不确定在通过引用调用另一个实体时如何“注入它”

在任何情况下,memcache都不会有用,因为我需要在执行中进行缓存,而不是在执行之间进行缓存。使用memcache无助于优化此调用。

问题是:

  • 每个对many.level的访问都会触发数据库查找吗?对不确定它的1个或2个呼叫
  • 如果是,是否可以缓存到某个地方,因为每次只需一次查找就足以带来相同的实体?您应该能够使用memcache存储库来完成这项工作。这在google.appengine.api.memcache包中

  • memcache的详细信息在您第一次取消引用任何引用属性时,即会获取该实体,即使您之前已获取与不同引用属性关联的同一实体。这涉及到一个数据存储get操作,它没有查询那么昂贵,但如果可以的话,仍然值得避免

    有一个很好的模块可以添加可用实体的无缝缓存。它在较低级别的数据存储中工作,并将缓存所有数据存储获取,而不仅仅是取消引用ReferenceProperty

    如果要同时解析一组引用属性,还有另一种方法:可以在一次往返中检索所有键并获取实体,如下所示:

    keys = [MyModel.ref.get_value_for_datastore(x) for x in referers]
    referees = db.get(keys)
    

    最后,我编写了一个库,monkeypatches将db模块按请求本地缓存实体(不涉及memcache)。它是可用的。不过,有一个警告:它有单元测试,但没有广泛使用,因此可能会被破坏。

    谢谢。我知道memcache,但我不确定在通过引用调用另一个实体时如何“注入它”。双重检查:在任何情况下,memcache都没有用,因为我需要在执行中进行缓存,而不是在执行之间进行缓存。使用memcache无助于优化此调用(它会使调用变得更慢):(事实上,memcache获取所需的时间比数据存储获取所需的时间短-因此它仍然会有所帮助。我知道,第一次调用model1.reference时,它将加载引用,然后再加载。我的问题是,当我调用model2.reference时-如果两个引用都指向同一个实体,应用程序引擎是否会捕获并在继续之前停止g再次访问数据存储?我检查了模块,似乎它有memcache部分。但是memcache对于暴露的情况没有用处:(.无论如何,感谢您的参考,这将是有用的。不,App Engine将进行第二次往返。缓存库将把它转换为memcache往返,这是一个改进-但它肯定也可以使用增强功能在每个请求的基础上进行本地缓存。我已经编写了这样一个库-我将更新我的答案。该库看起来很危险非常吸引人。自从1月5日以来,你没有发现任何bug吗?(谢谢!)很抱歉,我自己也没有广泛使用过它。