合并缓存的GQL查询而不是在中使用

2024-04-19 07:44:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在生成一个feed,它合并了许多用户的评论,所以你的feed可能是user1+user2+user1000的评论,而我的可能是user1+user2。所以我有一句话:

some_comments = Comment.gql("WHERE username IN :1",user_list)

我不能把所有的东西都放到memcache中,因为每个人都有不同的feed,即使user1和user2的feed对于很多观众来说是通用的。根据the documentation

...the IN operator executes a separate underlying datastore query for every item in the list. The entities returned are a result of the cross-product of all the underlying datastore queries and are de-duplicated. A maximum of 30 datastore queries are allowed for any single GQL query.

是否有一个库函数来合并一些排序和缓存的查询,或者我必须:

^{2}$

(在最坏的情况下(没有缓存任何内容),我希望发送30个GQL查询比一个巨型查询慢。)


Tags: oftheinforfeed评论queryare
2条回答

这里没有内置的功能,但是您可以自己做,但有一个警告:如果您执行一个in查询并返回30个结果,那么这些记录将是根据您在所有子查询中的排序标准排序最低的30条记录。但是,如果您想从缓存的单个查询中组合resultset,那么要么必须为每个用户缓存与总结果集相同数量的结果(例如,30个),然后丢弃大部分结果;要么必须为每个用户存储更少的结果,并接受有时会丢弃来自一个用户的较新结果对另一个人的旧结果的偏爱。在

也就是说,你可以这样做:

  1. 执行memcache.get_multi以检索所有用户的缓存结果集
  2. 对于没有缓存结果集的每个用户,执行单个查询,获取所需的大多数结果。使用memcache.set_multi缓存结果集。在
  3. 对所有结果集执行合并联接,并将前n个结果作为最终结果集。因为用户名可能不是一个列表字段(例如,每个评论都有一个作者),所以不需要担心重复。在

目前,in查询是串行执行的,因此这种方法不会比执行in查询慢,即使没有缓存任何结果。不过,这种情况将来可能会改变。如果您现在想提高性能,您可能需要使用Guido的NDB项目,该项目允许您并行执行所有子查询。在

您可以使用memcache.get_multi()查看memcache中已经有哪些用户的提要。然后在原始用户列表和memcache中找到的用户列表上使用set().difference()来找出没有检索到的用户列表。最后在批处理get中从数据存储中获取丢失的用户提要。在

从那里你可以合并两个列表,如果不是太长,在内存中对它进行排序。如果你在做某件事,你可以把分类工作交给客户。在

相关问题 更多 >