Пропадают записи из MemoryCache?

Используется System.Runtime.Caching.MemoryCache в качестве хранилища типа ключ-значение. Объект может сохраняться два раза (второй раз — для актуализации данных). Причём во второй раз не передаётся значение значение поля ImportantInfo в сохраняемом объекте и его приходится забирать из старой записи из кеша.

public static void Save(Entity entity)
		{
			var cache = MemoryCache.Default;
			var idKey = entity.Id.ToString();

			if (cache.Contains(idKey))
			{
				var message = string.Format(
					"In the cache already has a record with identifier {0}. Existing record will be replaced. ImportantInfo will be extracted from old entity record.",
					idKey);
				log.Info(message);
				entity.ImportantInfo = (cache.Get(idKey) as Entity).ImportantInfo;
			}

			var policy = new CacheItemPolicy
			{
				SlidingExpiration = Options.MemoryCachingTime	//30 минут.
			};

			cache.Set(idKey, entity, policy);
		}


<system.runtime.caching>
    <memoryCache>
      <namedCaches>
        <add name="default"
             cacheMemoryLimitMegabytes="0"
             physicalMemoryLimitPercentage="0"
             pollingInterval="00:02:00" />
      </namedCaches>
    </memoryCache>
  </system.runtime.caching>



При двух последовательных вызовах (по времени — минут 10 между вызовами, не больше) Save() для объекта с одним и тем же айдишником ожидается появление в логе записи «In the cache already has a record… Existing record will be replaced». Однако она иногда появляется, а иногда нет.


Как такое может быть? Ожидалось, что запись гарантированно будет лежать в кеше полчаса (так как задано SlidingExpiration), но выходит, записи пропадают из кеша?


Объектов в кеш сохраняется порядка сотен. 300+. Вроде не очень много, но возможно кеш пытается что-то оптимизировать и самовольно затирает записи? Если так, можно ли ему это запретить делать?


Доки на MSDN скудны.
  • Вопрос задан
  • 3517 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы