Работа с разпределен кеш¶

Разпределеният кеш може да подобри производителността и мащабируемостта на приложение ASP.NET 5, особено ако е хоствано в облака или фермата. Тази статия описва как да работите с вградените абстракции на ASP.NET 5 и внедрени разпределени кеш памет.

Какво е разпределен кеш¶

Разпределеният кеш се използва от множество сървъри (вж. Основи на кеширането). Кешираната информация не се съхранява в паметта на един сървър и кешираните данни са достъпни за всички сървъри. Тук има няколко предимства:

  1. Кешираните данни са свързани между всички сървъри. Потребителите виждат един и същ резултат, без значение към кой сървър правят заявка.
  2. Рестартирането на сървъра не засяга кешираните данни. Отделни сървъри могат да бъдат премахнати или добавени, без това да повлияе на кеша.
  3. По-малко заявки се отправят към хранилището на сурови данни.

Когато се използва разпределен кеш на SQL Server, някои от тези предимства са валидни само при използване на конкретни екземпляри на база данни за кеша и сурови данни.

Разпределеният кеш може значително да подобри отзивчивостта на приложението, тъй като обикновено можем да получаваме данни от кеша по-бързо, отколкото от базата данни (или уеб услуга).

Конфигурацията на кеша зависи от изпълнението. Тази статия ще ви преведе как да настроите разпределен кеш в Redis и SQL Server. Независимо от избраната реализация, приложението работи с кеша, използвайки интерфейса IDistributedCache.

Интерфейсът IDistributedCache¶

Интерфейсът IDistributedCache включва както синхронни, така и асинхронни методи. Интерфейсът ви позволява да добавяте, извличате и премахвате елементи от кеша. Ето методите IDistributedCache:

Connect, ConnectAsync е оттеглено Get, GetAsync Приема низов ключ и извлича кеширания елемент като байт [], ако има такъв в кеша. Set, SetAsync Добавя елемент в кеша (като байт []) с помощта на низов ключ. Refresh, RefreshAsync Опреснява елемента, като нулира времето му на изчакване. Remove, RemoveAsync Премахва записа в кеша в зависимост от неговия ключ.

За да използвате IDistributedCache:

  1. Включете необходимите зависимости в project.json .
  2. Конфигурирайте конкретна реализация на IDistributedCache в метода Startup ConfigureServices и го добавете към контейнера.
  3. От класовете на контролера Middleware или MVC, изискайте екземпляр на IDistributedCache от конструктора. Екземплярът ще бъде осигурен чрез инжектиране на зависимост (DI).

Не е необходимо да използвате Singleton или Scoped за екземпляри IDistributedCache (поне за вградени реализации). Можете също така да го създадете, когато имате нужда (вместо да използвате инжектиране на зависимост), но тогава вашият код ще бъде по-труден за тестване и нарушаване на принципа на явна зависимост.

Ето как да използвате екземпляра IDistributedCache в прост компонент на междинния софтуер:

В горния код кешираните стойности се четат, но не се записват. В този пример стойността се задава при стартиране на сървъра и не се променя. В сценарий с няколко сървъра сървърите, които стартират по-късно, ще презапишат предишните стойности. Методите Get и Set използват типа байт []. Следователно стойността на низа трябва да бъде преобразувана с помощта на Encoding.UTF8.GetString (за Get) и Encoding.UTF8.GetBytes (за Set).

По-долу са стойностите, зададени от Startup.cs:

Тъй като IDistributedCache е конфигуриран в метода ConfigureServices и е достъпен като параметър за метода Configure. И тогава можете да работите с конфигурирания екземпляр, използвайки DI.

Redis Distributed Cache¶

Redis е хранилище с данни с отворен код в паметта, което често се използва за разпределен кеш. Можете да го използвате локално и можете също да конфигурирате Azure Redis Cache за приложения, хоствани на Azure. Реализацията на кеша се конфигурира с помощта на интерфейса RedisDistributedCache .

Реализацията на Redis е конфигурирана в ConfigureServices и има достъп до вашия код, като иска екземпляр на IDistributedCache (вижте кода по-горе).

В нашия пример, изпълнението на RedisCache се използва, когато сървърът е конфигуриран за среда за подреждане. Методът ConfigureStagingServices конфигурира RedisCache:

За да инсталирате Redis на вашата локална машина, инсталирайте пакета http://chocolatey.org/packages/redis-64/ и стартирайте redis-server от командния ред .

Използване на разпределен кеш за SQL Server¶

Реализацията на SqlServerCache позволява на разпределения кеш да използва SQL Server. Скриптът инсталира таблица с посоченото от вас име. Ето схемата на таблицата:

Ако използвате RC1 версията на SqlServerCache, тогава няма да имате работещ инсталатор. Можете да инсталирате необходимата таблица, като използвате скриптовете, разположени тук: файлът SqlQueries.cs. Това е разрешено в RC2.

Както при всички реализации на кеша, вашето приложение трябва да получава и задава кеширани стойности, като използва екземпляра IDistributedCache, а не SqlServerCache. Примерът реализира SqlServerCache в производствена среда (конфигуриран в ConfigureProductionServices).

ConnectionString (и по избор SchemaName и TableName) трябва да се съхраняват извън контрола на източника (напр. UserSecrets), тъй като те могат да съхраняват чувствителни данни.

Препоръки¶

Когато решавате коя реализация на IDistributedCache е подходяща за вашето приложение, изберете Redis и SQL Server въз основа на съществуващата ви инфраструктура и изисквания за среда и производителност. Ако вашият екип се занимава повече с Redis, това е чудесен избор. Ако вашият екип предпочита SQL Server, можете да използвате тази реализация. Традиционното кеширане съхранява данни в паметта, така че да могат да бъдат извлечени бързо. Трябва да кеширате често достъпвани данни и всички данни в хранилището, като SQL Server или Azure Storage. Redis кеширането предлага по-висока производителност и по-ниска латентност в сравнение с SQL кеширането. Също така, трябва да избягвате внедряването в паметта (MemoryCache) на множество сървъри.

Внедряването в паметта на IDistributedCache трябва да се използва само за тестване на приложение, хоствано на един сървър.