Вопрос по GQL для Google App Engine - PullRequest
2 голосов
/ 08 января 2010

теоретически, я хочу, чтобы в моей модели User было 100 000 объектов:

Я бы хотел реализовать свойство ID, которое увеличивается с каждым новым объектом.

Цель состоит в том, чтобы я мог выполнять запросы типа «получить пользователя с идентификаторами от 200 до 300». Вроде как разделение 10000 сущностей на 1000 читаемых страниц по 100 сущностей каждая.

Я слышал, что свойство ID из App Engine не гарантирует, что оно будет увеличиваться постепенно.

Так как мне реализовать свой собственный инкрементный идентификатор?

Одна из моих идей - использовать 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 ]

4 голосов
/ 08 января 2010

Вам не нужно реализовывать собственный счетчик с автоинкрементом для достижения нумерации страниц, которую вы ищете - посмотрите " Пейджинг без свойства "

Короче говоря, key гарантированно будет возвращено в детерминированном порядке, и вы можете использовать операторы неравенства (>=, <=) для возврата результатов, начиная с определенного ключа.

Чтобы получить первую сотню пользователей:

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

Первые 100 результатов - это то, что вы повторяете; 101-й результат, если он возвращается, используется в качестве закладки в следующем запросе - просто добавьте .filter('__key__ >=', bookmark) к вышеуказанному запросу, и вы получите результаты 200-301

0 голосов
/ 08 января 2010

Счетчик memcache может исчезнуть.

Счетчики сложно сделать в распределенной системе. Часто проще всего переосмыслить приложение, чтобы оно могло обходиться без него.

Как насчет использования метки времени? Вы также можете отсортировать (и страницу) по этому, он сгенерирует тот же порядок, что и счетчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...