MemoryCache

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Начиная с версии .NET 4.0 во фреймворк был добавлен класс MemoryCache, который предназначен для кэширования контента. Данный класс не предназначен только для создания веб-приложений в ASP.NET, его можно использовать и при написании графических и даже консольных приложений.

При использовании MemoryCache следует учитывать, что объект этого класса привязан к домену приложения. И также надо учитывать, что этот объект будет уничтожаться веб-сервером IIS при перезапуске пула приложения в следующих случаях:

  • Если в течение 20 минут не было запросов к приложению

  • Если с момента запуска (последнего перезапуска) приложения прошло 1740 минут - временной интервал для перезапуска приложений в IIS по умолчанию

  • Если в папку проекта на IIS была добавлена новая копия приложения (идет автоматический перезапуск)

Для использования MemoryCache надо добавить в проект библиотеку System.Runtime.Caching.dll.

Пусть у нас есть некоторая модель Phone и класс контекста данных PhoneContext:

public class Phone
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class PhoneContext : DbContext
{
    public DbSet<Phone> Phones { get; set; }
}

Добавим новый класс, который будет использовать функционал MemoryCache:

using System.Runtime.Caching;
//..........................
public class AppCache
{
    public Phone GetValue(int id)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Get(id.ToString()) as Phone;
    }

	public bool Add(Phone value)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Add(value.Id.ToString(), value, DateTime.Now.AddMinutes(10));
    }

    public void Update(Phone value)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        memoryCache.Set(value.Id.ToString(), value, DateTime.Now.AddMinutes(10));
    }

    public void Delete(int id)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        if (memoryCache.Contains(id.ToString()))
        {
            memoryCache.Remove(id.ToString());
        }
    }
}

Во многом данный класс напоминает стандартный репозиторий. Теперь применим его для получения объекта Phone в методе контроллера:

public class PhonesController : Controller
{
    private PhoneContext db = new PhoneContext();
    private AppCache appCache;

    public PhonesController()
    {
        appCache = new AppCache();
    }
    public ActionResult Index(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        var result = appCache.GetValue(id.Value);
		// если нет в кэше
        if(result==null)
        {
            // берем из БД
			result = db.Phones.Find(id);
			// добавляем в кэш
            appCache.Add(result);
        }
            
        if (result == null)
        {
            return HttpNotFound();
        }
        return View(result);
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850