0

我正在尝试使用memcache来提高性能。
这里是我的模型:
试图提高我的GAE应用程序的性能

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的实体和XYZ
的800个实体因此,应用程序的功能之一就是提供Excel工作表的所有XYZ。 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被制作数据存储区调用的每次
Reference property making datstore query

RPC call

见此情景,我决定使用内存缓存在内存中存储的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. 

Memcache

Memcache RPC

能取悦别人,为什么我没有看到任何性能提升?

回答

0

我试图为每个XYZ实体获取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 

这里是提高了我的应用程序版本的快照。 Improved Memcahce

发布它可能有助于他人。
PS:我有一种感觉,这也可以改善。帮助我改进答案。

0

正如你可能会注意到的,如果你开始考虑使用ndb。

现在我的答案,你应该使用预取参考特性的做法,是很多更高效看到尼克·约翰逊http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine

这基本上聚集在参考物业的所有按键写上去,然后做一个GET的所有实体。你可能会发现它和memcache一样好,再加上如果实体被从memcache中删除(会发生),你会得到所有的数据。

+0

将我的应用程序从db移至ndb,但性能下降。 http://stackoverflow.com/questions/16998450/can-someone-explain-the-difference-between-this-two-ahstats-generated-timeline – Sandeep 2013-06-08 10:19:29