Кэширование памяти в ASP.NET MVC 5 не работает

Я разрабатываю проект ASP.NET MVC. В моем проекте я выполняю кэширование в памяти некоторых данных для повышения производительности. Что я понимаю в кэшировании памяти, так это то, что оно кеширует данные на сервере, поэтому независимо от того, кто является клиентом, в следующем запросе он загружает данные из кеша, а не из базы данных, а затем отправляет обратно клиентам. Я выполняю кэширование памяти в ASP.NET MVC 5, и оно не работает.

Это метод GetRegions, который я кэширую:

public IEnumerable<Region> GetRegions(){
    ObjectCache cache = MemoryCache.Default;
    if(cache.Get("regions")==null)
    {
        IEnumerable<Region> regions = db.Regions;
        cache.Add("regions", regions, DateTime.Now.AddDays(1));
        return regions;
    }
    else
    {
        IEnumerable<Region> regions = (IEnumerable<Region>)cache.Get("regions");
        return regions;
    }
}

Согласно приведенному выше коду, в первом запросе cache.Get("regions") будет нулевым. Но во втором запросе он не должен быть нулевым. Но всякий раз, когда я получаю доступ к этому методу, cache.Get("regions") всегда равно нулю. Правильно ли я делаю кэширование памяти?


person Wai Yan Hein    schedule 28.05.2016    source источник


Ответы (1)


Код, который у вас есть, должен работать, хотя он не совсем правильный (он оставляет открытой очень небольшую возможность истечения срока действия кеша между проверкой и использованием), хотя, поскольку срок действия у вас длинный, я подозреваю, что это не то, что здесь происходит. Чтобы исправить код:

public IEnumerable<Region> GetRegions()
{
    ObjectCache cache = MemoryCache.Default;
    const string key = "regions";

    IEnumerable<Region> regions = cache.Get(key) as IEnumerable<Region>;
    if (regions == null)
    {
        regions = db.Regions;
        cache.Add(key, regions, DateTime.Now.AddDays(1));
    }
    return regions;
}

Я не уверен, что это решит вашу проблему!

person Richard    schedule 28.05.2016
comment
Я проверил с помощью точки останова. Но это не работает. Что я сделал, так это доступ из Firefox по первому запросу. Это было нулем. Затем я открываю хром и делаю второй запрос. Это все еще было нулевым, когда я сделал второй запрос с хромом. На самом деле он не должен быть нулевым. Правильно? - person Wai Yan Hein; 28.05.2016