package gocommon import ( "context" "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) (*redis.Client, error) { if !*devflag { return newRedisClient(uri, 0), nil } option, err := redis.ParseURL(uri) if err != nil { return nil, err } zero := option zero.DB = 0 rdb := redis.NewClient(zero) defer rdb.Close() hostname, _ := os.Hostname() myidx, _ := rdb.HGet(context.Background(), "private_db", hostname).Result() if len(myidx) > 0 { offset, _ := strconv.Atoi(myidx) option.DB += offset return redis.NewClient(option), nil } alldbs, err := rdb.HGetAll(context.Background(), "private_db").Result() if err != nil { 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 } option.DB += newidx return redis.NewClient(option), nil }