多个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)
}
......
本帖已被设为精华帖!
本帖由系统于 7个月前 自动加精
讨论数量: 5
type redisClients struct {
    clients []*redis.Client
    num int
}

func (r *redisClients) addCli(cli *redis.Client) {
    r.clients = append(r.clients,cli)
    r.num = len(r.clients)
}

func (r *redisClients) getCli(key string) *redis.Client {
    // 根据key 一致性hash算法得出hashVal
    hashVal := 66666666
    i := hashVal % r.num
    return r.clients[i]
}

func (r *redisClients) Set(key string,val string)  {
    r.getCli(key).Set(key,val)
}
2年前 评论

GetStringMapString是什么函数呀

2年前 评论
ezreal_rao (楼主) 2年前
ezreal_rao (楼主) 2年前
Lion- (作者) 2年前

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