关于游戏频繁数据更新问题
发布于 9 年前 作者 im-here 6091 次浏览 最后一次编辑是 8 年前 来自 问答

游戏里玩家数据(资产等级等等),这些数据在玩家游戏的过程中随时在变(改变的频率很高),对应这种数据一般怎么处理? 1.实时写到数据库?这种方式肯定对数据库压力很大。 2.只更新内存,通过定时任务写到数据库?

该怎么做呢?

12 回复

第二种,先redis再数据库

@jiangliqin @captainblue2013 谢谢。 那如果用redis ,我在定时写数据的时候如何判断哪些字段需要更新?或者是全部更新。这块应该如何设计呢?

个人认为,游戏里的玩家数据(资产等级等等)肯定是频繁调用的,在Mongo里面肯定是热数据,热数据的update也是在内存中操作的,个人感觉Mongo值得一试

资产 等级肯定是不可丢失的数据,假如使用redis,使用快照的持久化策的话redis遇到瓶颈就会丢失数据,使用AOF持久化策略会严重影响性能,可以尝试下mongo

@imhered 不明白判断更新哪些字段指的什么意思?如果随着一个完整的业务流量结束后,就可以定时批量写入数据库,在业务处理的各个环节中,需要更新哪些字段,直接在redis取出-更新操作。

@jiangliqin 例如一张表包含gold和diamond两个字段,玩家在游戏的过程中,gold和diamond都可能发生变化,也可能不发生变化,最优的做法肯定是我在定时往数据库里写的时候只写变化了的字段。实际业务中字段肯定很多,我在定时往数据库里写的时候如何知道哪些是变化了的呢(即我要更新的字段)

@imhered 如果你实在不知道更新了哪些字段,可以用upsert啊

@jiangliqin 好的谢谢,我用的是mysql,我研究下这个upsert。

针对玩家数据(个人信息、资产、装备等)由于数据量相对较大,不建议使用redis存储;对于mongodb如果数据设计合理的情况下,更新并不会很慢,而且可以省略由内存到mysql等数据同步的问题;

@haozxuan 现在数据库用的mysql,没用mongodb,所以还是得用缓存

回到顶部