开发者社区> 问答> 正文

关于用mongodb存游戏数据的一些问题

大家好,我现在正在设计用java开发一款rpg挂机类游戏,滚服模式,大部分玩法都是单机,在数据结构和保存方面,有几个疑惑点,以前没用过mongo,不太好取舍,还请不吝赐教。

首先,我的数据在内存(从数据库加载出来之后,存在内存中)中的结构大概是这样:

class Player{

List<Item> items;            //道具列表

List<Card> cards;           //卡牌列表

List<Mission> missions;  //任务列表

.......                              //此外还有一系列的列表和内嵌对象结构

}

Player类中的数据,大部分都是需要频繁读写的数据。

然后,数据的加载发生在玩家上线,内存中没有玩家数据时,去数据库加载游戏需要的各种数据,然后组成Player对象放到内存中。 数据的保存目前有两套方案:

1:定时存储(把玩家对象中,发生了变化的数据设计到的所有列表做覆盖更新)。

2:及时处理数据变更(哪些数据发生了变化,及时做数据库更新)。

经过一番内部讨论,选用了方案2,然后遇到了一个问题:(问题A) 如果我的一个逻辑对其中一个列表数据,比如items列表做了多种操作:有新增、删除和多个更新,这个时候没法用一条sql来更新这些数据。


我这里提几个问题,请大佬们帮忙参考下:

1:这种数据做定时存储的话,如果单个玩家的数据量稍微有点大,500K~100k,每次批量更新多个玩家的数据,有什么问题?
2:我Player对象中的数据,是放在一张表好,还是每个列表分成一个表好,为什么?

3:(这个有点长,提出来看起来方便点)如果我把逻辑和db分开,用多线程处理,还是用items列表为例,数据发生了变化,我直接把items列表传给db线程去保存(覆盖更新的方式),mongo底层的遍历会与逻辑线程对items的并发操作发生冲突,产生并发修改异常,这里我想了很多种方法,比如逻辑线程把数据编码成json,然后db把json解析出来、对数据进行加锁(比如使用ConcurrentHashMap)、逻辑线程在发送数据的时候,新建一个列表,把items中的元素拷贝到新列表传给db线程、直接在逻辑线程中处理db更新、逻辑线程告知db线程数据的变更情况,db线程做差异更新(但是会遇到问题A的情况),这种情况是用那种方式处理比较好呢,或者有其他的方法?

跪求大佬分析一波啊,不胜感激!

展开
收起
5lmosptwzjx2q 2020-09-19 18:07:21 1364 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
Data as a Service - 数据即服务 -- MongoDB⾼级应⽤模式 立即下载
MongoDB多数据中心的方案选型之路 立即下载
饿了么高级架构师陈东明:MongoDB是如何逐步提高可靠性的 立即下载