Используется 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 скудны.