GAE — сохранение операций чтения хранилища данных

если у меня есть 2 "Таблицы",

"Table Player" , (Поля - PlayerKey, PlayerName, PlayerUrlPhoto) "Table PlayerGames", (Поля - PlayerGameKey, PlayerKey, GameDate)

если я хочу перечислить все игры, я создам запрос в «PlayerGames», и чтобы показать информацию «Игроки», мне нужно будет «GetObjectbyID», чтобы прочитать PlayerName и PLayerUrlPhoto.

Как лучше всего это сделать?

1 - Использование GetObjectByID является правильным способом (затрачивая на 1 "чтение хранилища данных" больше для каждой записи "PlayerGame") 2 - Сохранять в "PlayerGames" поля, которые, как я знаю, мне нужно будет перечислить в будущем? (как имя игрока и фото игрока, сохранение «DataStore read» для получения информации об игроке) 3 - Другой способ...

  • напоминаю, что игрок может изменить свое имя и фотографию, поэтому, если я сохраню имя и фотографию в «PlayerGames», мне также придется обновить все записи. (и потратит много операций записи DataStore)

Может ли кто-нибудь дать мне совет по этому поводу?

Спасибо


person LeandroRezende    schedule 31.01.2012    source источник


Ответы (2)


Похоже, вам просто нужно использовать memcache перед вашими сущностями. Когда вы получаете объекты Player по ключу, сначала проверьте кэш памяти, используя ключ, который вы вычисляете из ключа хранилища данных, и, если там есть значение, используйте его. В противном случае выполните чтение хранилища данных, а затем сохраните результат в кэше памяти для использования в будущем. Это значительно сократит количество операций чтения хранилища данных.

Когда игрок обновляет свою запись, просто удалите значение кэша памяти после обновления записи хранилища данных. Это заставляет следующее чтение перейти в хранилище данных и обновить кэш.

person Dan Sanderson    schedule 31.01.2012
comment
Спасибо, Дэн, я так и думал, мне просто нужно было, чтобы кто-то подтвердил, что MemCache может решить мою проблему =) - person LeandroRezende; 01.02.2012

Я заменяю «GetObjectByID» на «returnmemcache».

Я сделал простую функцию следующим образом:

public Object returnmemcache(Class class,Key key)
{
     Cache cache = null;
     Object returntemp = null;
     try {
        CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
        cache = cacheFactory.createCache(Collections.emptyMap());
        returntemp = cache.get(key);
        if (returntemp==null)
        {   
            PersistenceManager pm = PMF.get().getPersistenceManager();
            returntemp=pm.getObjectById(class,key);
                    pm.close();
            cache.put(key, returntemp);
        }
    } catch (CacheException e) {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        returntemp=pm.getObjectById(class.getClass(),key);
            pm.close();
    }
    return returntemp;
}

У кого-нибудь есть лучший код?

person LeandroRezende    schedule 02.02.2012