GAE Поведение кэша памяти put() ADD_ONLY_IF_NOT_PRESENT

#google-app-engine #memcached

#google-app-engine #memcached

Вопрос:

put(...) Метод API GAE memcahe принимает в качестве аргумента (в одной из его перегруженных реализаций) SetPolicy аргумент. В здесь в Javadocs говорится, что если вы выбрали «ADD_ONLY_IF_NOT_PRESENT» в качестве политики, то это, и я цитирую:

«полезно, чтобы избежать условий гонки».

Мои вопросы:

  1. что происходит с истекшим значением, которое было установлено с тем же ключом? Если я добавлю в memcache что-то вроде (ключ = 1, значение = что угодно), то срок действия этой записи истечет, и тогда я попытаюсь добавить (ключ = 1, значение = whatever_2), используя ADD_ONLY_IF_NOT_PRESENT, добавлен ли whatever_2 в кэш или нет?

  2. Что это значит «полезно для условий гонки»? Более конкретно, означает ли это, что если я использую put(...) с ADD_ONLY_IF_NOT_PRESENT SetPolicy, мне больше не требуется использовать getIdentifiable и putIfUntouched, чтобы избежать условий гонки при одновременном добавлении данных в memcache?

Ответ №1:

  1. Если значение истекает, его больше нет в memcache, поэтому RPC установит его.

  2. Если вы выполняете get, то выполняйте put только в том случае, если там ничего не было, вы ввели условие гонки, при котором кто-то другой мог поместить данные, пока вы проверяли. Выполнение одной операции позволяет избежать этого.

Комментарии:

1. Спасибо, это очень четкий ответ. Однако я нахожу немного утомительным использовать putIfUntouched и getIdentifiable, поскольку это означает, что я должен локально (в моем текущем экземпляре приложения) хранить все последние объекты, которые я извлек для определенного ключа, чтобы использовать их с помощью метода putIfUntouched…