#google-app-engine #memcached
#google-app-engine #memcached
Вопрос:
put(...)
Метод API GAE memcahe принимает в качестве аргумента (в одной из его перегруженных реализаций) SetPolicy
аргумент. В здесь в Javadocs говорится, что если вы выбрали «ADD_ONLY_IF_NOT_PRESENT» в качестве политики, то это, и я цитирую:
«полезно, чтобы избежать условий гонки».
Мои вопросы:
-
что происходит с истекшим значением, которое было установлено с тем же ключом? Если я добавлю в memcache что-то вроде (ключ = 1, значение = что угодно), то срок действия этой записи истечет, и тогда я попытаюсь добавить (ключ = 1, значение = whatever_2), используя ADD_ONLY_IF_NOT_PRESENT, добавлен ли whatever_2 в кэш или нет?
-
Что это значит «полезно для условий гонки»? Более конкретно, означает ли это, что если я использую
put(...)
сADD_ONLY_IF_NOT_PRESENT
SetPolicy, мне больше не требуется использовать getIdentifiable и putIfUntouched, чтобы избежать условий гонки при одновременном добавлении данных в memcache?
Ответ №1:
-
Если значение истекает, его больше нет в memcache, поэтому RPC установит его.
-
Если вы выполняете get, то выполняйте put только в том случае, если там ничего не было, вы ввели условие гонки, при котором кто-то другой мог поместить данные, пока вы проверяли. Выполнение одной операции позволяет избежать этого.
Комментарии:
1. Спасибо, это очень четкий ответ. Однако я нахожу немного утомительным использовать putIfUntouched и getIdentifiable, поскольку это означает, что я должен локально (в моем текущем экземпляре приложения) хранить все последние объекты, которые я извлек для определенного ключа, чтобы использовать их с помощью метода putIfUntouched…