241 lines
5.0 KiB
Go
241 lines
5.0 KiB
Go
package biz
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
go_redis_orm "github.com/fananchong/go-redis-orm.v2"
|
|
"github.com/go-kratos/kratos/v2/log"
|
|
v1 "sandc/api/eonline/v1"
|
|
"sandc/app/eonline/internal/conf"
|
|
)
|
|
|
|
var (
|
|
G_SvrData *SvrData
|
|
MutexSvrData sync.RWMutex
|
|
ERR_INIT_USER_DATA = errors.New("init db user data error")
|
|
)
|
|
|
|
const (
|
|
db_name = "my_redis_db"
|
|
NS2MS int64 = 1_000_000 // 纳秒转换成毫秒,需要的被除数
|
|
)
|
|
|
|
func InitSvrData(bootstrap *conf.Bootstrap) {
|
|
go_redis_orm.SetNewRedisHandler(go_redis_orm.NewDefaultRedisClient)
|
|
err := go_redis_orm.CreateDB(db_name, []string{bootstrap.Data.Redis.Addr}, bootstrap.Data.Redis.Password, int(bootstrap.Data.Redis.Db))
|
|
if nil != err {
|
|
log.Fatalf("go_redis_orm.CreateDB err: dbName[%v] Idx[%v] Redis[%v] err[%v]", db_name, bootstrap.Data.Redis.Db, bootstrap.Data.Redis.Addr, err)
|
|
}
|
|
|
|
err = loadSvrData(uint32(bootstrap.Server.SvrId))
|
|
if err != nil {
|
|
log.Fatal("loadSvrData error: %v", err)
|
|
} else {
|
|
log.Infof("loadSvrData success")
|
|
}
|
|
}
|
|
|
|
func SaveSvrDataOnTimer() {
|
|
begin := time.Now().UnixNano()
|
|
|
|
var save map[string]interface{}
|
|
getSaveDataSvrData(&save)
|
|
|
|
var err error
|
|
go func() {
|
|
begin := time.Now().UnixNano()
|
|
|
|
err = saveDataSvrData(&save)
|
|
if err != nil {
|
|
log.Infof("saveDataSvrData error: %v", err)
|
|
}
|
|
save = nil
|
|
|
|
end := time.Now().UnixNano()
|
|
delta := end - begin
|
|
log.Infof("saveDataSvrData: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS)
|
|
}()
|
|
|
|
end := time.Now().UnixNano()
|
|
delta := end - begin
|
|
log.Infof("SaveSvrDataOnTimer: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS)
|
|
}
|
|
|
|
func SaveSvrDataShutDown() {
|
|
begin := time.Now().UnixNano()
|
|
|
|
err := saveDataSvrData2()
|
|
if err != nil {
|
|
log.Infof("saveSvrDataShutDown error: %v", err)
|
|
}
|
|
|
|
end := time.Now().UnixNano()
|
|
delta := end - begin
|
|
log.Infof("SaveSvrDataShutDown: begin[%dns] end[%dns], spend[%dms %dns]", begin, end, delta/NS2MS, delta%NS2MS)
|
|
}
|
|
|
|
func loadSvrData(key uint32) error {
|
|
MutexSvrData.Lock()
|
|
defer MutexSvrData.Unlock()
|
|
|
|
G_SvrData = NewSvrData(db_name, key)
|
|
|
|
if G_SvrData.IsLoad() {
|
|
log.Infof("神奇的已加载数据 SvrData")
|
|
return nil
|
|
}
|
|
|
|
var hasKey int
|
|
var err error
|
|
|
|
hasKey, err = G_SvrData.HasKey()
|
|
switch hasKey {
|
|
case 1:
|
|
err = G_SvrData.Load()
|
|
if err == nil {
|
|
initValueSvrDataOnLoad(key)
|
|
}
|
|
case 0:
|
|
// new
|
|
err := initValueSvrData(key)
|
|
if err != nil {
|
|
log.Error("initValueSvrData %v data error: %v", key, err)
|
|
return ERR_INIT_USER_DATA
|
|
}
|
|
case -1:
|
|
return err
|
|
default:
|
|
log.Error("loadSvrData HasKey key[%v] hasKey[%d] error: %v", key, hasKey, err)
|
|
return errors.New(fmt.Sprintf("error haskey[%d]", hasKey))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func initValueSvrData(key uint32) error {
|
|
initValueSvrDataOnLoad(key)
|
|
|
|
return nil
|
|
}
|
|
func initValueSvrDataOnLoad(key uint32) {
|
|
bChange := false
|
|
data := G_SvrData.GetData(false)
|
|
if data.LstChat == nil {
|
|
bChange = true
|
|
data.LstChat = []*v1.PbMsgOne{}
|
|
}
|
|
// if data.MapReportData == nil {
|
|
// bChange = true
|
|
// data.MapReportData = map[string]*v1.PbReportData{}
|
|
// }
|
|
|
|
if bChange {
|
|
G_SvrData.GetData(true)
|
|
}
|
|
|
|
}
|
|
|
|
func getSaveDataSvrData(temp *map[string]interface{}) error {
|
|
MutexSvrData.Lock()
|
|
defer MutexSvrData.Unlock()
|
|
|
|
var err error
|
|
*temp, err = G_SvrData.DirtyData()
|
|
return err
|
|
}
|
|
|
|
func saveDataSvrData(temp *map[string]interface{}) error {
|
|
MutexSvrData.RLock()
|
|
defer MutexSvrData.RUnlock()
|
|
|
|
var err error
|
|
err = G_SvrData.Save2(*temp)
|
|
return err
|
|
}
|
|
|
|
func saveDataSvrData2() error {
|
|
MutexSvrData.Lock()
|
|
defer MutexSvrData.Unlock()
|
|
|
|
var err error
|
|
err = G_SvrData.Save()
|
|
return err
|
|
}
|
|
|
|
func AddChat(req *v1.AddChatReq) {
|
|
MutexSvrData.Lock()
|
|
defer MutexSvrData.Unlock()
|
|
|
|
lst := &G_SvrData.GetData(true).LstChat
|
|
*lst = append(*lst, &v1.PbMsgOne{
|
|
TimeStamp: time.Now().UnixNano(),
|
|
Uuid: req.Uuid,
|
|
Name: "",
|
|
Msg: req.Msg,
|
|
})
|
|
|
|
lstNum := len(*lst)
|
|
if lstNum > 100 {
|
|
*lst = (*lst)[lstNum-100:]
|
|
}
|
|
}
|
|
|
|
func GetChat(timeStamp int64) []*v1.PbMsgOne {
|
|
MutexSvrData.RLock()
|
|
defer MutexSvrData.RUnlock()
|
|
|
|
lst := G_SvrData.GetData(false).LstChat
|
|
|
|
if timeStamp <= 0 {
|
|
return lst
|
|
}
|
|
|
|
for k, v := range lst {
|
|
if v.TimeStamp >= timeStamp {
|
|
return lst[k:]
|
|
}
|
|
}
|
|
|
|
return lst
|
|
}
|
|
|
|
func AddReportOne(key string, data *v1.PbReportData) {
|
|
// MutexSvrData.Lock()
|
|
// defer MutexSvrData.Unlock()
|
|
//
|
|
// now := uint32(time.Now().Unix())
|
|
//
|
|
// svrData := G_SvrData.GetData(true)
|
|
// lst := &svrData.MapReportData
|
|
//
|
|
// // 清理超时的
|
|
// if svrData.RfClearReportData+30*60 <= now {
|
|
// svrData.RfClearReportData = now
|
|
//
|
|
// for k, v := range *lst {
|
|
// if v.Rf+15*60*60 <= now { // 提现平台最后一次发送回调消息是14小时
|
|
// delete(*lst, k)
|
|
// }
|
|
// }
|
|
// }
|
|
//
|
|
// (*lst)[key] = data
|
|
}
|
|
|
|
func GetReportOne(key string) *v1.PbReportData {
|
|
// MutexSvrData.Lock()
|
|
// defer MutexSvrData.Unlock()
|
|
//
|
|
// lst := &G_SvrData.GetData(false).MapReportData
|
|
//
|
|
// if v, ok := (*lst)[key]; ok {
|
|
// delete(*lst, key)
|
|
// return v
|
|
// }
|
|
//
|
|
return nil
|
|
}
|