> Как реализовать TTL кэш на Redis без использования таблиц (Go)

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

Компании: Русклимат

Стек: Redis, Go

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

Для реализации TTL-кэша на Redis без использования таблиц (то есть без реляционной БД) в Go можно использовать встроенный механизм истечения ключей Redis. Вот пример:

GO
package cache
import (
"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) для автоматического TTL
return 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.

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

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