0

我正在尝试使用 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每次都进行数据存储调用
参考属性进行 datstore 查询

RPC 调用

看到这一点,我决定使用 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.

内存缓存

内存缓存 RPC

可以请某人为什么我没有看到任何性能提升?

4

2 回答 2

0

您可能会注意到,如果您刚开始考虑使用 ndb。

现在回答我的问题,您应该使用更有效的预取引用属性方法,请参阅 nick johnson http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine撰写的文章

它基本上收集了引用属性中的所有键,然后对所有实体进行一次获取。您可能会发现它的性能与 memcache 一样好,此外,如果实体从 memcache 中被逐出(这将发生),您将获得所有数据。

于 2013-04-21T00:11:49.013 回答
0

我试图为每个 XYZ 实体做一个 get 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:我感觉这也可以改进。帮助我改进答案。

于 2013-04-20T22:26:28.040 回答