.Net 4 / Mvc Runtime Cache странность - PullRequest
       3

.Net 4 / Mvc Runtime Cache странность

2 голосов
/ 02 сентября 2011

Обновление: я отказался от системы кэширования в пользу решения для базы данных - 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 (визуальное изучение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...