Код Middle Кеш и очереди спрашивают часто обновлено

Cache-aside с отрицательным кешированием

Условие

Напиши createCachedGetter({ load, ttlMs, negativeTtlMs, now }). Возвращает async get(id):

  • если в кеше есть свежая запись, вернуть её без вызова load;
  • иначе вызвать load(id). Если результат не null, положить в кеш на ttlMs. Если null (объекта нет), положить «отсутствие» на negativeTtlMs, чтобы не долбить базу запросами несуществующих id;
  • ошибки load не кешировать.

Кроме get вернуть invalidate(id). Итог: { get, invalidate }.

Что проверяют тесты

  • второй get из кеша

  • истёк ttl: снова в load

  • null кешируется на negativeTtlMs

  • ошибка не кешируется

  • invalidate

  • значение 0 и пустая строка кешируются как обычные

Как подойти

Подсказки: 2
  1. Храни { value, expires }, проверяй expires > now().
  2. Отсутствие объекта это value === null: не путай с !value.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.