public IEnumerator BackupTotalRankCoroutine(Coroutine coroutine) { var timeStr = ServerRankBackupManager.FormatDateTimeToKey(DateTime.Now); var rankMgr = ServerRankManager.TotalRank; DBRankBackupServer db = new DBRankBackupServer(); db.ServerId = rankMgr.ServerId; foreach (var rankMgrKV in rankMgr.rank) { DBRankList dbList = new DBRankList(); dbList.Type = rankMgrKV.Key; var rank = rankMgrKV.Value; int i = 0; foreach (var charId in rank.RankUUIDList) { if (dbList.Items.Count >= ServerRankBackupManager.MAXMember) { break; } DBRank_One one = null; if (!rank.DBRankCache.TryGetValue(charId, out one)) { continue; } DBRankItem item = new DBRankItem(); item.CharacterId = one.Guid; item.Name = one.Name; item.Value = one.Value; dbList.Items.Add(item); i++; } db.List.Add(dbList); } var key = string.Format("{0}|{1}", timeStr, db.ServerId); Logger.Trace("BackupAllRankCoroutine-----begin[{0}] key=[{1}]", DateTime.Now, key); var result = RankServer.Instance.DB.Set <DBRankBackupServer>(coroutine, DataCategory.RankBackup, key, db); yield return(result); if (DataStatus.Ok != result.Status) { Logger.Fatal("RankServer.Instance.DB.Set DataStatus.Ok != result.Status [{0}]", key); } Logger.Trace("BackupTotalRankCoroutine-----end[{0}] key=[{1}]", DateTime.Now, key); }
public IEnumerator SSGetRankDataByServerId(Coroutine coroutine, RankService _this, SSGetRankDataByServerIdInMessage msg) { var serverList = msg.Request.ServerList; var time = msg.Request.Time; var type = msg.Request.Ranktype; //请求这个时间点的数据不存在,那就把当前的排行榜数据存成那个时间点,防止下次再取时,又会取下次的排行榜,但排行榜会变化 var needSave = false; var timeStr = ServerRankBackupManager.FormatDateTimeToKey(DateTime.FromBinary(time)); foreach (var sid in serverList.Items) { string tempKey = timeStr + "|" + sid; DBRankBackupServer data = null; if (!ServerRankBackupManager.DictRankDataCache.TryGetValue(tempKey, out data)) { var result = RankServer.Instance.DB.Get <DBRankBackupServer>(coroutine, DataCategory.RankBackup, tempKey); yield return(result); if (DataStatus.Ok == result.Status && null != result.Data) { data = result.Data; if (ServerRankBackupManager.DictRankDataCache.ContainsKey(tempKey)) { ServerRankBackupManager.DictRankDataCache[tempKey] = data; } else { ServerRankBackupManager.DictRankDataCache.Add(tempKey, data); } } else { Logger.Fatal("RankServer.Instance.DB.Get DataStatus.Ok != result.Status [{0}]", tempKey); } } bool ok = false; if (null != data) { foreach (var item in data.List) { if (item.Type != type) { continue; } MsgRankList msgList = new MsgRankList(); msgList.ServerId = sid; msgList.Type = type; foreach (var rankItem in item.Items) { if (msgList.Items.Count >= ServerRankBackupManager.MAXMember) { break; } MsgRankItemData msgItem = new MsgRankItemData(); msgItem.CharacterId = rankItem.CharacterId; msgItem.Name = rankItem.Name; msgItem.Value = rankItem.Value; msgList.Items.Add(msgItem); } msg.Response.Data.Add(msgList); ok = true; break; } } if (!ok) { //数据库没找到就取当前数据 needSave = true; foreach (var rankMgrKV in ServerRankManager.Ranks) { if (rankMgrKV.Value.ServerId != sid) { continue; } foreach (var rank in rankMgrKV.Value.rank) { if (rank.Value.RankType != type) { continue; } ok = true; MsgRankList msgList = new MsgRankList(); msgList.ServerId = sid; msgList.Type = type; foreach (var charId in rank.Value.RankUUIDList) { if (msgList.Items.Count >= ServerRankBackupManager.MAXMember) { break; } DBRank_One one = null; if (!rank.Value.DBRankCache.TryGetValue(charId, out one)) { continue; } MsgRankItemData msgItem = new MsgRankItemData(); msgItem.CharacterId = one.Guid; msgItem.Name = one.Name; msgItem.Value = one.Value; msgList.Items.Add(msgItem); } msg.Response.Data.Add(msgList); break; } break; } } if (!ok) { Logger.Fatal("SSGetRankDataByServerId [{0}]-[{1}]", timeStr, type); } } msg.Reply((int)ErrorCodes.OK); if (needSave) { //需要保存数据库 var passedTime = DateTime.FromBinary(time); var serverl = new List <int>(); foreach (var item in serverList.Items) { serverl.Add(item); } var co = CoroutineFactory.NewSubroutine(ServerRankBackupManager.BackupAllRankCoroutine, coroutine, serverl, passedTime); if (co.MoveNext()) { yield return(co); } } yield break; }