Войти Регистрация
Фронтенд

56. Кэш курсов валют Т‑Банка со сроком жизни записи

Средняя

Экран обмена валют в Т‑Банке показывает курс USD/RUB, EUR/RUB и ещё десяток пар. Курс меняется часто, поэтому ответ API живёт 30 секунд, а курс по сделке с фиксацией — 5 секунд.

Напишите класс TTLCache. Конструктор new TTLCache({ ttl }) задаёт срок по умолчанию в мс. set(key, value, ttl?) кладёт значение и возвращает this; свой ttl важнее общего. Повторный set перезаписывает значение и срок.

get(key) возвращает значение или undefined, has(key) — true/false. Запись протухает в момент время записи + ttl: ровно в эту миллисекунду её уже нет. get срок не продлевает. delete(key) возвращает, была ли живая запись.

Свойство size — число живых записей. prune() удаляет протухшие записи из памяти и возвращает, сколько удалено. Время берите из Date.now() — в тестах это фейковые часы.

В работе: Курс по сделке держится 5 секунд: если человек нажал «Обменять» на 6-й секунде, курс нужно запросить заново, а не взять из кэша.

Пример 1: живёт ttl мс, на границе уже протух

Аргументы теста
30000, [["set", "USD", 96.4], ["tick", 29999], ["get", "USD"], ["tick", 1], ["get", "USD"]]
Ожидается
["this", 96.4, "undefined"]

Пример 2: свой ttl для курса по сделке

Аргументы теста
30000, [["set", "USD", 96.4], ["set", "deal:USD", 96.1, 5000], ["tick", 6000], ["get", "deal:USD"], ["get", "USD"]]
Ожидается
["this", "this", "undefined", 96.4]
Как проверяем Объявите TTLCache — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 9: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
class TTLCache { constructor({ ttl }); set(key, value, ttl?); get(key); has(key); delete(key); get size(); prune() }
кэшTTLMapфейковые часы

Источник: на задачах Т‑Банка: обмен валют в приложении. Условие пересказано своими словами.