mirror of
https://github.com/snowykami/server-status-server.git
synced 2025-06-06 15:15:22 +00:00
81 lines
1.4 KiB
Go
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
|
|
}
|