Вы уже в значительной степени получили ответ на свой первый вопрос: цель ADD
состоит в том, чтобы работать только тогда, когда ключ еще не существует, и SET
должен обновлять значение независимо от того, существует ли оно уже. Если вы знакомы с SQL, это (примерно) похоже на разницу между INSERT
query ( ADD
) и UPDATE
( SET
).
Что касается вашего дополнительного вопроса, вы должны использовать тот, который соответствует вашим целям. Я бы сказал, что SET
это будет более распространенная операция, потому что чаще всего вы просто хотите сказать: «Я хочу, чтобы ключ foo
имел значение bar
, и мне все равно, был ли он там уже». Однако бывают (реже) случаи, когда необходимо знать, что ключ еще не находится в кеше.
Пример, который приходит на ум, когда ADD
это будет уместно, - это сохранение сеансов в memcache (что, кстати, я не рекомендую) - если вы генерируете свои идентификаторы сеансов случайным образом (или с помощью хеширования), вы не захотите создать новый сеанс с тем же ключом, что и существующий, поскольку это предоставит одному пользователю доступ к данным другого пользователя. В этом случае, когда вы создали сеанс, который вы будете использовать ADD
, и если он вернул статус ошибки, вам нужно будет сгенерировать новый идентификатор сеанса и повторить попытку. Обновление сеанса, разумеется, будет использоваться, SET
когда пользователь будет работать с вашим приложением.
REPLACE
даже не SQL ... это «язык, слабо вдохновленный SQL, который понимает MySQL» (ухмылка)В дополнение к ответу выше с идентификатором пользователя 'womble', пожалуйста, учтите также следующие моменты:
Возможность состояния гонки с «сетом», а не с «дополнением». Ниже приведена ссылка на ответ Ника Джонсона: /programming/13234556/using-memcache-add-instead-of-set
Если вы знаете, что «add» подойдет, не используйте «set». Это сделано для того, чтобы избежать отправки данных по сети, поскольку это вызовы RPC . И практически все время потребляется сетевым трафиком, в отличие от поиска пары ключ-значение в memcache. Так что, если вы можете избежать сетевого трафика, который лучше всего, так как в этом случае ваше время отклика будет быстрее.
См. Appstats ( https://developers.google.com/appengine/docs/python/tools/appstats (от Google)) и, чтобы понять пункт № 2 выше, ознакомьтесь с http://www.youtube.com/watch ? v = bvp7CuBWVgA от Гвидо Ван Россума (@Google)
источник