server-status-server/dao/mem_store.go
2024-10-02 08:29:09 +08:00

81 lines
1.4 KiB
Go

package dao
import (
"encoding/gob"
"github.com/LiteyukiStudio/go-logger/log"
"os"
"time"
)
var memStore = make(map[string]interface{})
func Save(key string, value interface{}) {
memStore[key] = value
}
func Delete(key string) error {
if _, ok := memStore[key]; ok {
delete(memStore, key)
return nil
} else {
return os.ErrNotExist
}
}
func Get(key string) interface{} {
if v, ok := memStore[key]; ok {
return v
}
return nil
}
func GetAll() map[string]interface{} {
return memStore
}
// init 初始化,从磁盘加载数据到内存
func init() {
gob.Register(Report{})
file, err := os.Open("data.gob")
if err != nil {
log.Error("Open file error: ", err)
}
log.Info("Open file success")
defer file.Close()
decoder := gob.NewDecoder(file)
err = decoder.Decode(&memStore)
if err != nil {
log.Error("Decode error: ", err)
}
// 启动定期持久化goroutine
go func() {
for {
err := persist()
if err != nil {
log.Error("Persist error: ", err)
}
log.Info("Persist success")
time.Sleep(30 * time.Second)
}
}()
}
// persist 持久化,定期将内存中的数据持久化到磁盘
func persist() error {
file, err := os.OpenFile("data.gob", os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Error("Open file error: ", err)
return err
}
defer file.Close()
encoder := gob.NewEncoder(file)
err = encoder.Encode(memStore)
if err != nil {
log.Error("Encode error: ", err)
return err
}
return nil
}