package cache import ( "context" "encoding/json" "time" "github.com/go-redis/redis/v8" ) type Cache struct { client *redis.Client ctx context.Context } func New(redisURL string) (*Cache, error) { opt, err := redis.ParseURL(redisURL) if err != nil { return nil, err } client := redis.NewClient(opt) ctx := context.Background() // Test connection if err := client.Ping(ctx).Err(); err != nil { return nil, err } return &Cache{ client: client, ctx: ctx, }, nil } func (c *Cache) Get(key string) ([]byte, error) { val, err := c.client.Get(c.ctx, key).Result() if err == redis.Nil { return nil, nil } if err != nil { return nil, err } return []byte(val), nil } func (c *Cache) Set(key string, value []byte, ttl time.Duration) error { return c.client.Set(c.ctx, key, value, ttl).Err() } func (c *Cache) Delete(key string) error { return c.client.Del(c.ctx, key).Err() } func (c *Cache) InvalidatePattern(pattern string) error { keys, err := c.client.Keys(c.ctx, pattern).Result() if err != nil { return err } if len(keys) > 0 { return c.client.Del(c.ctx, keys...).Err() } return nil } func (c *Cache) Close() error { return c.client.Close() }