热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ET中的数据存储与终章

ET中的数据存储ET采用MongoDb进行数据存储,并将数据存储部分拆分

ET中的数据存储

ET采用MongoDb进行数据存储,并将数据存储部分拆分为单独的数据存储服务,游戏逻辑端使用数据存储代理组件处理。整体代码如下图所示:

数据库代理服务组件整体如下图所示: 

可以看出,ET按照请求类型的不同拆分到不同的Task执行。实际上,ET默认是开了32个协程(代码见: DBComponent.Awake
)来调度所有Task。当然,线程仍然是只有一个。MongoDB驱动有提供异步处理函数,所以这种方式不会阻塞主线程逻辑处理

数据库操作游戏端整体结构如下图所示:

说明:

  • 游戏逻辑服务通过数据库代理组件访问数据库代理服务

  • 游戏逻辑服务和数据库代理服务通过自定义的RPC进行通信

mongodb简介

mongodb是nosql数据库分支中的一个重要代表——文档数据库。它有如下特点:

  • 开源数据库 mongodb是一个开源数据库,但实际是分为社区版和企业版。区别只是企业版功能丰富些。

  • 支持GridFS,可以存储大文件和海量数据 GridFS是大文件存储在mongodb中的一种规范,使用分片方式存储超过16兆的文件

  • 使用Bson表示和存储数据 Bson可以理解为是json的升级版,它可以有效存储字节流数据。因为它采用Length+Data格式表示数据,所以它的检索速度比json快很多

  • 非常灵活 如果访问的数据库不存在则自动创建;如果访问的collection(相当于关系型数据库中的表)则自动创建。可以随意调整colletion中每项数据的结构,而不用做提前处理(关系型数据库表结构调整都需要用sql提前处理)

  • 支持水平扩展 网上说用两台服务器就可以将性能提升一倍,实际应该没这么夸张,但确实会提升很大的性能,具体可以简单了解下其原理就知道了

  • 单机性能比mysql要好很多 腾讯云2核4G服务器QPS(50%写%50读的情况下):5000 。mysql的TPS只有860

  • 有sql中间件 可以使用sql简单查询mongodb中的数据


当然以上并没有完全包含mongodb的所有特点。如需要具体了解可以查看最后的参考资料


mongodb才出现时,有很多人都感叹,这不就是为游戏而生的数据库么。经过反复思量,这点我也比较赞同。游戏数据存储有以下特点:


  • 写多于读 玩家的同一条数据一般最多只会读一次,但会反复更新。而这正是mongodb的长项

  • 数据间弱关系 一般玩家数据要么按照模块取出,要么直接全部取出,玩家的所有数据间的关系一般都比较弱化(特别是数据库端)


可以看出,关系型数据库的特点基本没有在玩家数据中有体现。特别是在mongodb也有很成熟的sql中间件时,它可以较好解决运营过程和问题排查过程对数据查询的sql的需求

网上也有测试说mongodb在有此情况下性能表现都不如mysql。这个不可否认,mongodb主打的是数据存储和简单访问。所以很多特殊操作可能确实不如mysql


最后,有没有心动?放弃mongodb可以,但至少作为游戏开发的你值得去好好了解下mongodb。或许就喜欢上了呢

终章

这是ET框架系列的最后一篇文章啦(以后或许会补充一些)。其中没有详解的部分包含前端部分,rpc部分。前端不在我现在熟知的范围内。rpc部分将在接下来用一系列文章详解

看了大部分ET代码后,不得不感叹作者的学识和智慧,和对知识的理解入微。好的代码就像一个艺术品。读着这篇文章的你有没有感受到呢?

参考资料
  • Cassandra简介

  • MongoDB 入门篇

  • Mysql和MongoDB性能对比及应用场景分析

  • MongoDB的真正性能-实战百万用户

  • mongodb三种存储引擎高并发更新性能专题测试

  • Mongodb 与 MySQL对比

后续计划

接下来,我会写一系列关于RPC的文章。我有用go语言实现了一个可以两边rpc的框架(还在完善中),主要借鉴了grpc和golang标准库的rpc。有兴趣的同学可以看看哈。

至于不同类型游戏的数据存储由于拆出来单看存储意义不大,所以将在后面拆解不同游戏类型的框架设计时再具体分析和设计数据存储部分。

写在最后

本公众号将持续推送游戏后端开发相关文章,大家记得扫码关注哦



推荐阅读
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • mysql数据库json类型数据,sql server json数据类型
    mysql数据库json类型数据,sql server json数据类型 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • Ext JS MVC系列一:环境搭建与框架概览
    本文主要介绍了如何在项目中使用Ext JS 4作为前端框架,并详细讲解了Ext JS 4的MVC开发模式。文章将从项目目录结构、相关CSS和JS文件的引用以及MVC框架的整体认识三个方面进行总结。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 本文探讨了如何在Docker构建过程中使用动态环境变量,特别是针对Docker v1.9及以上版本的用户。我们将介绍如何声明和使用构建参数,以及这些参数对构建缓存的影响。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
author-avatar
自由就是幸2602880665
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有