Назад к вопросам
Рамблер
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 можно настроить в зависимости от требований к актуальности данных.