多个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)
}
......
本帖已被设为精华帖!
本帖由系统于 1年前 自动加精
GetStringMapString是什么函数呀