Обновление сущности из закрытого счетчика - Python - PullRequest
4 голосов
/ 04 февраля 2011

В моем приложении python для appengine у ​​меня есть счетчики, которые подсчитывают количество фаворитов для фотографии и количество просмотров.

У меня есть фото и счетчик моделей.Чтобы упорядочить фотографии по популярности (количество фаворитов), я должен иметь количество фаворитов, хранящихся в моих сущностях Фото (Photo.all (). Order ('num_favs')).Так как я отслеживаю количество фаворитов в заштрихованном счетчике, мне интересно, каков наиболее эффективный способ обновить мои объекты Photo с последним количеством фаворитов из модели Counter?

Вот реферато том, как выглядят мои модели:

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 Ответ

9 голосов
/ 04 февраля 2011

Если вам нужно отсортировать или отфильтровать по значению, вы, вероятно, не должны использовать счетчик с осколками, а вместо этого использовать одну из альтернатив.Короче говоря, они:

  1. Просто используйте обычный счетчик.Если вы не ожидаете, что скорость обновлений будет превышать 1-5QPS в течение длительных периодов (короткие скачки в порядке), то это должно работать нормально.
  2. Поместите задачу в очередь задач, когда пользователь удаляет или удаляетвыбрал фотографию.Убедитесь, что очередь задач имеет ограниченную скорость выполнения для ограничения конкуренции.
  3. Используйте один из шаблонов счетчиков с потерями, но без конкуренции, например этот .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...