优化排行榜RankService,支持RPC接口新增排行榜功能

This commit is contained in:
orgin
2022-11-23 17:22:58 +08:00
parent 975cf93d58
commit afb04cac7f
6 changed files with 145 additions and 134 deletions

View File

@@ -129,20 +129,23 @@ func (mp *MongoPersist) ReadCfg() error {
func (mp *MongoPersist) OnStart() {
}
func (mp *MongoPersist) OnFinishSetupRank(mapRankSkip map[uint64]*RankSkip) error{
mp.mapRankSkip = map[uint64]IRankSkip{}
for rankId,rank := range mapRankSkip {
mp.mapRankSkip[rankId] = rank
func (mp *MongoPersist) OnSetupRank(manual bool,rankSkip *RankSkip) error{
if mp.mapRankSkip == nil {
mp.mapRankSkip = map[uint64]IRankSkip{}
}
for rankId,rank := range mp.mapRankSkip{
err := mp.loadFromDB(rankId,rank.GetRankName())
if err != nil {
log.SError("load from db is fail :%s",err.Error())
return err
}
mp.mapRankSkip[rankSkip.GetRankID()] = rankSkip
if manual == true {
return nil
}
log.SRelease("start load rank ",rankSkip.GetRankName()," from mongodb.")
err := mp.loadFromDB(rankSkip.GetRankID(),rankSkip.GetRankName())
if err != nil {
log.SError("load from db is fail :%s",err.Error())
return err
}
log.SRelease("finish load rank ",rankSkip.GetRankName()," from mongodb.")
return nil
}

View File

@@ -17,7 +17,8 @@ type IRankSkip interface {
type IRankModule interface {
service.IModule
OnFinishSetupRank(map[uint64]*RankSkip) error //当完成安装排行榜对象时
OnSetupRank(manual bool,rankSkip *RankSkip) error //当完成安装排行榜对象时
OnStart() //服务开启时回调
OnEnterRank(rankSkip IRankSkip, enterData *RankData) //进入排行
OnLeaveRank(rankSkip IRankSkip, leaveData *RankData) //离开排行

View File

@@ -48,6 +48,30 @@ func (rs *RankService) SetupRankModule(rankModule IRankModule) {
rs.rankModule = rankModule
}
// RPC_ManualAddRankSkip 提供手动添加排行榜
func (rs *RankService) RPC_ManualAddRankSkip(addInfo *rpc.AddRankList, addResult *rpc.RankResult) error {
for _, addRankListData := range addInfo.AddList {
if addRankListData.RankId == 0 {
return fmt.Errorf("RPC_AddRankSkip must has rank id")
}
//重复的排行榜信息不允许添加
rank := rs.mapRankSkip[addRankListData.RankId]
if rank != nil {
continue
}
newSkip := NewRankSkip(addRankListData.RankId,addRankListData.RankName,addRankListData.IsDec, transformLevel(addRankListData.SkipListLevel), addRankListData.MaxRank,time.Duration(addRankListData.ExpireMs)*time.Millisecond)
newSkip.SetupRankModule(rs.rankModule)
rs.mapRankSkip[addRankListData.RankId] = newSkip
rs.rankModule.OnSetupRank(true,newSkip)
}
addResult.AddCount = 1
return nil
}
// RPC_UpsetRank 更新排行榜
func (rs *RankService) RPC_UpsetRank(upsetInfo *rpc.UpsetRankData, upsetResult *rpc.RankResult) error {
rankSkip, ok := rs.mapRankSkip[upsetInfo.RankId]
@@ -187,9 +211,13 @@ func (rs *RankService) dealCfg() error {
newSkip := NewRankSkip(uint64(rankId),rankName,isDec, transformLevel(int32(level)), uint64(maxRank),time.Duration(expireMs)*time.Millisecond)
newSkip.SetupRankModule(rs.rankModule)
rs.mapRankSkip[uint64(rankId)] = newSkip
err := rs.rankModule.OnSetupRank(false,newSkip)
if err != nil {
return err
}
}
return rs.rankModule.OnFinishSetupRank(rs.mapRankSkip)
return nil
}

View File

@@ -1,76 +0,0 @@
syntax = "proto3";
package rpc;
option go_package = ".;rpc";
// RankData 排行数据
message RankData {
uint64 Key = 1; //数据主建
repeated int64 SortData = 2; //参与排行的数据
bytes Data = 3; //不参与排行的数据
int64 expireMs = 4; //剩余有效时间毫秒如果为0永不过期
}
// RankPosData 排行数据——查询返回
message RankPosData {
uint64 Key = 1; //数据主建
uint64 RankPos = 2; //名次
repeated int64 SortData = 3; //参与排行的数据
bytes Data = 4; //不参与排行的数据
}
// RankList 排行榜数据
message RankList {
uint64 RankId = 1; //排行榜类型
int32 SkipListLevel = 2; //排行榜level-生成的跳表的level, 8/16/32/64等
bool IsDec = 3; //不参与排行的数据
uint64 MaxRank = 4; //最大排名
}
// UpsetRankData 更新排行榜数据
message UpsetRankData {
uint64 RankId = 1; //排行榜的ID
repeated RankData RankDataList = 2; //排行数据
}
// DeleteByKey 更新排行榜数据
message DeleteByKey {
uint64 RankId = 1; //排行榜的分类ID
repeated uint64 KeyList = 2; //排行数据
}
// AddRankList 新增排行榜
message AddRankList {
repeated RankList AddList = 1; //添加的排行榜列表
}
// FindRankDataByKey 查找排行信息
message FindRankDataByKey {
uint64 RankId = 1; //排行榜的ID
uint64 Key = 2; //排行的key
}
// FindRankDataByPos 查找排行信息
message FindRankDataByPos {
uint64 RankId = 1; //排行榜的ID
uint64 Pos = 2; //排行名次
}
// FindRankDataListStartTo 查找排行信息,StartPos开始Count个
message FindRankDataListStartTo {
uint64 RankId = 1; //排行榜的ID
uint64 StartPos = 2; //排行的位置 0开始
uint64 Count = 3; //查询格式
}
// RankDataList
message RankDataList {
uint64 RankDataCount = 1; //排行长度
repeated RankPosData RankPosDataList = 2; //排行数据
}
// RankResult
message RankResult {
int32 AddCount = 1; //增加记录
int32 RemoveCount = 2; //删除数量
int32 ModifyCount = 3; //修改数量
}