从分片计数器更新实体 - Python

时间:2011-02-04 01:12:33

标签: python google-app-engine

在我的appengine python应用程序中,我有分片计数器,用于计算照片的最爱数量和视图数量。

我有照片和计数器型号。要按受欢迎程度(最喜欢的数量)订购照片,我应该在我的照片实体(Photo.all()。order('num_favs'))中存储最喜欢的#。 由于我正在跟踪分片计数器中的fav的数量,我想知道用Counter模型中最新的#fores来更新我的Photo实体的最有效方法是什么?

以下是我的模型的摘要:

class Photo(db.Model):
  photo = db.BlobProperty() 
  favs = db.IntegerProperty() #num of favs

class Counter(db.Model):
  #key_name = key to a model that's to be counted - Photo in this case
  name =  db.StringProperty() #counted entity key
  count = db.IntegerProperty() #count
  type = db.StringProperty() #type of model to count, "Photo" in this example

#Very unefficient way of updating my Photo entities with the latest count from Counter:

fav_counters = Counter.all().filter('type =', 'Photo')

for fav in fav_counters:
  photo_fav = db.get(fav.name) #get the photo for which the fav count is for
  photo_fav.favs = fav.count
  photo_fav.put()

如果我能回答以下问题,我将不胜感激: 1)根据计数器订购实体的最有效方法 2)如果我按照他们的计数器订购实体的逻辑是正确的 - 用他们的计数器更新Photo实体的最有效方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:9)

如果您需要根据值进行排序或过滤,则可能不应使用分片计数器,而应使用其中一种替代方法。简而言之,它们是:

  1. 只需使用普通计数器即可。如果您不希望更新速率超过1-5QPS(短暂的峰值可以),那么这应该可以正常工作。
  2. 当用户收藏或取消收藏照片时,将任务放入任务队列。确保任务队列的执行率有限,以限制争用。
  3. 使用其中一种有损但无争用的计数器模式,例如this one