2011-02-04 2 views
4

В приложении appengine python у меня есть счетчики, которые подсчитывают количество favs для фотографии и количество просмотров.Обновление объекта из закрытого счетчика - Python

У меня есть фото и счетчики. Чтобы заказывать фотографии по популярности (# из favs), я должен иметь # favs, хранящийся в моих объектах Photo (Photo.all(). Order ('num_favs')). Поскольку я отслеживаю количество favs в закрытом счетчике, мне интересно, какой самый эффективный способ обновить мои объекты Yahoo с последним номером favs из модели 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 со своими счетчиками?

Спасибо!

ответ

9

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

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

+1 Если вы не ожидаете большой популярности трафика, вы, вероятно, можете уйти с первым вариантом, просто сохранив свойство 'num_favorites' на объекте. –

+1

@ Джейсон, я не знаю. Я столкнулся с конфликтом на обычном счетчике, даже контролируя обновления с ограниченным сроком выполнения 1/с. – systempuntoout

+0

@systempuntoout Сколько раз? Ожидается некоторый низкий уровень повторных попыток. И каков размер вашего ведра в очереди задач? –

Смежные вопросы