Google App Engine GQL查询问题

时间:2010-01-08 00:00:12

标签: google-app-engine

理论上,我想在我的用户模型中拥有100,000个实体:

我想实现一个ID属性,该属性随着每个新实体的增加而递增。

目标是让我可以进行“获取ID为200到300的用户”之类的查询。有点像将10000个实体分成1000个可读页面,每个页面包含100个实体。

我听说App Engine的ID属性并不能保证它会逐渐增加。

那么如何实现自己的递增ID?

我的一个想法是使用memcache。在memcache中添加一个计数器,每次插入新实体时都会增加。

class User(db.Model):
  nickname = db.StringProperty()
  my_id = db.IntegerProperty()


# Steps to add a new user entity:
# Step 1: check memcache
counter = memcache.get("global_counter")

# Step 2: increment counter
counter = counter + 1

# Step 3: add user entity
User(nickname="tommy",my_id=counter).put()

# Step 4: replace incremented counter
memcache.replace(key="global_counter",value=counter)

# todo: create a cron job which periodically takes the memcached global_counter and
# store it into the datastore as a backup ( in case memcache gets flushed )
你觉得怎么样?

附加问题:如果10个用户同时注册,它会搞乱memcache计数器吗?

2 个答案:

答案 0 :(得分:4)

您无需实施自己的自动递增计数器来实现您正在寻找的分页 - 请查看“Paging without a property

简而言之,key保证以确定的顺序返回,您可以使用不等运算符(>=<=)从特定键开始返回结果。

获得前100位用户:

users = User.all().order("__key__").fetch(101)

前100个结果是你迭代的结果;第101个结果,如果它被返回,将在下一个查询中用作书签 - 只需在上面的查询中添加.filter('__key__ >=', bookmark),您就可以获得结果200-301

答案 1 :(得分:0)

memcache计数器可以消失。

计数器在分布式系统中很难做到。通常最容易重新考虑应用程序,以便它可以不用。

如何使用时间戳代替?您也可以按(和页面)排序,它将生成与计数器相同的顺序。