> Использовали ли кэши в Go, например Redis, и как кэшировали (Redis, Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Wildberries

Стек: Redis, Go

> Пример ответа

Да, в Go я активно использовал Redis для кэширования. Основной подход - библиотека go-redis/redis для работы с кластером или одиночным инстансом.

Кэшировал данные по шаблону Cache-Aside: при запросе сначала проверяю Redis по ключу, если промах - загружаю из БД, сохраняю в кэш с TTL и возвращаю. Например, для списка товаров:

GO
func GetProducts(ctx context.Context, ids []string) ([]Product, error) {
keys := make([]string, len(ids))
for i, id := range ids {
keys[i] = "product:" + id
}
// Пайплайн для массового чтения
results, err := rdb.MGet(ctx, keys...).Result()
if err != nil {
return nil, err
}
var products []Product
var missingIDs []string
for i, val := range results {
if val != nil {
var p Product
json.Unmarshal([]byte(val.(string)), &p)
products = append(products, p)
} else {
missingIDs = append(missingIDs, ids[i])
}
}
if len(missingIDs) > 0 {
// Загрузка из БД
dbProducts := loadFromDB(missingIDs)
// Сохранение в кэш с TTL 5 минут
pipe := rdb.Pipeline()
for _, p := range dbProducts {
data, _ := json.Marshal(p)
pipe.Set(ctx, "product:"+p.ID, data, 5*time.Minute)
}
pipe.Exec(ctx)
products = append(products, dbProducts...)
}
return products, nil
}

Также использовал Redis для:

  • Инвалидации кэша - удаление ключей при обновлении данных (например, DEL product:123).

  • Rate limiting - счётчики через INCR и EXPIRE.

  • Сессий - хранение JWT-токенов с TTL.

  • Очередей - через BRPOP для фоновых задач.

Важно: сериализация через JSON/msgpack, мониторинг попаданий через INFO commandstats, установка разумного TTL (от секунд до часов) в зависимости от частоты обновления данных.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью