Memcache и возможная последовательность - PullRequest
6 голосов
/ 01 сентября 2011

Я работаю над небольшим проектом, чтобы узнать о Google App Engine, проект на Java и имеет объекты Customer, экземпляры Клиента могут иметь политику. Каждый клиент находится в своей собственной группе сущностей, так что транзакции могут быть использованы для изменить клиента.

На главной странице сайта находится список клиентов, при добавлении нового клиента список клиентов снова отображается.

Поскольку каждый клиент находится в своей собственной группе сущностей, бывают случаи, когда вновь добавленный клиент не появляется в новый список клиентов, обновление списка клиентов через несколько секунд, и клиент появится. Похожая проблема существует при удалении клиентов, вы удаляете клиента, но он появляется в общем списке на несколько секунд. я понимаю что этого следует ожидать в Google App Engine из-за возможной согласованности, которую обеспечивает хранилище данных.

Итак, я попытался обойти эту проблему, используя memcache для хранения клиентов, которые были недавно добавлены или недавно удален. Код, который я использую ниже.

public List<Customer> getCustomers() {
    List<Customer> cachedCustomers = myCache.getCached();
    List<Customer> recentlyDeleted = myCache.getDeleted();
    // Calls the real datastore.
    List<Customer> dbCustomers = customerDao.getCustomerList();
    Set<Customer> allCustomers = new HashSet<Customer>();

    //  Add cached first as these are most the most up todate.
    allCustomers.addAll(cachedCustomers);
    allCustomers.addAll(dbCustomers);
    allCustomers.removeAll(recentlyDeleted);

    List<Customer> allList = new ArrayList<Customer>();
    allList.addAll(allCustomers);
    Collections.sort(allList);        
    return allList;
}

Я спрашиваю здесь, потому что я думаю, что то, как я это делаю, не чувствует «правильный» способ сделать это и хотел бы услышать от тех, кто знает лучшие способы обойти проблемы, которые создает возможная последовательность.

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Что вы делаете, это то, что рекомендует документ .Поэтому я считаю, что это правильный путь.

Кроме того, я сделал поиск в Google и GitHub для библиотеки, которая могла бы справиться с этим для вас, но не смогла найти ее.Так что для этого способа кэширования недавние вставки и удаления кажутся более «правильными», я бы предложил вам написать библиотеку, которая обрабатывает это для любого постоянного класса, который вы хотите.

Для дополнительного я предлагаю прочитать в этом посте , где Икай Лан, инженер по программам для разработчиков Google App Engine, объясняет, как выборки и вставки работают в HR, и как это влияет на производительность по сравнению с хранилищем данных Master / Slave.

0 голосов
/ 22 января 2012

При использовании HRD в 99,9% случаев результаты вашей операции записи должны быть видны в течение нескольких секунд.Таким образом, в типичном веб-приложении, если вы обслуживаете веб-страницу в результате операции, время, необходимое пользователю для выполнения следующей операции, должно быть достаточным для получения записей.

Так что, если вы генерируете результатстраница из живых объектов данных в приложении, вы должны быть в порядке.Вам также будет хорошо, если вы перенаправите пользователя, например, на страницу клиента, где вы читаете клиента по его идентификатору (поскольку это соответствует).

Если вам нужно выполнить запрос, и вам нужны результаты, чтобы отобразиться взапрос, сгенерированный сразу после операции, я думаю, что нет никакого способа обойти ни memcache, ни использование некоторых трюков для записи наличия / отсутствия только что измененных объектов.

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