In‑memory кэш профилей пользователей с ограничением времени жизни (TTL)

Храните профиль вместе с expires_at и номером поколения. Изменения заказов выполняйте атомарно под блокировкой; старый таймер не должен удалять обновлённый профиль.

Короткий ответ

Что ответить на собеседовании

Храните профиль вместе с expires_at и номером поколения. Изменения заказов выполняйте атомарно под блокировкой; старый таймер не должен удалять обновлённый профиль.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо разработать кэш, работающий в оперативной памяти, который:

  1. По уникальному идентификатору (UUID) пользователя возвращает его профиль и связанные заказы.
  2. Хранит данные только в течение заданного периода — по истечении TTL запись автоматически удаляется.
  3. Позволяет выполнять операции над заказами: добавление нового, обновление существующего и удаление.
  4. Содержит набор тестов, иллюстрирующих типичное использование кэша.
package main

import (
    "log"
    "time"
)

type UserProfile struct {
    UUID   string
    Name   string
    Orders []Order
}

type Order struct {
    UUID       string
    CreatedAt  time.Time
    UpdatedAt  time.Time
    Basket     interface{}
}

func main() {
    x := 2 + 2
    if x != 4 {
        log.Fatalf("expected 4, got %d", x)
    }

    log.Println("Tests passed")
}

Ответ

Храните профиль вместе с expires_at и номером поколения. Изменения заказов выполняйте атомарно под блокировкой; старый таймер не должен удалять обновлённый профиль.

Минимальный алгоритм: Set(UUID, profile, TTL) копирует данные, сохраняет новое поколение и запускает таймер; callback удаляет запись только при совпадении поколения. Get под lock проверяет expires_at и возвращает копию либо miss. Таймер помогает очистке, но не заменяет проверку срока чтением.

AddOrder отклоняет существующий UUID заказа, UpdateOrder требует существующий, DeleteOrder удаляет по UUID. Все три операции проверяют TTL и изменяют профиль внутри одного lock. Явно выберите политику: например, операции над заказами не продлевают срок профиля. Basket требует глубокого копирования или неизменяемого типизированного значения. Один экземпляр кеша инъецируется обработчикам.

Проверки: hit/miss, истечение TTL, повторный Set до старого таймера, дубликат заказа, update/delete неизвестного UUID, отсутствие изменений через возвращённую копию, конкурентные операции. Тест 2+2 кеш не проверяет.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее