Храните профиль вместе с expires_at и номером поколения. Изменения заказов выполняйте атомарно под блокировкой; старый таймер не должен удалять обновлённый профиль.
In‑memory кэш профилей пользователей с ограничением времени жизни (TTL)
Храните профиль вместе с expires_at и номером поколения. Изменения заказов выполняйте атомарно под блокировкой; старый таймер не должен удалять обновлённый профиль.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо разработать кэш, работающий в оперативной памяти, который:
- По уникальному идентификатору (UUID) пользователя возвращает его профиль и связанные заказы.
- Хранит данные только в течение заданного периода — по истечении TTL запись автоматически удаляется.
- Позволяет выполнять операции над заказами: добавление нового, обновление существующего и удаление.
- Содержит набор тестов, иллюстрирующих типичное использование кэша.
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 кеш не проверяет.