Sobes.tech
Назад к вопросам
Senior
6

Реализуй кэширование для функции getUserFromDB. Данные редко меняются.

Компании, где спрашивали
РамблерРамблер

Ответ от нейросети

sobes.tech AI

Для кэширования результата функции getUserFromDB в Go можно использовать простую структуру с мапой и mutex для потокобезопасности. Поскольку данные редко меняются, можно кэшировать их без частого обновления, например, с TTL или без него.

Пример реализации:

package main

import (
    "sync"
    "time"
    "errors"
)

type User struct {
    ID   int
    Name string
}

var (
    cache     = make(map[int]User)
    cacheLock sync.RWMutex
    cacheTTL  = 10 * time.Minute
    cacheTime = make(map[int]time.Time)
)

func getUserFromDB(id int) (User, error) {
    // Здесь должна быть реальная логика запроса к БД
    // Для примера вернём фиктивного пользователя
    if id == 0 {
        return User{}, errors.New("user not found")
    }
    return User{ID: id, Name: "UserName"}, nil
}

func getUser(id int) (User, error) {
    cacheLock.RLock()
    user, found := cache[id]
    t, timeFound := cacheTime[id]
    cacheLock.RUnlock()

    if found && timeFound && time.Since(t) < cacheTTL {
        return user, nil
    }

    // Если нет в кэше или устарело, обновляем
    user, err := getUserFromDB(id)
    if err != nil {
        return User{}, err
    }

    cacheLock.Lock()
    cache[id] = user
    cacheTime[id] = time.Now()
    cacheLock.Unlock()

    return user, nil
}

Такой подход позволит при повторных вызовах быстро возвращать данные из памяти, снижая нагрузку на базу. TTL можно настроить в зависимости от требований к актуальности данных.