public async Task <T[]> LoadListAndAddSetToCache <T>(string setKey, Expression <Func <T, bool> > where, int minutes = int.MinValue, CancellationToken cancellationToken = default) where T : Entity { using (_logger.BeginScope(new Dictionary <string, object> { { "SetKey", setKey }, { "EntityType", typeof(T).Name } })) { var sw = Stopwatch.StartNew(); _logger.LogDebug("LoadListAndAddSetToCache started"); var expiresIn = GetExpiresIn(minutes); try { var tmp = await _entityStore.LoadItemsAsync(where, cancellationToken).ConfigureAwait(false); var entities = tmp.ToArray(); if (entities.Length > 0) { var tasks = new List <Task>(); foreach (var item in entities) { tasks.Add(CacheClient.AddAsync(item.EntityId, item, expiresIn)); } await Task.WhenAll(tasks).ConfigureAwait(false); var entityIds = entities.Select(x => x.EntityId).ToArray(); await CacheClient.SetAddAsync(setKey, entityIds, expiresIn).ConfigureAwait(false); } else { await CacheClient.SetAddAsync(setKey, EmptyList, expiresIn).ConfigureAwait(false); } sw.Stop(); _logger.LogDebug("LoadListAndAddSetToCache finished in {Elapsed} ms", sw.ElapsedMilliseconds); return(entities); } catch (Exception e) when(LogError(e)) { if (_options.ThrowExceptions) { throw; } } } return(new T[0]); }
private void AddToCache(CacheInterceptorContext context, string key, object result) { if (context.CacheAttr.ExpirationType == ExpirationType.Default) { CacheClient.AddAsync(key, result).GetAwaiter().GetResult(); } else if (context.CacheAttr.ExpirationType == ExpirationType.ExpiresIn) { TimeSpan span = TimeSpan.Parse(context.CacheAttr.ExpirationPattern); CacheClient.AddAsync(key, result, span).GetAwaiter().GetResult(); } }
private async Task <List <T> > LoadList1 <T>(string setKey, int minutes = int.MinValue, CancellationToken cancellationToken = default) where T : Entity { var sw = Stopwatch.StartNew(); _logger.LogDebug("LoadList1 started"); var items = new List <T>(); var idsListValue = await CacheClient.GetSetAsync <string>(setKey).ConfigureAwait(false); if (idsListValue == null) { return(new List <T>()); } if (idsListValue.HasValue) { var idList = idsListValue.Value; if (idList == null) { return(new List <T>()); } if (IsEmptyList(idList)) { return(items); } var cacheValues = await CacheClient.GetAllAsync <T>(idList).ConfigureAwait(false); items.AddRange(cacheValues.Values.Where(x => x.HasValue).Select(x => x.Value)); if (cacheValues.Any(x => !x.Value.HasValue)) { _logger.LogDebug("Load1: Loading some Missing Cache Values - {Key}", setKey); var expiresIn = GetExpiresIn(minutes); var loadedIds = items.Select(x => x.EntityId).Where(x => !string.IsNullOrEmpty(x)).ToArray(); var allMissingIds = idList.Where(id => !loadedIds.Contains(id)).ToArray(); foreach (var missingIds in Split(allMissingIds, _options.CacheLoadSplitSize)) { var entities = await _entityStore.LoadItemsAsync <T>(x => missingIds.Contains(x.EntityId), cancellationToken).ConfigureAwait(false); if (entities == null) { return(items); } var tasks = new List <Task>(); foreach (var item in entities) { tasks.Add(CacheClient.AddAsync(item.EntityId, item, expiresIn)); items.Add(item); } await Task.WhenAll(tasks).ConfigureAwait(false); } } } sw.Stop(); _logger.LogDebug("LoadList1 finished in {Elapsed} ms", sw.ElapsedMilliseconds); return(items); }