Обновление: я отказался от системы кэширования в пользу решения для базы данных - pitty.
У меня есть бэкэнд-контроллер MVC, где мне нужно кэширование данных. Я использую MemoryCache.Default для хранения пар ключ / значение, ничего большого. Не бери в голову политику и время истечения, я получил это. Меня удивляет то, что мой кэш очищается после того, как я получил доступ к ключу (получил значение) в первый раз. Если я не получаю доступ к кешированному элементу, в конце концов, срок действия элемента истекает, и вызывается мой обработчик удаления - это все хорошо. Но когда я получаю элемент в первый раз, мой обработчик удаления вызывается через некоторое время. ChacheEntryRemovedReason имеет значение:
CacheSpecificEviction // A cache entry was evicted for as reason that is defined by a particular cache implementation.
Я не могу найти никакого объяснения тому, что это значит.
Загадочная вещь здесь в том, что когда я проверяю объект кеша при отладке в обработчике (и при последующих вызовах контроллера), перечисление кеша пусто. Если я «установлю» (добавлю) новый CacheItem в кеш, я снова смогу снова получить доступ к ключу, и история повторится.
Поведение похоже на одноразовый механизм кэширования, который мне совершенно не нужен.
Любая помощь или комментарии будут высоко оценены!
Некоторый упрощенный код просто для удовольствия:
private static ObjectCache cache = MemoryCache.Default;
internal void insertInCache(string key, int value) {
CacheItemPolicy policy= new CacheItemPolicy() {
AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration,
Priority = CacheItemPriority.NotRemovable,
SlidingExpiration = TimeSpan.FromMinutes(ITEM_EXPIRE_TIME),
RemovedCallback = new CacheEntryRemovedCallback(RemovedHandler)
};
cache.Set(key, value, policy);
}
static void RemovedHandler(CacheEntryRemovedArguments args) {
if(args.RemovedReason == CacheEntryRemovedReason.Expired) {
//do something - or i actually want it to disappear when expired
} else {
cache.Set(args.CacheItem, somepolicy);//reinsert to keep in cache
}
}
//Apparently this triggers some cache mong mode
internal void getSome(string key){
int thisIsWhatIWanted = (int)cache.GetCacheItem(key).Value;
}
Это просто пример кода, поэтому, пожалуйста, не надоедайте мне по поводу моего умения.
Мое собственное предположение состоит в том, что это может быть связано с неправильной настройкой кэша, колдовством MVC или тем фактом, что я запускаю свое приложение на отладочном IIS (визуальное изучение)