Jeśli twoje rozwiązanie to ajax-y, możesz utrzymywać kursor (jako ciąg) w tablicy po stronie klienta w javascript, więc nie musisz zapisywać go w memcache.
Po dodaniu danych (lub usunięciu/zmianie) stare kursory nie zostaną unieważnione. Nadal możesz z nich korzystać. W twoim przypadku stanowią one po prostu pierwszy element na stronie. Jedyne co może się zdarzyć, to jeśli jesteś na stronie 3 wyników i nawigujesz wstecz, a następnie do przodu, możesz nie zobaczyć dokładnie tych samych obiektów, co wcześniej na stronie 3.
Na przykład, jeśli poszedłeś ze strony 2 na stronie 3:
- strony 2 (kursor = x2) wyniki: [d, e, f, ..., g]
- strona 3 (kursor = x3) wyniki: [H, I, J , ...]
Następnie, jeśli "e" zostało usunięte. Przechodząc do tyłu, strona 2 (kursor = x2) pokaże teraz [d, f, ..., g, h], a my zmienimy kursor x3, ponieważ się zmienił (sprawdzamy go po każdym pobraniu() dla strony 2). Idąc dalej, strona 3 będzie teraz miała [i, j, ...]
Podobnie, jeśli zamiast tego "e2" zostanie dodane po "e", wracając do strony 2, będziemy mieli [d, e, e2, f, ...] i x3 zostaje zaktualizowany. I dalej, strona 3 będzie zawierała [g, h, i, j, ...]
Jedyne zastrzeżenie to pierwsza strona nie powinna nigdy używać kursora (w przypadku, gdy elementy zostaną dodane przed pierwszym), oraz powinieneś zawsze pozwolić użytkownikowi "spróbować", aby przejść do następnej strony, na wypadek gdyby elementy zostały dodane po ostatnim wyniku.
Tak więc numery stron nie będą zbyt szczegółowe, ale tak naprawdę nie mogą być w przypadku danych stronicowanych, które można zaktualizować. Jedna z nich polega na tym, aby nie używać numerów stron, ale oznaczać strony jako "dane zaczynające się od elementu x" lub coś w tym stylu.
Nie znam żadnych implementacji, ale powinna być ona dość prosta w realizacji. Funkcjonalność kursora jest dość dobrze opisana w dokumentach: http://code.google.com/appengine/docs/java/datastore/queries.html#Query_Cursors