MongoDB不多说,不是一个类型的东西,Redis相对Memcached来说功能和特性上的优势已经很明显了。而对于性能,Redis作者的说法是平均到单个核上的性能,在单条数据不大的情况下Redis更好。为什么这么说呢,理由就是Redis是单线程运行的。因为是单线程运行,所以和Memcached的多线程相比,整体性能肯定会偏低。因为是单线程运行,所以IO是串行化的,网络IO和内存IO,因此当单条数据太大时,由于需要等待一个命令的所有IO完成才能进行后续的命令,所以性能会受影响。
mongodb众所周知不支持事务,所以需要强事务的业务根本不能考虑mongodb。
mongodb的优势就是文档存储:
1 业务经常变动,需要不时的添加字段,那么mongodb比较适合,关系型数据库添加字段的复杂度也还好
2 嵌套文档,业务数据比较复杂,适合嵌套文档式存储,那么mongodb非常合适,这个关系型数据库比较难搞,虽然MySQL和pg也有文档存储,但MySQL的不成熟,pg毕竟现在生产中使用还是偏少,个人也不了解,这里不谈。但这不仅仅这一点优势,具体下面会细说。
3 upsert支持,查询速度也不慢
4 高可用的副本集支持
5 查询语法非常丰富,嵌套文档查询功能非常强大,不是重度用户可能不能理解
下面说说一个具体的使用事例:
项目的一条数据在10kb左右,如果使用关系型数据库那么需要将这条数据拆分成大概几百条左右,建造多个表,设计较复杂,这种数据大概在一百万条左右,想想拆分后在十几亿的数据量就可怕。打平后的数据什么DB也都可以拿下,只是一百万变十几亿比较恐怖而已。
如果采用MySQL存储,每次查询需要使用外键查询多个表,从这些表中拉取数据,性能肯定要下降很多,比不上只在一个表查询,而且只拉取少两个数量级的数据。查询也还好,业务允许可以对结果做缓存,放到redis里去。
但是重点来了,需求要增量更新部分数据,这时候需要更新多个表,根本没法做到原子性(注意事务不是原子 *** 作),当然也可以使用cas等技术补偿,达到最终一致性。但使用mongodb存储只需要update一条数据,对相应的嵌套文档中内容更新,可以做到原子性,是不是很方便?
推荐学习《python教程》
具体说说该项目的难点,查询无法使用缓存,可能会很吃惊,但是业务决定了确实做不了,而且增量更新的量达到上万的QPS,如果不能保证原子性想想多么可怕!
所以mongodb在这里帮了大忙,关系型数据库解决不了这个难题。
有人可能要问,mongodb没有事务,上游数据写入也会有问题,你不可能所有数据都存一个表吧?
当然不是的,我们mongodb里的数据是从MySQL中清洗出来存到mongodb中的,mongodb只做单点的业务需求,综合的数据还是在MySQL中。
此项目我们用了上百个副本集,保证系统的高可用,这些副本集配置只要一条shell就搞定,如果用MySQL的主从不知道怎么配(我自己不懂),估计DBA得忙死,而该项目完全不需要也没用到DBA。
说了这么多mongo的优点,也说说他的缺点:
1 查询优化器和MySQL没法比
2 不支持reload,只能冷重启,初始化配置的时候比较麻烦
3 没有事务,不敢存储第一手数据,多用来做备份数据的存储
mongodb可以做很多事情,取决于你脑洞,性能不差,存一些相对不重要的数据,mongodb嵌套文档功能强大,多看看官方文档挖掘挖掘有用信息,每次都能发现惊喜。
use
命令
MongoDB
use
DATABASE_NAME
用于创建数据库。该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库。
语法:
use
DATABASE
语句的基本语法如下:
use
DATABASE_NAME
示例:
如果想创建一个数据库名称
<mydb>,
那么
use
DATABASE
语句如下:
>use
mydb
switched
to
db
mydb
要检查当前选择的数据库使用命令
db
>db
mydb
如果想检查数据库列表,使用命令show
dbs
>show
dbs
local
078125GB
test
023012GB
创建的数据库mydb
列表中是不存在的。要显示的数据库,需要把它插入至少一个文件。
>dbmovieinsert({"name":"tutorials
yiibai"})
>show
dbs
local
078125GB
mydb
023012GB
test
023012GB
在
MongoDB
默认数据库测试。如果没有创建任何数据库,然后集合将被存储在测试数据库。
游戏服务器开发中,玩家的账号,背包,装备,物品,排名等数据都需要落地存储在数据库中。行业中主流的数据库当属mysql,优点是免费开源,从端游时代过渡过来的程序员,求稳保守的话大多数会选用mysql数据库做存储。但是游戏中要存储的数据表会经常改动,导致数据库的表会频繁更新改动表结构,如果游戏数据量达到千万级别,对所有的表刷新改动会是一项很恐怖的事情,期间如果再出错,运维跟开发人员估计全都GG。
为了应对方便扩展,提升读写速度,NoSQL数据库(非关系型数据库)诞生。在NoSQL中应用比较广泛的当属mongodb和redis,由于对开发者友好,方便快速开发迭代高可用复制集满足数据高可靠、服务高可用的需求,运维简单,故障自动切换可扩展分片集群海量数据存储被游戏服务器广泛应用。现在的项目《鹿鼎记》用redis做高速缓存角色列表信息数据。
以上就是关于游戏服务器使用MongoDB作为数据库,还有必要使用Redis缓存吗全部的内容,包括:游戏服务器使用MongoDB作为数据库,还有必要使用Redis缓存吗、mongodb数据库适合做什么、如何在mongodb中创建一个数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)