72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
package cache
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
var Client *redis.Client
|
|
|
|
func Connect(redisURL string) error {
|
|
opt, err := redis.ParseURL(redisURL)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse redis URL: %w", err)
|
|
}
|
|
|
|
Client = redis.NewClient(opt)
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
if err = Client.Ping(ctx).Err(); err != nil {
|
|
return fmt.Errorf("failed to ping redis: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func Close() {
|
|
if Client != nil {
|
|
Client.Close()
|
|
}
|
|
}
|
|
|
|
func GetClient() *redis.Client {
|
|
return Client
|
|
}
|
|
|
|
func SearchKey(query, lang string, page, perPage int) string {
|
|
return fmt.Sprintf("search:%s:%s:%d:%d", query, lang, page, perPage)
|
|
}
|
|
|
|
func NewsKey(newsID int64, lang string) string {
|
|
return fmt.Sprintf("news:%d:%s", newsID, lang)
|
|
}
|
|
|
|
func FeedKey(feedID int64) string {
|
|
return fmt.Sprintf("feed:%d", feedID)
|
|
}
|
|
|
|
func Set(ctx context.Context, key string, value interface{}, expiration time.Duration) error {
|
|
data, err := json.Marshal(value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return Client.Set(ctx, key, data, expiration).Err()
|
|
}
|
|
|
|
func Get(ctx context.Context, key string) (string, error) {
|
|
return Client.Get(ctx, key).Result()
|
|
}
|
|
|
|
func Unmarshal(data []byte, v interface{}) error {
|
|
return json.Unmarshal(data, v)
|
|
}
|
|
|
|
func Marshal(v interface{}) ([]byte, error) {
|
|
return json.Marshal(v)
|
|
}
|