Если ваше решение ajax-y, вы можете сохранить курсор (в виде строки) в массиве на стороне клиента в javascript, поэтому вам не нужно хранить его в memcache.
Когда данные добавляются (или удаляются / изменяются), старые курсоры не становятся недействительными. Вы все еще можете использовать их. В вашем случае они в основном представляют первый элемент на странице. Таким образом, единственное, что может произойти, это если вы находитесь на странице 3 результатов и переходите назад и затем вперед, вы можете не увидеть те же объекты, которые вы делали ранее на странице 3.
Например, если вы перешли со страницы 2 на страницу 3:
- Страница 2 (курсор = x2) результаты: [d, e, f, ..., g]
- Страница 3 (курсор = x3) результаты: [h, i, j, ...]
Тогда, если 'e' было удалено. Если вернуться назад, на странице 2 (курсор = x2) теперь будет отображаться [d, f, ..., g, h], и мы обновляем курсор x3, так как он изменился (мы проверяем его после каждой выборки () для страницы 2). В дальнейшем на странице 3 появятся [i, j, ...]
Точно так же, если вместо 'e2' будет добавлено после 'e', возвращаясь к странице 2, мы получим [d, e, e2, f, ...] и x3 обновятся. И в будущем страница 3 будет содержать [g, h, i, j, ...]
Единственное предостережение: первая страница никогда не должна использовать курсор (в случае, если элементы добавляются до первой), и вы всегда должны разрешать пользователю «пытаться» перейти на следующую страницу, если элементы были добавлены после последнего результата.
Таким образом, номера страниц не будут очень конкретными, но они не могут быть такими, когда речь идет о страницах с данными, которые могут быть обновлены. Одна хитрость заключается в том, чтобы не использовать номера страниц, а пометить страницы как «данные, начинающиеся с элемента x» или что-то в этом роде.
Я не знаю никаких реализаций, но реализация должна быть довольно простой. Функциональность курсора довольно хорошо описана в документации: http://code.google.com/appengine/docs/java/datastore/queries.html#Query_Cursors