Кэш распределенной памяти требует времени для получения значения кэша ASP. NET Core 2.2 - PullRequest
0 голосов
/ 06 марта 2020

Мы работаем с ASP. NET Core 2.2 проектом. В котором мы пытаемся добавить кэш для повышения производительности. Вот код, который мы сделали.

Startup.cs

services.AddDistributedMemoryCache();

CacheManager.cs

 public class CacheManager : ICacheManager 
 { 
    private readonly IDistributedCache _cache;


       public CacheManager(IDistributedCache cache)
       {
           _cache = cache;
       }

       public byte[] Get(string key)
       {
           return _cache.Get(key);
       }

       public Task<byte[]> GetAsync(string key, CancellationToken token = default(CancellationToken))
       {
           return _cache.GetAsync(key, token);
       }

       public void Refresh(string key)
       {
           _cache.Refresh(key);
       }

       public Task RefreshAsync(string key, CancellationToken token = default(CancellationToken))
       {
           return _cache.RefreshAsync(key, token);
       }

       public void Remove(string key)
       {
           _cache.Remove(key);
       }

       public Task RemoveAsync(string key, CancellationToken token = default(CancellationToken))
       {
           return _cache.RemoveAsync(key, token);
       }

       public void Set(string key, byte[] value, DistributedCacheEntryOptions options)
       {
           _cache.Set(key, value, options);
       }

       public Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = default(CancellationToken))
       {
           return _cache.SetAsync(key, value, options, token);
       }

       public async Task SetAsync<T>(string key, T item, DistributedCacheEntryOptions options = null)
       {
           if (item == null)
               return;

           if (options == null)
               options = new DistributedCacheEntryOptions();

           //serialize item
           var serializedItem = JsonConvert.SerializeObject(item);

           await _cache.SetStringAsync(key, serializedItem, options);
       }

       public async Task<T> GetAsync<T>(string key)
       {
           var serializedItem = await _cache.GetStringAsync(key);

           if (serializedItem == null)
               return default(T);

           //deserialize item
           var item = JsonConvert.DeserializeObject<T>(serializedItem);

           return item == null ? default(T) : item;
       }

       public void Set<T>(string key, T item, DistributedCacheEntryOptions options = null)
       {
           if (item == null)
               return;

           if (options == null)
               options = new DistributedCacheEntryOptions();

           //serialize item
           var serializedItem = JsonConvert.SerializeObject(item);

           _cache.SetStringAsync(key, serializedItem, options);
       }

       public T Get<T>(string key)
       {
           var serializedItem = _cache.GetStringAsync(key).Result;

           if (serializedItem == null)
               return default(T);

           //deserialize item
           var item = JsonConvert.DeserializeObject<T>(serializedItem);

           return item == null ? default(T) : item;
       }
}

Вот как я его использую

var localString = _cache.GetAsync<MyClass>(Key).Result;

Но каждый раз при извлечении данных из кэша требуется от 30 до 40 мс (при большом количестве значений ресурсов). Я не уверен, где я делаю что-то не так!

С другой стороны, если я просто сохраню данные одного пользователя, результат будет равен 0 мс.

...