Назад | Перейти на главную страницу

Добавить vs Установить в Memcached

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

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

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

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

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

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

  1. Возможность состояние гонки с "установить", а не с "добавить". См. Ссылку ниже на ответ Ника Джонсона: https://stackoverflow.com/questions/13234556/using-memcache-add-instead-of-set

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


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