> Как реализовать TTL кэш на Redis без использования таблиц (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Русклимат
Стек: Redis, Go
> Пример ответа
Для реализации TTL-кэша на Redis без использования таблиц (то есть без реляционной БД) в Go можно использовать встроенный механизм истечения ключей Redis. Вот пример:
GOpackage cacheimport ("context""encoding/json""time""github.com/go-redis/redis/v8")type RedisCache struct {client *redis.Client}func NewRedisCache(addr string) *RedisCache {return &RedisCache{client: redis.NewClient(&redis.Options{Addr: addr,}),}}func (c *RedisCache) Set(ctx context.Context, key string, value interface{}, ttl time.Duration) error {data, err := json.Marshal(value)if err != nil {return err}// Используем SET с EX (expire) для автоматического TTLreturn c.client.Set(ctx, key, data, ttl).Err()}func (c *RedisCache) Get(ctx context.Context, key string, dest interface{}) (bool, error) {data, err := c.client.Get(ctx, key).Bytes()if err == redis.Nil {return false, nil // ключ не найден или истёк}if err != nil {return false, err}if err := json.Unmarshal(data, dest); err != nil {return false, err}return true, nil}
Ключевые моменты:
- Redis сам удаляет ключи по TTL (команда
EXPIREили параметрEXвSET) - Не нужно хранить отдельные таблицы с временем жизни - Redis делает это атомарно
- Для сложной логики (например, обновление TTL при чтении) используйте
EXPIREпослеGET - Для массового удаления используйте
SCANс паттерном или префиксом ключей
Этот подход масштабируется, не требует дополнительных структур данных и полностью использует возможности Redis.
> Похожие задачи по Go
Как организовать мьютексы для многопоточной работы с данными по разным пользователям без блокировки всего стореджа
Подходит ли слайс в Go для хранения и частого увеличения массива событий
Как масштабировать сервис коротких ссылок и настроить балансировку нагрузки
Что такое starvation локальной очереди и когда она возникает
> Похожие задачи по backend
Как организовать мьютексы для многопоточной работы с данными по разным пользователям без блокировки всего стореджа
Подходит ли слайс в Go для хранения и частого увеличения массива событий
Как масштабировать сервис коротких ссылок и настроить балансировку нагрузки
Что происходит, если по userId пользователь не найден?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью