Вы уже в значительной степени получили ответ на свой первый вопрос: цель ADD
состоит в том, чтобы работать только тогда, когда ключ еще не существует, и SET
должен обновлять значение независимо от того, существует ли оно уже. Если вы знакомы с SQL, это (примерно) похоже на разницу между INSERT
query ( ADD
) и UPDATE
( SET
).
Что касается вашего дополнительного вопроса, вы должны использовать тот, который соответствует вашим целям. Я бы сказал, что SET
это будет более распространенная операция, потому что чаще всего вы просто хотите сказать: «Я хочу, чтобы ключ foo
имел значение bar
, и мне все равно, был ли он там уже». Однако бывают (реже) случаи, когда необходимо знать, что ключ еще не находится в кеше.
Пример, который приходит на ум, когда ADD
это будет уместно, - это сохранение сеансов в memcache (что, кстати, я не рекомендую) - если вы генерируете свои идентификаторы сеансов случайным образом (или с помощью хеширования), вы не захотите создать новый сеанс с тем же ключом, что и существующий, поскольку это предоставит одному пользователю доступ к данным другого пользователя. В этом случае, когда вы создали сеанс, который вы будете использовать ADD
, и если он вернул статус ошибки, вам нужно будет сгенерировать новый идентификатор сеанса и повторить попытку. Обновление сеанса, разумеется, будет использоваться, SET
когда пользователь будет работать с вашим приложением.