最近在捣鼓golang,其中用线上数据全放在redis里,以前写死的配置有点不太适合了,热加载才是王道!
俗话说不会搜索的程序员不是一个好程序员(误
观摩了一下其他大佬的写法,大多都是采用定时器+goroutine
实现的。难度不大,开始码
配置文件结构体
假设一下我们的配置文件是json文件,那应该就是下面这样
// conf.json
{
"host": "127.0.0.1",
"port": 6379,
"passwd": "",
"db": 0
}
首先肯定是要写一个跟它一模一样的结构体出来
//json配置文件结构体
type Content struct {
Host string `json:"host"`
Port int `json:"port"`
Passwd string `json:"passwd"`
Db int `json:"db"`
}
如果继续在此结构体上编写操作函数不太稳妥,序列化json也是直接操作的指针。之前拆散它们的试错,最后还是让它们在一起了233
优化结构体
将文件名,同步锁,最后修改时间,配置文件结构体整合一起
//配置结构体
type Config struct {
Filename string
LastModifyTime int64
Lock *sync.RWMutex
Data interface{}
}
编写实例配置的工厂函数(这个有点约定俗成的规矩,具体出处你们自己去考证吧,好处挺多的)
func NewConfig(filename string, data interface{}) *Config {
conf := &Config{
Filename: filename,
Data: data,
Lock: &sync.RWMutex{},
}
conf.parse()
go conf.reload()
return conf
}
这里把配置结构体配置了默认参数,外部传入参数是配置文件的文件名和配置文件结构体,这里data的类型为接口类型,好处是Config
可以独立出来,代码多处复用。我们还使用了conf.parse()
方法,第一次解析文件,go conf.reload()
方法单独起一个goroutine跑(具体效果看后面),结果当然返回本体了
- 阅读剩余部分 -