69 lines
1.2 KiB
Go
69 lines
1.2 KiB
Go
|
|
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()
|
||
|
|
}
|