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