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 }