Как сравнить AndSet работает внутри Redis

Я никогда не понимал, почему документация Mongoose так широко рекомендует отключать autoIndex в производстве. После добавления индекса последующие вызовы ensureIndex будут просто видеть, что индекс уже существует и затем возвращается. Таким образом, это влияет только на производительность при первом создании индекса, и в то время коллекции часто пустые, поэтому создание индекса в любом случае будет быстрым.

Мое предложение оставить autoIndex если у вас нет конкретной ситуации, когда это создает проблемы; например, если вы хотите добавить новый индекс в существующую коллекцию, в которой есть миллионы документов, и вам нужно больше контролировать, когда она создана.

2
задан talex 17 January 2019 в 10:46
поделиться

2 ответа

Операции.watch каким-то образом предотвращают это?

ДА. После просмотра ключа, если ключ был изменен до завершения транзакции, EXEC не будет выполнен. Таким образом, если EXEC успешно, значение гарантированно не изменится другими.

почему для (;;)? Всегда есть одна итерация.

В вашем случае кажется, что бесконечный цикл избыточен.

Однако, если вы хотите реализовать операцию проверки и установки для изменения значения со старым значением, необходим бесконечный цикл. Посмотрите этот пример из redis doc :

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

Поскольку EXEC может завершиться неудачей, вам нужно повторить весь процесс в цикле, пока он не завершится успешно.

0
ответ дан for_stack 17 January 2019 в 10:46
поделиться

Q: Операции. Часы каким-то образом предотвращают это?

ДА.

Цитирование из документации Redis о транзакции :

WATCH используется для обеспечения поведения проверки и установки (CAS) для транзакций Redis.

Наблюдаемые ключи отслеживаются, чтобы обнаружить изменения против них. Если хотя бы один отслеживаемый ключ был изменен перед командой EXEC, вся транзакция прерывается, и EXEC возвращает нулевой ответ, чтобы уведомить, что транзакция не удалась.

Вы можете узнать больше о транзакции Redis из этой документации.

В: зачем (;;)? Всегда есть одна итерация.

Кажется, код, который вы разместили, очень старый. Из кеша Google этого URL я увидел предоставленный вами код, датированный Oct 15th, 2012!

Последние коды выглядят очень по-разному:

0
ответ дан sazzad 17 January 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: