我正在尝试使用memcache来提高性能
这是我的模特:
class ABC(db.Model):
some_property = db.StringProperty()
# more properties
class XYZ(db.Model):
another_property = db.StringProperty()
abc = db.ReferenceProperty(ABC,collection_name="xyzs")
# more properties
我只有两个ABC实体和800个XYZ实体 因此,该应用程序的一个功能是为所有XYZ提供excel表。 excel表有两列 第一列是“another_property”,第二列是“some_property”(来自ABC参考)。
xyzs = XYZ.all()
for xyz in xyzs:
logging.info(xyz.another_property)
logging.info(xyz.abc.some_property)
通过这种方法,xyz.abc.some_property
每次都会进行数据存储调用
看到这个我决定使用memcache将abc引用存储在内存中 在使用memcache的情况下,我没有看到响应时间有任何重大变化。
abcId = XYZ.abc.get_value_for_datastore(xyz).id()
#Get ABC reference from memcache if present else bring it from datastore and add it to memcahce.
可以取悦某人为什么我没有看到任何性能提升?
答案 0 :(得分:0)
我试图为每个XYZ实体做一个get memcache。
我通过批量获取memcache来解决它https://developers.google.com/appengine/docs/python/memcache/clientclass#Client_get_multi
伪代码:
abcIds = [str(XYZ.abc.get_value_for_datastore(xyz).id() for xyz in xyzs]
abcs = memcache.get_multi(abcIds) #This gives me a dictionary of id as key and ABC reference property as value
以下是我的应用的改进版本的快照。
发布它可能对其他人有帮助。
PS:我有一种感觉,这也可以改善。帮助我改进答案。
答案 1 :(得分:0)
正如您可能会注意到的,如果您开始考虑使用ndb。
现在我的回答是,您应该使用预取引用属性方法,这样可以提高效率,请参阅nick johnson撰写http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine
它基本上收集引用属性中的所有键,然后对所有实体进行单次获取。您可能会发现它与memcache一样好,如果实体从memcache中被驱逐(将会发生),您将获得所有数据。