Ejemplo n.º 1
0
        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);
        }