多个Redis实例实现

db一样,项目中有可能需要有不同的redis连接,所以基于该问题,对代码进行了一点小的改动:

pkg/redis/redis.go 文件

......

// RedisClient Redis Client 服务
type  RedisClient  struct {
    Client *redis.Client
    Context context.Context
}

// RedisClientConfig redis 链接配置信息
type  RedisClientConfig  struct {
    Host string
    Username string
    Password string
    DB int
}

// RedisConfigs 分组配置信息
type  RedisConfigs  map[string]*RedisClientConfig

// once 确保全局Redis对象只实例一次
var  once sync.Once

// redisCollections redis对象集合
var  redisCollections  map[string]*RedisClient

// Redis 根据 redis 分组名获取一个 redis 链接
func  Redis(name ...string) *RedisClient {
    if  len(name) >  0 {
        if  rds, ok  := redisCollections[name[0]]; ok {
            return rds
        }
        return  nil
    }
    return redisCollections["default"]
}

// ConnectRedis 连接 redis 数据库,设置全局的 Redis 对象
func  ConnectRedis(configs RedisConfigs) {
    once.Do(func() {
        if redisCollections ==  nil {
            redisCollections  =  make(map[string]*RedisClient, len(redisCollections))
        }

        for  name, config  :=  range configs {
            redisCollections[name] =  NewClient(config.Host, config.Username, config.Password, config.DB)
        }
    })
}
......

bootstrap/redis.go

......
// SetupRedis 初始化 Redis
func  SetupRedis() {
    redisConfigs  :=  make(redis.RedisConfigs)
    cfg  := config.GetStringMapString("redis")
    for  k  :=  range cfg {
        redisConfigs[k] =  &redis.RedisClientConfig{
            Host: fmt.Sprintf("%v:%v", config.GetString("redis."+k+".host"), config.GetString("redis."+k+".port")),
            Username: config.GetString("redis."  + k +  ".username"),
            Password: config.GetString("redis."  + k +  ".password"),
            DB: config.GetInt("redis."  + k +  ".database"),
        }
    }
    redis.ConnectRedis(redisConfigs)
}
......
讨论数量: 4

勤劳的人都用map 懒人只能依附在struct上

6天前 评论
ezreal_rao (楼主) 6天前
耳东 (作者) 5天前
ezreal_rao (楼主) 5天前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!