Ви вже майже отримали відповідь на своє перше запитання: намір ADDпрацюватиме лише тоді, коли ключ ще не існує, в той час як SETє оновлення значення, незалежно від того, чи воно вже існує. Якщо ви знайомі з SQL, це (приблизно) схоже на різницю між INSERTзапитами ( ADD) і UPDATE( SET).
Що стосується Вашого додаткового питання, Ви б використовували те, що відповідає Вашій меті. Я б сказав, що це SETбуло б більш звичайною операцією, тому що більш часто зустрічається, що ви просто хочете сказати "Я хочу, щоб ключ fooмав значення bar, і мені байдуже, чи він там уже був". Однак трапляться (рідше) випадки, коли потрібно знати, що ключ ще не знаходиться в кеші.
Приклад, який спадає на думку, коли ADDбуло б доречно, - це зберігання сеансів у пам’яті (що, до речі, я не рекомендую) - якщо ви генеруєте ідентифікатори сеансів випадковим чином (або за допомогою хешування), ви б не хотіли створити новий сеанс тим самим ключем, що і існуючий, оскільки це дозволить одному користувачеві отримати доступ до даних іншого користувача. У цьому випадку, коли ви створили сеанс, який ви б використовували ADD, і якщо він повернув статус відмови, вам потрібно буде створити новий ідентифікатор сеансу та спробувати ще раз. Оновлення сеансу, звичайно, потім використовуватиметься, SETколи користувач пропрацював ваш додаток.