Добавить против Set в Memcached

17

Я не понимаю разницу между ADD и SET. Есть какие-нибудь подсказки? Кажется, будто ADD включает SET или ADD возвращает false, если что-то есть, и SET просто перезаписывает. Благодарность!

РЕДАКТИРОВАТЬ: Мой конкретный вопрос: «Когда вы используете добавить, а не установить или установить, а не добавить?»

user851171
источник

Ответы:

22

Вы уже в значительной степени получили ответ на свой первый вопрос: цель ADDсостоит в том, чтобы работать только тогда, когда ключ еще не существует, и SETдолжен обновлять значение независимо от того, существует ли оно уже. Если вы знакомы с SQL, это (примерно) похоже на разницу между INSERTquery ( ADD) и UPDATE( SET).

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

Пример, который приходит на ум, когда ADDэто будет уместно, - это сохранение сеансов в memcache (что, кстати, я не рекомендую) - если вы генерируете свои идентификаторы сеансов случайным образом (или с помощью хеширования), вы не захотите создать новый сеанс с тем же ключом, что и существующий, поскольку это предоставит одному пользователю доступ к данным другого пользователя. В этом случае, когда вы создали сеанс, который вы будете использовать ADD, и если он вернул статус ошибки, вам нужно будет сгенерировать новый идентификатор сеанса и повторить попытку. Обновление сеанса, разумеется, будет использоваться, SETкогда пользователь будет работать с вашим приложением.

romble
источник
1
Я мог бы немного придираться, но по сравнению с SQL, если «add» сравнивается с INSERT, «set» будет сравниваться с REPLACE, а не с UPDATE.
Маттео
2
Отсюда и использование слова «грубо». Если вы хотите стать действительно придирчивым, REPLACEдаже не SQL ... это «язык, слабо вдохновленный SQL, который понимает MySQL» (ухмылка)
womble
3

В дополнение к ответу выше с идентификатором пользователя 'womble', пожалуйста, учтите также следующие моменты:

  1. Возможность состояния гонки с «сетом», а не с «дополнением». Ниже приведена ссылка на ответ Ника Джонсона: /programming/13234556/using-memcache-add-instead-of-set

  2. Если вы знаете, что «add» подойдет, не используйте «set». Это сделано для того, чтобы избежать отправки данных по сети, поскольку это вызовы RPC . И практически все время потребляется сетевым трафиком, в отличие от поиска пары ключ-значение в memcache. Так что, если вы можете избежать сетевого трафика, который лучше всего, так как в этом случае ваше время отклика будет быстрее.


См. Appstats ( https://developers.google.com/appengine/docs/python/tools/appstats (от Google)) и, чтобы понять пункт № 2 выше, ознакомьтесь с http://www.youtube.com/watch ? v = bvp7CuBWVgA от Гвидо Ван Россума (@Google)

DEV-VB
источник