将数据写到文件里面
假设内存里面的数据是一个map,go可以判断当前文件夹是否存在,若不存在可以创建,也可以判断当前文件是否存在,若不存在可以创建,创建好文件之后,我们可以将数据序列化,并写到文件中,可以是覆盖之前的数据,也可以是append追加
// SaveData 分为两个文件保存,一个保存全部的数据,一个保存当前的数据
func (c *cache) SaveData(path ...string) error {
var (
file *os.File
nowFile *os.File
nowFileErr error
err error
)
if len(path) > 1 {
fmt.Println("只能传入一个路径")
return fmt.Errorf("只能传入一个路径")
} else if len(path) == 1 {
// 判断路径是否存在,否则创建路径
if _, err := os.Stat(path[0]); os.IsNotExist(err) {
// 创建
err = os.MkdirAll(path[0], os.ModePerm)
if err != nil {
fmt.Printf("os.MkdirAll callee failed:%+v", err)
return err
}
}
nowFile, nowFileErr = os.OpenFile(fmt.Sprintf("%s\\%s.log", path[0], "nowData"), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600) // 覆盖
file, err = os.OpenFile(fmt.Sprintf("%s\\%s.log", path[0], "allData"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) // 追加
} else {
nowFile, nowFileErr = os.OpenFile(fmt.Sprintf("%s.log", "nowData"), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
file, err = os.OpenFile(fmt.Sprintf("%s.log", "allData"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
}
if nowFileErr != nil {
fmt.Printf("os.OpenFile callee failed:%+v", err)
return err
}
if err != nil {
fmt.Printf("os.OpenFile callee failed:%+v", err)
return err
}
defer nowFile.Close()
defer file.Close()
c.rw.RLock()
defer c.rw.RUnlock()
// 对数据编码
content, _ := json.Marshal(c.items)
_, _ = file.Write([]byte(time.Now().Format(TIME_FORMAT)))
_, _ = file.Write(content)
_, _ = file.Write([]byte("\n"))
// 当前数据
_, _ = nowFile.Write(content)
fmt.Println("数据写结束")
return nil
}
将文件里面的数据加载到内存里面
// LoadFile 加载文件里面的数据到内存中
func (c *cache) LoadFile(fileName string) error {
items := map[string]Item{}
datas, err := ioutil.ReadFile(fileName)
if err != nil {
fmt.Println("ioutil.ReadFile(fileName) error:", err)
return err
}
err = json.Unmarshal(datas, &items)
if err != nil {
fmt.Println("反序列化失败:", err)
return err
}
//
c.rw.Lock()
for k, v := range items {
value, found := c.items[k]
if !found || value.Expired() {
c.items[k] = v
}
}
c.rw.Unlock()
return nil
}
网友评论