Кеширование данных
С версии 3.10
- Механизм кеширования виджетов
- Настройки механизма кеширования в интерфейсе администратора
- Включение механизма кеширования в интерфейсе оператора
- Очистка кеша дашбордов
Механизм кеширования виджетов
Механизм кеширования поддерживается для всех типов виджетов.
Кеширование данных реализовано на основе алгоритма LRU (Least Recently Used) — "наименее недавно использованный". Данный алгоритм предполагает, что элементы, которые недавно использовались, с большей вероятностью будут использованы снова, поэтому их следует хранить в кэше, а старые, редко используемые элементы, нужно удалять для освобождения места, когда кеш переполнен.
Кэширование позволяет существенно снизить нагрузку на сервер, сократить время отклика при отображении дашбордов и обеспечить стабильную работу интерфейса при повторных обращениях к одним и тем же данным.
Основные принципы работы
- Хранение результатов — при построении виджета с конкретным набором параметров (включая фильтры) результат сохраняется для повторного использования.
- Проверка наличия данных — при запросе система ищет кешированное значение и возвращает его без повторного построения.
- Ограничение объема кеша — максимальное число записей задается в параметре "Количество объектов в кеше" (maxCacheItems).
- Удаление устаревших записей — при переполнении применяется принцип LRU: сохраняются самые новые записи, старые удаляются.
-
Ограничение по времени построения (timeLimitForCa) — задает максимальное время, за которое должен быть построен виджет, чтобы его результат был сохранен в кэше.
Чем ниже пороговое значение, тем больше виджетов потенциально попадает в кеш, что способствует ускорению загрузки дашбордов. Ресурсоемкие виджеты, время построения которых превышает лимит, исключаются из кеширования, чтобы не перегружать систему.
Логика работы кеша (cacheEnabled = true)
-
Первое обращение к дашборду.
При первом обращении к виджету/дашборду выполняется запрос к БД и результат записывается в кеш как новая запись. Создается объект типа "Кэш" (cache).
-
Повторные обращения (чтение из кэша).
При повторном обращении к тому же виджету/дашборду система находит актуальную запись в кеше и возвращает ее без повторного построения.
Для найденного объекта типа "Кэш" (cache) обновляется dateRead, то есть фиксируется время последнего чтения.
-
Принудительное обновление при нажатии кнопки "Обновить данные".
Нажатие кнопки инициирует новый запрос к БД (игнорируется кэш) и результат записывается в кеш как новая запись с новыми данными. Создается новый объект типа "Кэш" (cache).
-
Обновление браузера (F5 / перезагрузка страницы)
Перезагрузка страницы читает данные из кэша и обновляет dateRead. Нового запроса к БД не выполняется.
-
Истечение времени жизни кеша
Если прошел интервал cacheLifeTime с момента создания/последнего обновления записи, то запись считается устаревшей и при следующем обращении будет выполнен новый запрос к БД и создан новый объект типа "Кэш" (cache).
Особенности работы
- Данный механизм не предполагает ручное изменение объектов типа "Кэш" (cache).
- Количество записей в кеше может превышать указанное значение и составлять не более maxCacheItems + количество одновременно строившихся виджетов.
-
Значение объектов типа "Кэш" (cache) ищется по значениям атрибутов:
- "Код виджета" (widgetKey).
- "Язык" (sLocale). Если текущий пользователь не суперпользователь.
- "Смещение между серверным и пользовательским ЧП" (iOffset). Если текущий пользователь не суперпользователь.
- "Фильтры" (filtersIds)
- "subjectUUID" (subjectUUID). При наличии относительного критерия в любом фильтре (дашборда, виджета).
- "Название" (title).
- "Название" (title) состоит из значений "Код виджета" (widgetKey), "UUID субъекта" (subjectUUID), "Язык" (sLocale), "Смещение между серверным и пользовательским ЧП" (iOffset), объединенных через символ "_".
Если результат построения виджета должен попасть в кеш, то перед новой записью выполняется проверка и очистка по принципу LRU:
- Если механизм уже выполняется другим потоком, то выполнение механизма LRU будет пропущено.
- Будет выполнен поиск объектов "Кеш" (cache) с сортировкой по дате создания (от нового к старому).
- В кеше остаются только самые новые записи в количестве указанном в "Количество объектов в кеше" (maxCacheItems), остальные записи удаляются.
Настройки механизма кеширования в интерфейсе администратора
Для использования функционала кеширования необходимо выполнить следующие настройки.
Обязательные настройки
-
Создайте класс "Дашборды" (DBDashboards) для хранения параметров отображения и кеширования данных для виджетов.
Добавьте в него следующие атрибуты:
Атрибут Код Тип Описание Значение tValue Текст Значение, представляющее данные виджета Смещение между серверным и пользовательским часовым поясом iOffset Целое число Разница во времени между сервером и клиентом, используется для корректного отображения даты/времени Код виджета widgetKey Текст Уникальный ключ, идентифицирующий виджет Язык sLocale Строка Языковой контекст, в котором отображается виджет Количество объектов в кеше maxCacheItems Целое число Ограничение на количество кешируемых значений. По умолчанию – 100 Время построения виджета для попадания в кеш (сек.) timeLimitForCa Целое число Максимальное время (в секундах) на построение данных, при превышении кеш не используется.
Рекомендуемое (базовое) значение - 10с на виджет.
По умолчанию – 0
Кеш включен cacheEnabled Логический Признак включения механизма кеширования Дата последнего чтения dateRead Дата/время Время последнего чтения или обновления кеша UUID субъекта subjectUUID Строка Идентификатор текущего субъекта Время жизни кеша cacheLifeTime Временной интервал Максимальное время хранения данных в кеше Фильтры filtersIds Текст Представление фильтров, примененных к виджету. По умолчанию – 24 часа -
В классе создайте типы объектов:
- "Кэш" (cache) — представляет собой структуру хранения закешированных данных;
- "Настройки дашбордов" (settings) — представляет собой настройки дашбордов.
- "Кэш" (cache) — представляет собой структуру хранения закешированных данных;
-
У пользователя дашбордов должны быть открыты права:
- на редактирование атрибутов класса "Дашборды" (DBDashboards);
- на просмотр атрибутов в типе "Настройки дашбордов" (settings);
- на добавление объектов в тип "Кэш" (cache).
-
Перейдите в раздел "Настройка системы" → "Консоль" и создайте один единственный объект типа "Настройки дашбордов":
utils.create('DBDashboards$settings', [title: 'Настройки дашбордов']).UUID
-
Перейдите в раздел "Настройка системы" → "Администрирование" → вкладка "Управление логом событий" и создайте правило: не хранить логи по кешам дашбордов (для объектов данного типа логи не создаются).
Подробнее о настройке правил описано в разделе Настройка правила хранения лога событий.
Необязательные настройки
-
Перейдите в раздел "Классы" → класс "Дашборды" (DBDashboards) → тип "Настойки дашбордов" (settings) → вкладка "Карточка объекта".
Выведите атрибуты настройки сохранения кеша в контент "Параметры объекта":
- Название;
- Тип объекта;
- Кэш включен;
- Количество объектов в кэше;
- Время жизни кэша;
- Время построения виджета для попадания в кэш (сек.);
- Код виджета;
- Фильтры;
- Язык.
Подробное описание контента приводится в разделе Контент "Параметры объекта".
-
Перейдите в раздел "Классы" → класс "Дашборды" (DBDashboards) → тип "Кэш" (cache) → вкладка "Карточка объекта".
Выведите атрибуты в контент "Параметры объекта":
- Название;
- Тип объекта;
- Код виджета;
- Язык;
- Смещение между серверным и пользовательским ЧП;
- Фильтры;
- Значение;
- UUID субъекта;
- Кэш включен;
- Количество объектов в кэше.
Подробное описание контента приводится в разделе Контент "Параметры объекта".
-
Перейдите в раздел "Классы" → класс "Дашборды" (DBDashboards) → тип "Настойки дашбордов" (settings) → вкладка "Карточка объекта".
Выведите список объектов типа "Кэш" (cache) в контент "Список объектов". Подробное описание контента приводится в разделе Контент "Список объектов".
Объекты типа "Кэш" (cache) создаются автоматически с ID виджета, по нему можно определить соответствующий объект. На карточке объекта "Кэш" видны значения, которые записаны в кэш.
Включение механизма кеширования в интерфейсе оператора
- В интерфейсе оператора перейдите на вкладку с параметрами дашбордов.
- Нажмите Редактировать, на форме редактирования установите флажок "Включить кеш" и нажмите Сохранить.
После включения механизма кеширования:
- данные виджетов сохраняются и повторно используются при обращении;
- дашборды загружаются быстрее;
- нагрузка на сервер снижается.
В интерфейсе оператора на панели виджета дашборда доступна кнопка Обновить данные. Она позволяет принудительно очистить кеш и загрузить актуальные значения.
Очистка кеша дашбордов
Очистка кеша дашбордов необходима для:
- Обновления данных, чтобы дашборды отображали актуальные значения из базы.
- Обновления конфигурации, чтобы изменения в настройках или структуре дашборда вступали в силу сразу, без ожидания окончания времени жизни кеша (cacheLifeTime).
- Устранения ошибок, если дашборд отображает данные из кеша или отображает некорректные данные.
- Поддержания стабильной работы интерфейса, исключения конфликтов и удаления устаревших данных.
Чтобы очистить кеш дашбордов:
- В интерфейсе администратора перейдите в раздел "Настройка системы" → "Консоль".
-
Выполните следующий скрипт:
api.db.query(""" DELETE FROM DBDashboards__Evt """).executeUpdate() api.db.query(""" DELETE FROM DBDashboards\$cache """).executeUpdate()