Кэширование данных для виджета

Механизм кэширования в виджете позволяет ускорить отображение при повторном получении данных, а также уменьшить нагрузку на базу данных и бизнес-логику.

Схема работы

Далее рассмотрим диаграмму последовательности обработки данных для виджетов с сохранением в prefetch с учетом актуальности кэша:

Методы кэширования данных

Полное описание используемых методов кэширования в части, актуальной для виджетов смотрите здесь.

Prefetch.Data

Используется для кэширования методов, возвращающих Record.

Обязательные поля:

  • PrefetchMethod — метод непосредственного получения данных.

Необязательные поля:

  • PrefetchRenewal — период, через который обновлять кэш.
  • PrefetchExpire — время, через которое кэш прекратит обновляться и будет удален.

По умолчанию время обновления кэша — 1 сутки, время жизни — 1 неделя. Значения устанавливаются только при необходимости сделать их отличными от дефолтных.

Комбинации полей PrefetchRenewal и PrefetchExpire позволяют понять, что наступило время обновления данных при обращении к кэшу. Несмотря на то, что данные из кэша устарели, их необходимо отдать и в фоне запустить обновление данных. И делать это нужно до тех пор, пока не выйдет период поддержки кэша.

В результате кэш обновляется только при обращении к данным. Предварительной подготовки данных по таймеру не вводим.

Пример использования prefetch для хранения виджетов:

  1. Прикладной разработчик вызывает метод Prefetch.Data с передачей в качестве параметров PrefetchMethod и всех фильтров, необходимых для формирования данных.
  2. Prefetch на бэкенде сам привязывает данные к пользователю (клиенту), если в параметрах не задан параметр PrefetchSessionId.
  3. Если данных в кэше нет или им больше недели, то пользователь ждет их построения, после чего получает данные на интерфейсе. Если данные в кэше и им больше одного дня, то пользователь моментально получает данные. Затем данные в кэше обновляются в фоновом режиме.

Prefetch.List

Используется для кэширования методов, возвращающих RecordSet.

Обязательные поля фильтра:

  • PrefetchMethod — метод непосредственного получения данных.

Настройки фильтрации:

  • PrefetchSessionLiveTime — время жизни сессии при создании (TimeInterval).

Алгоритм работы

Чтобы воспользоваться механизмом кэширования, необходимо:

  1. Выбрать формат кэшируемого результата — Record или RecordSet.
    Выбранным форматам кэшируемого результата соответствуют методы:
    • Prefetch.List — RecordSet.
    • Prefetch.Data — Record.
  2. Исходя из прикладной логики, определить методику получения параметров кэширования:
    • Времени жизни (PrefetchExpire/ PrefetchSessionLiveTime).
    • Времени актуальности кэша (PrefetchRenewal).
  3. Согласно определенным параметрам вызвать методы.

Пример использования кэширования в виджете заполняемости заведения

Виджет занятости заведений отображает количество свободных/занятых столов или мест в заведении. Он состоит из двух частей:

  • График (common) — общая информация о загруженности по времени.
  • Отчет (detailed) — детальная информация по заполняемости столиков за каждый день.

Рассмотрим схему виджета заполняемости наглядно:

Алгоритм работы:

  1. Выбрали формат данных для обеих частей виджета — RecordSet.
  2. По данному формату кэшируемого результата используем метод Prefetch.List.
  3. После чего определяется алгоритм получения времени жизни кэша:
    • Разделили временную шкалу по степени актуальности данных:
      • Настоящее — данные активно меняются, продажи создаются или загружаются из offline. Принимаем как трое суток в прошлое по настоящий момент.
      • Будущее и далекое прошлое (более трех суток) — считаем, что данные о продажах через трое суток не меняются, прогноз на будущее в виджете строится из усреднения данных в прошлом с шагом в неделю, которые, соответвено, тоже считаем неизменными.

Таблица методики определения времени жизни кэша:

В результате:

  • За вчерашний день данные хранятся один день и обновляются.
  • Детальные данные за сегодня обновляются раз в час.
  • Информация по часам из графика обновляется раз в 10 минут.