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
 | |
| }
 |