微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

合并缓存的GQL查询,而不是使用IN

如何解决合并缓存的GQL查询,而不是使用IN

| 我正在生成合并许多用户评论的提要,因此您的提要可能是user1 + user2 + user1000的评论,而我的可能是user1 + user2。所以我知道了:
some_comments = Comment.gql(\"WHERE username IN :1\",user_list)
我不能只缓存整个内容,因为每个人都有不同的提要,即使user1和user2的提要对于许多查看者来说都是通用的。根据文档:   ... IN运算符执行一个单独的   每个的基础数据存储区查询   列表中的项目。实体   返回是由于   所有底层证券的叉积   数据存储区查询和   重复数据删除。任何情况下最多允许30个数据存储区查询   单个GQL查询。 是否有一个函数来合并一些排序和缓存的查询,或者我将不得不:
for user in user_list
  if memcached(user):
    add it to the results
  else:
    add Comment.gql(\"WHERE username = :1\",user) to the results 
    cache it too
sort the results
(在最坏的情况下(什么都没有缓存),我希望发送30个GQL查询一个巨型IN查询要慢。)     

解决方法

没有内置函数可以执行此操作,但是您可以自己做,但要注意:如果执行If2ѭ查询并返回30个结果,则这30个记录将根据您的排序标准在所有记录中排序最低子查询。不过,如果您要从缓存的单个查询中组合结果集,要么要么必须为每个用户缓存与总结果集一样多的结果(例如30个),然后丢弃其中的大部分结果,要么\您将不得不为每个用户存储更少的结果,并接受有时候您会丢弃一个用户的新结果,而转而使用另一个用户的旧结果。 也就是说,这是您可以执行的操作: 进行“ 3”检索所有用户的缓存结果集 对于没有缓存结果集的每个用户,请执行单个查询,以获取所需的最多结果。使用
memcache.set_multi
缓存结果集。 对所有结果集执行合并联接,并将前n个结果作为最终结果集。因为用户名可能不是列表字段(例如,每个评论都有一个作者),所以您不必担心重复。 当前,
in
查询是串行执行的,因此即使没有任何结果被缓存,这种方法也不会比执行executing2ѭ查询慢。不过,这将来可能会改变。如果您现在想提高性能,则可能要使用Guido的NDB项目,该项目将允许您并行执行所有子查询。     ,您可以使用ѭ7来查看哪些用户的供稿已在内存缓存中。然后,在原始用户列表与内存缓存中找到的用户列表上使用ѭ8,以找出未检索到的用户。然后,最终以批处理方式从数据存储区中获取缺少的用户供稿。 在这里,您可以合并两个列表,如果时间不长,则将其排序在内存中。如果您正在处理Ajaxy,则可以将排序交给客户端。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。