App Engine - 当模型具有ReferenceProperties时使用memcache

时间:2012-07-03 21:20:06

标签: python google-app-engine memcached

在我的App Engine应用程序中(在Python 2.7中,线程安全)我希望能够显示有关ChildModel类型的所有实体的信息。我想我已经有了memcache,但是因为ChildModel有一个连接到ParentModel的属性,所以有些事情我不明白。

我目前有以下型号:

class ParentModel(db.Model):
  name = db.StringProperty()
  # currently 109 of these

class ChildModel(db.Model):
  name = db.StringProperty()
  parent_program = db.ReferenceProperty(ParentModel)
  # currently 758 of these

我使用the example from Nick Johnson's blog实现了memcache。

class AllEntities(webapp2.RequestHandler):
  def get(self):
    entitylist = deserialize_entities(memcache.get("entitylist"))
    if not entitylist:
      entitylist = ChildModel.all().fetch(None)
      memcache.set("entitylist", serialize_entities(entitylist))
    totalnum = ChildModel.all().count()

我第一次运行此程序时,我在appstats中看到以下内容:

datastore_v3.Get        758
datastore_v3.RunQuery   3
datastore_v3.Next       2
memcache.Get        1
memcache.Set        1

之后,我在appstats中看到以下内容:

datastore_v3.Get        758
datastore_v3.RunQuery   2
memcache.Get            1

根据内存缓存大小(1304599字节),看起来memcache设置正确。但是我无法弄清楚如何停止758 datastore_v3.Get的速度非常慢,并且在数据存储区小型操作和数据存储区读取操作的配额上也让我失望。

有人可以帮我弄清楚我做错了吗?

2 个答案:

答案 0 :(得分:2)

你没有做错什么,count()是什么做758获取并且花费你小的操作配额。

由于您已将所有模型从memcache加载到列表中,因此您只需调用len(entitylist)即可获得实体数量。


在设置记忆卡as describe in Nick's blog中的值之前,请尝试拨打prefetch_refprops(entitylist, ChildModel.parent_program)

答案 1 :(得分:2)

我会检查你的deserialize_entity函数。如果它拉入所有子实体(引用属性),那么它将一次执行一个(因此获得很多)。

如果您希望引用的实体使用批量获取预取它们 - 请查看Nick Johnsons prefetch_refprop博客文章。

或修改deserialize_entities,以便在您不需要时获取参考属性