Кешировать огромный ответ в веб-API 2

У нас есть объект Json с 90 000 строками, загрузка которого занимает 5 секунд. Нам нужно загрузить все эти данные, так как нужно включить много отношений. К счастью, эти данные почти никогда не меняются, поэтому в основном они всегда будут одинаковыми (необходимо иметь возможность извлекать из кеша, если данные обновляются).

Я не так хорош в кешировании на стороне сервера, поэтому мой вопрос.

  1. Если я кэширую этот сервер, я думаю, всем пользователям будет предоставлен кешированный ответ до тех пор, пока кеш не освободится?

  2. Могу ли я кэшировать этот ответ на сервере до тех пор, пока я каким-то образом не скажу API, чтобы он не кешировался? Это нормально - хранить кеш на 24 часа

  3. Какие-нибудь библиотеки, с помощью которых я могу этого добиться?

С Уважением


person heathrow    schedule 03.01.2020    source источник
comment
вы также можете найти ссылку в этой статье. В нем есть хорошие примеры michaelscodingspot.com/cache-implementations-in-csharp-net   -  person dimmits    schedule 03.01.2020


Ответы (2)


Вы можете использовать MemoryCache в .Net Framework.

  1. MemoryCache живет в процессе, поэтому все пользователи могут получить доступ к одним и тем же кэшированным данным, если хотите (на одном сервере).
  2. Вы устанавливаете срок действия при сохранении в кеш.
  3. Встроенный в фреймворк
person Daniel Stackenland    schedule 03.01.2020
comment
Я использую LazyCache, который добавляет некоторые навороты в MemoryCache - person Matt; 03.01.2020
comment
Отличный вклад! Я привел пример ниже. Любая обратная связь была бы приятной - person heathrow; 03.01.2020

Спасибо за ввод, моя первая попытка выглядит так. Вроде работает. Пожалуйста, оставьте отзыв

        MemoryCache memoryCache = MemoryCache.Default;
        var test = memoryCache.Get("testKey")

        if (test != null) {
            return Ok(test) 
        } else {
            var data = GetData()
                 .ToList();

            memoryCache.Add("testKey", data, DateTimeOffset.UtcNow.AddDays(1));
            return Ok(data)
        }
person heathrow    schedule 03.01.2020
comment
Я создал вокруг него класс-оболочку (CacheHelper), а также использую константы для ключей cacheKeys. Я также использую метод Set вместо Add, но по мере его использования это не должно иметь никакого значения, подробнее: stackoverflow.com/questions/8868486/ - person Daniel Stackenland; 03.01.2020
comment
Ваш код выглядит хорошо. Однако кеш возвращает элементы, которые набраны object, поэтому вам, возможно, придется привести элемент к правильному типу. Например: var test = memoryCache.Get("testKey") as YourType; - person mortb; 03.01.2020