77 lines
1.4 KiB
Go
Raw Normal View History

2024-07-11 16:37:26 +08:00
package cache
import (
2025-01-14 00:42:18 -08:00
"context"
2024-07-11 16:37:26 +08:00
"fmt"
"net/url"
"strings"
2025-01-14 00:42:18 -08:00
2024-07-11 16:37:26 +08:00
"ultone/internal/tool"
2025-01-14 00:42:18 -08:00
"gitea.com/taozitaozi/gredis"
"github.com/go-redis/redis/v8"
)
2024-07-11 16:37:26 +08:00
2025-01-14 00:42:18 -08:00
func New(ctx context.Context, uri string) (Cache, error) {
2024-07-11 16:37:26 +08:00
var (
2025-01-14 00:42:18 -08:00
err error
newClient Cache
strs = strings.Split(uri, "::")
2024-07-11 16:37:26 +08:00
)
switch strs[0] {
case "memory":
gc := gredis.NewGredis(1024 * 1024)
2025-01-14 00:42:18 -08:00
newClient = &_mem{client: gc}
2024-07-11 16:37:26 +08:00
case "lru":
2025-01-14 00:42:18 -08:00
if newClient, err = newLRUCache(); err != nil {
return nil, err
2024-07-11 16:37:26 +08:00
}
case "redis":
var (
ins *url.URL
err error
)
if len(strs) != 2 {
2025-01-14 00:42:18 -08:00
return nil, fmt.Errorf("cache.Init: invalid cache uri: %s", uri)
2024-07-11 16:37:26 +08:00
}
uri := strs[1]
if !strings.Contains(uri, "://") {
uri = fmt.Sprintf("redis://%s", uri)
}
if ins, err = url.Parse(uri); err != nil {
2025-01-14 00:42:18 -08:00
return nil, fmt.Errorf("cache.Init: url parse cache uri: %s, err: %s", uri, err.Error())
2024-07-11 16:37:26 +08:00
}
addr := ins.Host
username := ins.User.Username()
password, _ := ins.User.Password()
var rc *redis.Client
rc = redis.NewClient(&redis.Options{
Addr: addr,
Username: username,
Password: password,
})
if err = rc.Ping(tool.Timeout(5)).Err(); err != nil {
2025-01-14 00:42:18 -08:00
return nil, fmt.Errorf("cache.Init: redis ping err: %s", err.Error())
2024-07-11 16:37:26 +08:00
}
2025-01-14 00:42:18 -08:00
newClient = &_redis{client: rc}
2024-07-11 16:37:26 +08:00
default:
2025-01-14 00:42:18 -08:00
return nil, fmt.Errorf("cache type %s not support", strs[0])
2024-07-11 16:37:26 +08:00
}
2025-01-14 00:42:18 -08:00
return newClient, nil
}
func Init(ctx context.Context, uri string) (err error) {
Client, err = New(ctx, uri)
return
2024-07-11 16:37:26 +08:00
}