2010-01-08 3 views
2

в теории, я хочу иметь 100000 сущностей в моей модели пользователя:Google App Engine GQL вопрос запрос

Я хотел бы реализовать свойство ID Инкремента с каждым новым лицом быть на место.

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

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

Как я могу реализовать свой собственный инкрементный 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?

+2

Зачем вам требуется, чтобы идентификаторы были последовательными? Как вы будете обрабатывать пользователей, которые хотят удалить свои учетные записи? Разве это не испортит ваш пейджинг? –

+0

thx для ввода – fooyee

ответ

0

Счетчик memcache может уйти.

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

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

+0

с меткой времени, как бы я сделал запрос gql для say: номер пользователя 200 для пользователя 300? все еще любопытное для меня нечеткое. – fooyee

+0

заказать по timestamp + пейджинг (записи 200 ~ 300) – Thilo

+0

Я понимаю порядок по метке, но вторая часть по-прежнему размыта. можете ли вы предоставить фрагмент кода? thx – fooyee

4

Вам не нужно реализовать свой собственный автоинкрементный счетчик для достижения пагинации вы ищете - смотрите на «Paging without a property»

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

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

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

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

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