#asp.net-core #stackexchange.redis #azure-redis-cache
#asp.net-core #stackexchange.redis #azure-redis-cache
Вопрос:
У меня есть метод, который принимает входные данные в виде списка и сохраняет каждый элемент в кэше Azure Redis.
public async Task<bool> StoreAsBatch<T>(T data)
{
var storeData = new List<Task<bool>>();
try
{
foreach (var each in data as List<EmpUser>)
{
storeData.Add(Store(each.UserId, each));
}
await Task.WhenAll(storeData).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.LogError($"StoreAsBatch failed with an exception - {ex.Message} ");
return false;
}
return true;
}
Вот метод хранения
public async Task<bool> Store<T>(string key, T value)
{
if (string.IsNullOrEmpty(key))
throw new ArgumentException(nameof(key));
key = $"emp_user_{key}";
string val = JsonConvert.SerializeObject(value);
return await _database.StringSetAsync(key, JsonConvert.SerializeObject(value), new TimeSpan(30, 0, 0, 0,0));
}
Когда я передаю список (размер списка: 1 тыс. записей) в указанный выше метод StoreAsBatch. Я получаю исключение, подобное этому
Ошибка
Timeout awaiting response (outbound=0KiB, inbound=0KiB, 7625ms elapsed, timeout is 5000ms), command=SETEX, next: SETEX emp_user_00mb1, inst: 0, qu: 0, qs: 1, aw: True, rs: DequeueResult, ws: Writing, in: 0, serverEndpoint: mrcooper-originations-boss-dev.redis.cache.windows.net:6380, mc: 1/1/0, mgr: 9 of 10 available, clientName: WIN10H-DLPIH45D, IOCP: (Busy=0,Free=1000,Min=8,Max=1000), WORKER: (Busy=2,Free=32765,Min=8,Max=32767), v: 2.1.58.34321 (Please take a look at this article for some common client-side issues that can cause timeout)
Я новичок в кэше Azure Redis. Пожалуйста, помогите мне устранить ошибку.
Заранее спасибо.
Комментарии:
1. Ошибка сообщает вам, что происходит. Вы пытаетесь записать 1 тыс. элементов, на это вашему приложению требуется 7,6 секунды, и вы настроили Redis на тайм-аут через 5 секунд. Либо увеличьте пороговое значение времени ожидания, либо не сохраняйте JSON с 1k элементами в нем
2. @CamiloTerevinto, где я могу увеличить время ожидания. Не могли бы вы мне помочь. это должно быть сделано со стороны кода?
3. Документация — ваш друг: stackexchange.github.io/StackExchange . Redis / Конфигурация
Ответ №1:
На основе предложений @CamiloTervinto и ссылки на эту документацию по конфигурации Redis.
Я могу устранить свою ошибку, увеличив пороговое время для асинхронных вызовов при настройке кэша redis.
Вот ссылочный код.
Способ 1
public void SetUpCacheManager()
{
try
{
_lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
string connectionString = _config.AzureRedis.HostName _config.AzureRedis.Password _config.AzureRedis.Ssl;
var redisConfig = ConfigurationOptions.Parse(connectionString);
redisConfig.AsyncTimeout = 15000;
return ConnectionMultiplexer.Connect(redisConfig);
});
_database = Connection.GetDatabase();
}
catch(Exception e)
{
_logger.LogError($"(SetUpCacheManager): Exception in Connecting to Cache, Message: {e.Message}");
}
}
Способ 2
public async Task<bool> StoreAsBatch(List<EncompassUser> data)
{
Parallel.ForEach(data, new ParallelOptions{MaxDegreeOfParallelism = 10 }, (obj) =>
{
try
{
Store(obj.UserId, obj);
}
catch (Exception ex)
{
_logger.LogError($"StoreAsBatch failed with an exception - {ex.Message} ");
}
});
return true;
}