理论上,我想在我的用户模型中拥有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计数器吗?
答案 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计数器可以消失。
计数器在分布式系统中很难做到。通常最容易重新考虑应用程序,以便它可以不用。
如何使用时间戳代替?您也可以按(和页面)排序,它将生成与计数器相同的顺序。