大家好,我现在正在设计用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的情况),这种情况是用那种方式处理比较好呢,或者有其他的方法?
跪求大佬分析一波啊,不胜感激!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。