Код: Выделить всё
"READONLY You can't write against a read only replica"
< /code>
Если я правильно понимаю, это потому, что соединение кэшируется клиентом Redis (в коде Microsoft.extensions.caching.stackexchangeredis). < /p>
setAsync метод вызывает метод onrediserror в случае ошибки: < /p>
...
catch (Exception ex)
{
OnRedisError(ex, cache);
throw;
}
...
< /code>
В методе onrediserror кэшированное соединение может быть обнаружено.private void OnRedisError(Exception exception, IDatabase cache)
{
if (_options.UseForceReconnect && (exception is RedisConnectionException or SocketException))
{
...
// wipe the shared field, but *only* if it is still the cache we were
// thinking about (once it is null, the next caller will reconnect)
var tmp = Interlocked.CompareExchange(ref _cache, null, cache);
...
}
}
< /code>
и Finilly, UseForCerConnect-< /p>
private bool? _useForceReconnect;
internal bool UseForceReconnect
{
get
{
return _useForceReconnect ??= GetDefaultValue();
static bool GetDefaultValue() =>
AppContext.TryGetSwitch("Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect", out var value) && value;
}
set => _useForceReconnect = value;
}
Also it is written here: https://learn.microsoft.com/en-us/azure ... guidance-1
The Клиент StackexChange Redis управляет своими собственными повторными поисками, но только при установлении соединения с кэшем, когда приложение впервые начинает . Вы можете настроить тайм -аут подключения, количество попыток повторения и время между повторными поисками для установления этого соединения, но политика повторного повторного периода не применяется к операциям против кэша. Могу ли я просто включить это или это плохая идея? < /P>
Есть ли другой способ воссоздать соединение в случае ошибки? https://github.com/dotnet/aspnetcore/bl ... he.cs#l275
Подробнее здесь: https://stackoverflow.com/questions/794 ... async-meth