Я использую StackExchange.Redis с кластером реплик (3 узла), настроенным на использование Sentinel.
Я получаю несколько запросов, пытаясь обновить кеш одними и теми же данными, поэтому, чтобы избежать многократной записи, я использую When.NotExists
в StringSetAsync
. Насколько я понимаю, это предотвратит установку, если ключ уже существует. Я ожидаю, что StringSetAsync
вернет true только в тех случаях, когда набор действительно произошел.
Пример:
var inserted = await connectionMultiplexer.GetDatabase().StringSetAsync("my-key", "my-value", myTimeout, When.NotExists);
if(inserted == false)
{
var keyExists = await connectionMultiplexer.GetDatabase().KeyExistsAsync("my-key");
if(keyExists == false)
{
// I end up here, which I assumed should not happen.
}
}
К моему удивлению, я вижу, что StringSetAsync
возвращает false, даже если ключ еще не существует на основе проверки работоспособности, когда я вручную проверяю наличие ключа.
Примечания. В моей среде используются 2 узла-реплики и один основной. StackExchange.Redis версия: 2.1.58