Files
gocommon/redis.go

59 lines
1.2 KiB
Go

package gocommon
import (
"context"
"net/url"
"os"
"strconv"
"github.com/go-redis/redis/v8"
)
func newRedisClient(uri string, dbidxoffset int) *redis.Client {
option, err := redis.ParseURL(uri)
if err != nil {
return nil
}
option.DB += dbidxoffset
return redis.NewClient(option)
}
func NewRedisClient(uri string, dbidx int) (*redis.Client, error) {
if !*devflag {
return newRedisClient(uri, dbidx), nil
}
rdb := newRedisClient(uri, 0)
devUrl, _ := url.Parse(uri)
hostname, _ := os.Hostname()
myidx, _ := rdb.HGet(context.Background(), "private_db", hostname).Result()
if len(myidx) > 0 {
devUrl.Path = "/" + myidx
return newRedisClient(devUrl.String(), dbidx), nil
}
alldbs, err := rdb.HGetAll(context.Background(), "private_db").Result()
if err != nil {
rdb.Close()
return nil, err
}
maxidx := 0
for _, prvdb := range alldbs {
actualidx, _ := strconv.Atoi(prvdb)
if maxidx < actualidx {
maxidx = actualidx
}
}
newidx := maxidx + 1
_, err = rdb.HSet(context.Background(), "private_db", hostname, newidx).Result()
if err != nil {
return nil, err
}
devUrl.Path = "/" + strconv.Itoa(newidx)
return newRedisClient(devUrl.String(), dbidx), nil
}