Особенности использования хранилищ данных и кэша
Glossary Item Box
Для повышения эффективности работы с хранилищами данных и кэшами в конфигурационной логике и в логике реализации бизнес-процессов необходимо учитывать следующее:
1. Все объекты, помещаемые в хранилища, должны быть сериализуемыми. Такое требование обусловлено спецификой работы с хранилищами ядра приложения. Так, при сохранении данных в хранилища (за исключением хранилища данных уровня Request) объект предварительно сериализуется, а при получении — десериализуется.
2. Обращение к хранилищу является относительно ресурсоемкой операцией. В связи с этим в коде необходимо избегать излишних обращений к хранилищу. В примерах 1 и 2 приводятся корректные и некорректные варианты работы с кэшем.
Пример 1
Неоптимальный код:
// Выполняется сетевое обращение и десериализация данных. if (UserConnection.SessionData["SomeKey"] != null) { // Повторно выполняется сетевое обращение и десериализация данных. return (string)UserConnection.SessionData["SomeKey"]; }
Оптимальный код (вариант 1):
// Получение объекта из хранилища в промежуточную переменную. object value = UserConnection.SessionData["SomeKey"]; // Проверка значения промежуточной переменной. if (value != null) { // Возврат значения. return (string)value; }
Оптимальный код (вариант 2):
// Использование расширяющего метода GetValue(). return UserConnection.SessionData.GetValue<string>("SomeKey");
Пример 2
Неоптимальный код:
// Выполняется сетевое обращение и десериализация данных. if (UserConnection.SessionData["SomeKey"] != null) { // Повторно выполняется сетевое обращение и десериализация данных. UserConnection.SessionData.Remove("SomeKey"); }
Оптимальный код:
// Удаление выполняется сразу, без предварительной проверки. UserConnection.SessionData.Remove("SomeKey");
3. Необходимо понимать, что любые изменения состояния объекта, полученного из хранилища или кэша, происходят локально в памяти и не фиксируются в хранилище автоматически. Поэтому, чтобы эти изменения отобразились в хранилище, измененный объект необходимо явно в него записать (пример 3).
Пример 3
// Получение словаря значений из хранилища данных сессии по ключу "SomeDictionary". Dictionary<string, string> dic = (Dictionary<string, string>)UserConnection.SessionData["SomeDictionary"]; // Изменение значения элемента словаря. Изменения в хранилище не зафиксировались. dic["Key"] = "ChangedValue"; // Добавление нового элемента в словарь. Изменения в хранилище не зафиксировались. dic.Add("NewKey", "NewValue"); // В хранилище данных по ключу "SomeDictionary" записывается словарь. Теперь все внесенные изменения // зафиксированы в хранилище. UserConnection.SessionData["SomeDictionary"] = dic;