Files
gocommon/redis.go

71 lines
1.6 KiB
Go

package common
import (
"context"
"net/url"
"os"
"strconv"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/bson/primitive"
)
type Authinfo struct {
Accid primitive.ObjectID `bson:"_id,omitempty" json:"_id,omitempty"`
ServiceCode string `bson:"code" json:"code"`
Platform string
Uid string
Token string
Sk primitive.ObjectID
RefreshToken string `bson:"refresh_token,omitempty" json:"refresh_token,omitempty"`
Expired primitive.DateTime `bson:"_ts" json:"_ts"`
}
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
}