optimize db writes, should improve performance in high player server

This commit is contained in:
rafi1212122
2023-06-14 23:29:36 +07:00
parent e414af2d84
commit 67de5290b8
3 changed files with 36 additions and 11 deletions

View File

@@ -1,6 +1,5 @@
using Common.Resources.Proto; using Common.Resources.Proto;
using Common.Utils.ExcelReader; using Common.Utils.ExcelReader;
using Newtonsoft.Json;
using MongoDB.Bson; using MongoDB.Bson;
using MongoDB.Driver; using MongoDB.Driver;
@@ -62,6 +61,18 @@ namespace Common.Database
return avatar; return avatar;
} }
public static void SaveBulk(IEnumerable<AvatarScheme> avatars)
{
List<WriteModel<AvatarScheme>> ops = new();
foreach (AvatarScheme avatar in avatars)
{
ops.Add(avatar.SaveOp());
}
collection.BulkWrite(ops);
}
} }
public class AvatarScheme : Resources.Proto.Avatar public class AvatarScheme : Resources.Proto.Avatar
@@ -75,12 +86,16 @@ namespace Common.Database
public uint OwnerUid { get; set; } public uint OwnerUid { get; set; }
public new List<AvatarSkill> SkillLists { get; set; } = new(); public new List<AvatarSkill> SkillLists { get; set; } = new();
public void Save() public void Save()
{ {
Avatar.collection.ReplaceOne(Builders<AvatarScheme>.Filter.Eq(avatar => avatar.Id, Id), this); Avatar.collection.ReplaceOne(Builders<AvatarScheme>.Filter.Eq(avatar => avatar.Id, Id), this);
} }
public WriteModel<AvatarScheme> SaveOp()
{
return new ReplaceOneModel<AvatarScheme>(Builders<AvatarScheme>.Filter.Eq(avatar => avatar.Id, Id), this);
}
public PlayerLevelData.LevelData AddExp(uint exp) public PlayerLevelData.LevelData AddExp(uint exp)
{ {
PlayerLevelData.LevelData levelData = AvatarLevelData.GetInstance().CalculateLevel((int)Level, (int)(exp + Exp)); PlayerLevelData.LevelData levelData = AvatarLevelData.GetInstance().CalculateLevel((int)Level, (int)(exp + Exp));

View File

@@ -33,6 +33,18 @@ namespace Common.Database
InitData(uid); InitData(uid);
return collection.AsQueryable().Where(x => x.OwnerUid == uid && ShowMapList.Contains(x.MapId)).ToList(); ; return collection.AsQueryable().Where(x => x.OwnerUid == uid && ShowMapList.Contains(x.MapId)).ToList(); ;
} }
public static void SaveBulk(IEnumerable<OpenWorldScheme> openWorlds)
{
List<WriteModel<OpenWorldScheme>> ops = new();
foreach (OpenWorldScheme ow in openWorlds)
{
ops.Add(ow.SaveOp());
}
collection.BulkWrite(ops);
}
} }
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
@@ -50,5 +62,10 @@ namespace Common.Database
{ {
OpenWorld.collection.ReplaceOne(Builders<OpenWorldScheme>.Filter.Eq(x => x.Id, Id), this); OpenWorld.collection.ReplaceOne(Builders<OpenWorldScheme>.Filter.Eq(x => x.Id, Id), this);
} }
public WriteModel<OpenWorldScheme> SaveOp()
{
return new ReplaceOneModel<OpenWorldScheme>(Builders<OpenWorldScheme>.Filter.Eq(x => x.Id, Id), this);
}
} }
} }

View File

@@ -23,15 +23,8 @@ namespace PemukulPaku.GameServer.Game
{ {
User.Save(); User.Save();
Equipment.Save(); Equipment.Save();
Common.Database.Avatar.SaveBulk(AvatarList);
foreach (AvatarScheme Avatar in AvatarList) OpenWorld.SaveBulk(OpenWorlds);
{
Avatar.Save();
}
foreach (OpenWorldScheme OpenWorld in OpenWorlds)
{
OpenWorld.Save();
}
} }
public void ResetAvatarsTodayGoodfeel() public void ResetAvatarsTodayGoodfeel()