From 8a6de93be54abebbb80e4e0a7a8ce430deb20e7a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 10 Oct 2020 16:44:43 +0800 Subject: [PATCH] 1 --- server/rankserver/guildmgr.cc | 236 ++++++++++++------------- server/rankserver/guildmgr.h | 13 +- server/tools/protobuild/cs_proto.proto | 2 + third_party/a8engine | 2 +- 4 files changed, 119 insertions(+), 134 deletions(-) diff --git a/server/rankserver/guildmgr.cc b/server/rankserver/guildmgr.cc index f0bf38b..a006a36 100644 --- a/server/rankserver/guildmgr.cc +++ b/server/rankserver/guildmgr.cc @@ -13,11 +13,82 @@ #include "IMListener.h" #include "metamgr.h" -const size_t MAX_RANK_HUMAN_NUM = 50; +const size_t MAX_RANK_LIST_NUM = 50; +const size_t MAX_SORTED_LIST_NUM = 5000; const char* const NAME_MAGIC_SYMBOL = "@"; +static bool RankCmpFunc(const cs::MFGuildBasic* a, const cs::MFGuildBasic* b) +{ + if (a->guild_lv() > b->guild_lv()) { + return true; + } + if (a->guild_lv() < b->guild_lv()) { + return false; + } + if (a->guild_exp() > b->guild_exp()) { + return true; + } + if (a->guild_exp() < b->guild_exp()) { + return false; + } + return a->guild_id() > b->guild_id(); +} + +static bool SortedCmpFunc(const cs::MFGuildBasic* a, const cs::MFGuildBasic* b) +{ + if (a->guild_lv() > b->guild_lv()) { + return true; + } + if (a->guild_lv() < b->guild_lv()) { + return false; + } + if (a->guild_exp() > b->guild_exp()) { + return true; + } + if (a->guild_exp() < b->guild_exp()) { + return false; + } + return a->guild_id() > b->guild_id(); +} + +static void DbToGuildBasic(const std::vector& row, cs::MFGuildBasic* guild) +{ + guild->set_guild_id(a8::XValue(row[2])); + guild->set_guild_name(row[3]); + guild->set_guild_lv(a8::XValue(row[4])); + guild->set_guild_exp(a8::XValue(row[5])); + guild->set_guild_badge(a8::XValue(row[6])); + guild->set_guild_declaration(row[8]); + guild->set_owner_id(row[9]); + guild->set_owner_name(row[10]); + guild->set_owner_avatar_url(row[11]); + guild->set_join_unlimited(a8::XValue(row[16])); + guild->set_join_cond1(a8::XValue(row[17])); + guild->set_join_cond2(a8::XValue(row[18])); + guild->set__gameid(a8::XValue(row[1])); + guild->set__channel(a8::XValue(row[21])); + guild->set__createtime(a8::XValue(row[19])); + guild->set__modifytime(a8::XValue(row[20])); + guild->set_member_num(a8::XValue(row[22])); +} + +static std::string GenSelectGuildSql(const std::string& where) +{ + std::string sql = + "SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, " + " guild_declaration, owner_id, owner_name, owner_avatar_url, " + " creator_id, creator_name, creator_avatar_url, guild_status, " + " join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel, guild_member_num " + "FROM `guild` "; + sql += where; + return sql; +} + void GuildMgr::Init() { + rank_cmp_func_ = RankCmpFunc; + sorted_cmp_func_ = SortedCmpFunc; + auto mysql_cluster_conf = JsonDataMgr::Instance()->GetMysqlClusterConf(); for (int i = 0; i < mysql_cluster_conf->Size(); ++i) { int instance_id = mysql_cluster_conf->At(i)->At("instance_id")->AsXValue(); @@ -84,6 +155,8 @@ void GuildMgr::__GuildCreate(f8::JsonHttpRequest* request) request->resp_xobj->SetVal("errmsg", ""); a8::XObject conn = DBEngine::Instance()->GetConnInfo(guild_id); guild->set_member_num(1); + guild->set__createtime(App::Instance()->nowtime); + guild->set__modifytime(App::Instance()->nowtime); DBEngine::Instance()->ExecAsyncScript ( conn, @@ -223,9 +296,6 @@ void GuildMgr::__GuildUpdate(f8::JsonHttpRequest* request) long long guild_id = request->request.At("guild_id")->AsXValue(); cs::MFGuildBasic* guild = GetGuildById(guild_id); if (guild) { - #if 0 - guild->set_guild_name(request->request.At("guild_name")->AsXValue().GetString()); - #endif guild->set_guild_badge(request->request.At("guild_badge")->AsXValue()); guild->set_guild_lv(request->request.At("guild_lv")->AsXValue()); guild->set_guild_exp(request->request.At("guild_exp")->AsXValue()); @@ -350,7 +420,7 @@ void GuildMgr::__GuildRank(f8::JsonHttpRequest* request) } int gameid = request->request.At("gameid")->AsXValue(); - std::vector* sorted_guild_list = GetGuildRank(gameid); + a8::CommonRank* sorted_guild_list = GetGuildRank(gameid); request->resp_xobj->SetVal("errcode", 0); request->resp_xobj->SetVal("errmsg", ""); @@ -360,8 +430,8 @@ void GuildMgr::__GuildRank(f8::JsonHttpRequest* request) request->resp_xobj->SetVal("_total_count", 0); a8::MutableXObject* guild_list = a8::MutableXObject::NewArray(); if (sorted_guild_list) { - request->resp_xobj->SetVal("_total_count", sorted_guild_list->size()); - for (auto& guild : *sorted_guild_list) { + request->resp_xobj->SetVal("_total_count", sorted_guild_list->Size()); + for (auto& guild : sorted_guild_list->GetList()) { a8::MutableXObject* guild_xobj = a8::MutableXObject::NewObject(); TypeConvert::Convert(guild, guild_xobj); guild_list->Push(*guild_xobj); @@ -447,7 +517,7 @@ cs::MFGuildBasic* GuildMgr::GetGuildByName(int gameid, int channel, const std::s return itr != name_hash_.end() ? itr->second : nullptr; } -std::vector* GuildMgr::GetGuildRank(int gameid) +a8::CommonRank* GuildMgr::GetGuildRank(int gameid) { auto itr = rank_list_.find(gameid); return itr != rank_list_.end() ? &itr->second : nullptr; @@ -464,11 +534,7 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx) DBEngine::Instance()->ExecAsyncQuery ( *JsonDataMgr::Instance()->GetMysqlConf(instance_id), - "SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, " - " guild_declaration, owner_id, owner_name, owner_avatar_url, " - " creator_id, creator_name, creator_avatar_url, guild_status, " - " join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel, guild_member_num " - "FROM `guild` WHERE idx > %d;", + GenSelectGuildSql("WHERE idx > %d;").c_str(), { last_idx }, @@ -482,21 +548,7 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx) if (data_set && !data_set->empty()) { for (auto& row : *data_set) { cs::MFGuildBasic* guild = new cs::MFGuildBasic; - guild->set_guild_id(a8::XValue(row[2])); - guild->set_guild_name(row[3]); - guild->set_guild_lv(a8::XValue(row[4])); - guild->set_guild_exp(a8::XValue(row[5])); - guild->set_guild_badge(a8::XValue(row[6])); - guild->set_guild_declaration(row[8]); - guild->set_owner_id(row[9]); - guild->set_owner_name(row[10]); - guild->set_owner_avatar_url(row[11]); - guild->set_join_unlimited(a8::XValue(row[16])); - guild->set_join_cond1(a8::XValue(row[17])); - guild->set_join_cond2(a8::XValue(row[18])); - guild->set__gameid(a8::XValue(row[1])); - guild->set__channel(a8::XValue(row[21])); - guild->set_member_num(a8::XValue(row[22])); + DbToGuildBasic(row, guild); GuildMgr::Instance()->AddGuild(guild); if (a8::XValue(row[0]).GetInt64() > last_idx) { last_idx = a8::XValue(row[0]); @@ -519,11 +571,7 @@ void GuildMgr::SyncGuild(int instance_id) DBEngine::Instance()->ExecAsyncQuery ( *JsonDataMgr::Instance()->GetMysqlConf(instance_id), - "SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, " - " guild_declaration, owner_id, owner_name, owner_avatar_url, " - " creator_id, creator_name, creator_avatar_url, guild_status, " - " join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel, guild_member_num " - "FROM `guild` WHERE modifytime > %d;", + GenSelectGuildSql("WHERE modifytime > %d;").c_str(), { sync_db_hash_[instance_id] }, @@ -536,25 +584,11 @@ void GuildMgr::SyncGuild(int instance_id) int last_sync_time = GuildMgr::Instance()->sync_db_hash_[instance_id]; for (auto& row : *data_set) { cs::MFGuildBasic* guild = new cs::MFGuildBasic; - guild->set_guild_id(a8::XValue(row[2])); - guild->set_guild_name(row[3]); - guild->set_guild_lv(a8::XValue(row[4])); - guild->set_guild_exp(a8::XValue(row[5])); - guild->set_guild_badge(a8::XValue(row[6])); - guild->set_guild_declaration(row[8]); - guild->set_owner_id(row[9]); - guild->set_owner_name(row[10]); - guild->set_owner_avatar_url(row[11]); - guild->set_join_unlimited(a8::XValue(row[16])); - guild->set_join_cond1(a8::XValue(row[17])); - guild->set_join_cond2(a8::XValue(row[18])); - guild->set__gameid(a8::XValue(row[1])); - guild->set__channel(a8::XValue(row[21])); - guild->set_member_num(a8::XValue(row[22])); - if (a8::XValue(row[20]).GetInt64() > last_sync_time) { - last_sync_time = a8::XValue(row[20]); - } + DbToGuildBasic(row, guild); GuildMgr::Instance()->UpdateGuild(guild); + if (guild->_modifytime() > last_sync_time) { + last_sync_time = guild->_modifytime(); + } delete guild; } if (last_sync_time > GuildMgr::Instance()->sync_db_hash_[instance_id]) { @@ -597,11 +631,7 @@ void GuildMgr::RefreshGuild(long long guild_id) DBEngine::Instance()->ExecAsyncQuery ( conn, - "SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, " - " guild_declaration, owner_id, owner_name, owner_avatar_url, " - " creator_id, creator_name, creator_avatar_url, guild_status, " - " join_unlimited, join_cond1, join_cond2, createtime, modifytime " - "FROM `guild` WHERE guild_id = %d;", + GenSelectGuildSql("WHERE guild_id = %d;").c_str(), { guild_id }, @@ -611,22 +641,10 @@ void GuildMgr::RefreshGuild(long long guild_id) { if (data_set && !data_set->empty()) { for (auto& row : *data_set) { - cs::MFGuildBasic* guild = GuildMgr::Instance()->GetGuildById(a8::XValue(row[2])); - if (guild) { - #if 0 - guild->set_guild_name(row[3]); - #endif - guild->set_guild_lv(a8::XValue(row[4])); - guild->set_guild_exp(a8::XValue(row[5])); - guild->set_guild_badge(a8::XValue(row[6])); - guild->set_guild_declaration(row[8]); - guild->set_owner_id(row[9]); - guild->set_owner_name(row[10]); - guild->set_owner_avatar_url(row[11]); - guild->set_join_unlimited(a8::XValue(row[13])); - guild->set_join_cond1(a8::XValue(row[14])); - guild->set_join_cond2(a8::XValue(row[15])); - } + cs::MFGuildBasic* guild = new cs::MFGuildBasic; + DbToGuildBasic(row, guild); + GuildMgr::Instance()->UpdateGuild(guild); + delete guild; } } }, @@ -639,48 +657,9 @@ void GuildMgr::RefreshGuild(long long guild_id) void GuildMgr::GenGuildRank() { - auto force_rank_list = - [this] (int gameid) -> std::vector& - { - auto itr = rank_list_.find(gameid); - if (itr != rank_list_.end()) { - return itr->second; - } - rank_list_[gameid] = std::vector(); - return rank_list_[gameid]; - }; rank_list_.clear(); for (auto& pair : id_hash_) { - auto guild = pair.second; - std::vector& rank_list = force_rank_list(guild->_gameid()); - UpdateRank(rank_list, guild); - } -} - -void GuildMgr::ResortRank(std::vector& rank_list) -{ - std::sort(rank_list.begin(), - rank_list.end(), - [] (cs::MFGuildBasic* a, cs::MFGuildBasic* b) -> bool - { - return GuildMgr::Instance()->CmpGuild(a, b); - }); -} - -void GuildMgr::UpdateRank(std::vector& rank_list, cs::MFGuildBasic* guild) -{ - if (rank_list.size() < MAX_RANK_HUMAN_NUM) { - if (std::find(rank_list.begin(), rank_list.end(), guild) == rank_list.end()) { - rank_list.push_back(guild); - ResortRank(rank_list); - } - } else { - if (CmpGuild(guild, rank_list[rank_list.size() - 1])) { - if (std::find(rank_list.begin(), rank_list.end(), guild) == rank_list.end()) { - rank_list[rank_list.size() - 1] = guild; - ResortRank(rank_list); - } - } + UpdateRank(pair.second); } } @@ -688,9 +667,6 @@ void GuildMgr::UpdateGuild(cs::MFGuildBasic* new_guild) { auto guild = GetGuildById(new_guild->guild_id()); if (guild) { - #if 0 - guild->set_guild_name(new_guild->guild_name()); - #endif guild->set_guild_lv(new_guild->guild_lv()); guild->set_guild_exp(new_guild->guild_exp()); guild->set_guild_badge(new_guild->guild_badge()); @@ -702,24 +678,30 @@ void GuildMgr::UpdateGuild(cs::MFGuildBasic* new_guild) guild->set_join_unlimited((new_guild->join_unlimited())); guild->set_join_cond1((new_guild->join_cond1())); guild->set_join_cond2((new_guild->join_cond2())); + UpdateRank(guild); } } -bool GuildMgr::CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b) +void GuildMgr::UpdateRank(cs::MFGuildBasic* guild) { - if (a->guild_lv() > b->guild_lv()) { - return true; + { + auto rank_list = a8::ForceCreateCommonRankList + ( + rank_list_, + guild->_gameid(), + rank_cmp_func_, + MAX_RANK_LIST_NUM); + rank_list.Update(guild); } - if (a->guild_lv() < b->guild_lv()) { - return false; + { + auto rank_list = a8::ForceCreateCommonRankList + ( + sorted_list_, + guild->_gameid(), + sorted_cmp_func_, + MAX_SORTED_LIST_NUM); + rank_list.Update(guild); } - if (a->guild_exp() > b->guild_exp()) { - return true; - } - if (a->guild_exp() < b->guild_exp()) { - return false; - } - return a->guild_id() > b->guild_id(); } void GuildMgr::InstallSyncGuildTimer() diff --git a/server/rankserver/guildmgr.h b/server/rankserver/guildmgr.h index 53893b1..3e42a50 100644 --- a/server/rankserver/guildmgr.h +++ b/server/rankserver/guildmgr.h @@ -1,5 +1,6 @@ #pragma once +#include #include namespace cs @@ -29,17 +30,15 @@ class GuildMgr : public a8::Singleton private: cs::MFGuildBasic* GetGuildById(long long guild_id); cs::MFGuildBasic* GetGuildByName(int gameid, int channel, const std::string& guild_name); - std::vector* GetGuildRank(int gameid); + a8::CommonRank* GetGuildRank(int gameid); void AddGuild(cs::MFGuildBasic* guild); void LoadGuild(int instance_id, long long last_idx); void SyncGuild(int instance_id); void OnOneDBDone(int instance_id); void RefreshGuild(long long guild_id); void GenGuildRank(); - void ResortRank(std::vector& rank_list); - void UpdateRank(std::vector& rank_list, cs::MFGuildBasic* guild); void UpdateGuild(cs::MFGuildBasic* new_guild); - bool CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b); + void UpdateRank(cs::MFGuildBasic* guild); void InstallSyncGuildTimer(); std::string GenGuildName(int gameid, int channel, const std::string& raw_name); void GuildRename(cs::MFGuildBasic* guild, const std::string& new_name); @@ -51,7 +50,9 @@ class GuildMgr : public a8::Singleton std::map sync_db_hash_; std::map id_hash_; std::map name_hash_; - std::map> rank_list_; - std::map> sorted_list_; + std::map> rank_list_; + std::map> sorted_list_; + std::function rank_cmp_func_; + std::function sorted_cmp_func_; std::map>> search_cache_; }; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 949e44a..2985db0 100644 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -115,6 +115,8 @@ message MFGuildBasic optional int32 _gameid = 100; //gameid optional int32 _channel = 101; //channel + optional int32 _createtime = 102; //createtime + optional int32 _modifytime = 103; //modifytime } //登录好友服 diff --git a/third_party/a8engine b/third_party/a8engine index a25550d..3a005b9 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit a25550d418277048506bb2815a192e15802dd19e +Subproject commit 3a005b95f4569756f525358f7fa9c116177d264c