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

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

Итак, когда я говорю о мемоизации, я говорю о запоминании или кэшировании вывода сложных операций в памяти на машине, на которой выполняется программное обеспечение. Корень мемоизации - слово «меморандум», что означает «запоминать».

Кэширование - мощный инструмент, но, в отличие от мемоизации, обычно это другой процесс, запущенный на каком-то другом сервере, доступ к которому осуществляется сетевыми вызовами. Системы кэширования неизменно бывают быстрыми, но сетевые вызовы добавляют узкие места к общему времени отклика. Добавьте несколько процессов, выполняющих одновременные вызовы в одной и той же сети - в закрытой настройке vpc - и кеш должен будет масштабироваться по мере того, как ваши компоненты не отставают. Мемоизация имеет преимущество в этом аспекте, когда данные кэшируются в памяти на вашем компьютере, что позволяет избежать сетевых задержек.

Наиболее важные аспекты использования кеша:

1. ttl (время жизни) - данные кеша автоматически удаляются по истечении заданного интервала времени.

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

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

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

Представляем memoize_until. Мощный, но простой метод мемоизации, который фокусируется на динамическом характере и согласованности всех систем кэширования в многопроцессорной среде и привносит это в мир мемоизации.

MemoizeUntil запоминает (запоминает) значения до начала заранее определенной метрики времени - это может быть минута, час, день и даже неделя. Хранилище по истечении срока действия автоматически очищает предыдущие данные - чтобы избежать раздува памяти - и обновляет данные, запрашивая источник. Поскольку процесс автоматически выбирает данные в начале заранее определенной метрики времени, это гарантирует согласованность между процессами.

Для начала просто установите пакет через npm:

npm install memoize_until

Затем запросите модуль, инициализируйте его в соответствии с вашими вариантами использования и используйте его там, где это необходимо.

const MemoizeUntil = require('memoize_until').MemoizeUntil
MemoizeUntil.init({ 
    day: ['custom1', 'custom2']
})
MemoizeUntil.fetch('min', 'default', () => { 
    return 'SomeComplexOperation'; 
})

В качестве простого примера рассмотрим, что ваше готовое к работе приложение имеет общедоступный API, и вы хотите реализовать FUP (политику справедливого использования) и, следовательно, установить соответствующее ограничение скорости. Но вы почти могли предвидеть, что некоторые из ваших клиентов то и дело будут жаловаться и желать увеличения лимита API. Это требует, чтобы ваш лимит API был динамическим.

Традиционно разработчики сохраняли это как конфигурацию в базе данных конфигурации и загружали один раз на запрос. Но со временем такие конфигурации стали сохраняться в хранилищах кешей, таких как Redis, которые традиционно работают очень быстро, но задержки в сети остаются. Чтобы избежать вызовов кеша для каждого веб-запроса, вам нужно запомнить ограничение API локально и использовать его для каждого запроса, но также часто проверять хранилище кеша, если оно было обновлено. Это кажется идеальным вариантом использования memoize_until. Кэшированные данные необходимо обновить, но не сразу. Пример использования можно найти в этой сущности:

readme содержит дополнительную документацию, например, как расширить memoize_until для действительно динамического поведения - динамические ключи и значения - и многое другое.

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