1、数据服务器详细设计

数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改。

数据层次上分为:内存数据,redis数据,mysql数据

设计目的:首先保证数据的可靠,防止数据丢失,保证数据完整。然后实现数据的高速访问,减少由玩家数量增加对数据服务器性能造成的影响。最后实现运维数据的入库,以及数据持久化。

在这个基础上数据服务器不再是一个单一服务器,它涉及到与其他服务器之间的交互。

数据服务器的核心在于redis数据层面。通过redis加快玩家数据的快速拉取。

内存数据是直接与逻辑服务器进行交互的,因此内存数据划分到逻辑服务器进行管理,redis数据划分为数据服务器管理,mysql数据是对redis数据库的备份和同步。

主要流程,数据服务器启动时先从mysql数据库加载所有的活跃玩家相关数据到redis数据库中,逻辑服务器与数据服务器之间的交互都是通过国过redis数据进行操作。Redis数据库回写到mysql可以通过回写进程实现。

            图 1 数据服务器数据扭转流程图

1.1 数据服务器主进程

数据服务器主进程核心是对redis的操作,通过redis数据库实现数据的高速存储。因此,数据服务器的核心是保证在玩家数量大较大的情况下对玩家数据的增删改都能维持在一定的时间效率内。

针对于redis数据库本身,可以考虑实现redis的主从库搭建,保证redis的数据库的备份和效率。

数据服务器主进程的构成:

1、mysql数据同步到redis数据库中。

2、逻辑服务器和数据服务器的网络库

3、玩家账户修改缓存

4、Redis数据库的回写至mysql

5、逻辑数据库的请求处理

6、内存数据库的组织结构

1.2 数据回存服务

数据服务器接收到逻辑服务器的请求后,就数据库操作请求进行操作的队列缓冲,形成操作队列。操作队列同时提供了redis数据库的及时写入和mysql数据库的异步写入。

1.3 数据服务器提供接口

对于逻辑服务器,数据服务器应为其开放以下接口:

1、数据拉取接口,拉取对应玩家的所有数据,将数据保存到内存数据中

2、修改玩家数据接口,提供玩家的部分或全部信息修改命令

2 数据服务器模块功能

首先redis是一种key-value的内存数据库,以key和value的方式来存储数据实现高速的访问和操作。其次mysql是一种关系型数据库,存储的是结构化的数据。这种差异决定了在数据入库redis的时候需要做相应的处理。

2.1 数据入库redis

通过redis的key-value来存储数据库中的表名以及表的索引和hashkey,来实现构造二维的数据表。

针对于每张表,key结构 [表名]:[id值]

要求所有的数据库表的第一个字段为id,或者所有的表都为主键,并且不能重复,这样保证了所有的key都不重复

图 2 数据入库redis后表现结构

入库流程方法一:

先将redis清空,再将mysql所有的额数据逐条入库到redis。逐条入库的好处是可以对玩家进行其他的操作处理,缺点是启动服务器速度慢。

方法二:

先将redis数据库清空,再将mysql读取处理的数据缓存成redis识别的事务,一次性进行redis入库。

2.2 排序

实现高效的排序功能,可以使用redis的zset进行拍寻队列构建,对于玩家等级或经验改变时,对redis数据库进行修改,当需要或获取排序时直接获取zset集合类已经拍好的顺序就可以实现高效的排序功能

2.3 redis数据回存mysql

对redis数据库的操作需要回存到mysql数据库中。

方案一:采用多线程异步,通过多线程异步实现mysql修改回存同步。在数据服务器多开一个线程进行回存。

优点:设计结构相对简单,不涉及到进程间通信,但需要多线程开发支持

方案二:采用多进程方式,回存由专门的进程进行,没有操作消息redis数据库默认转发进程转发。

优点:简单的单线程即可满足需求,但需要进程间通讯。

2.4 网络交互模块及序列化

服务器之间的网络传输由统一的网络模块进行。序列化功能采用protobuf的序列化功能。

3 具体实现

数据服务器设计到大多都是表和redis数据操作,这些操作具有相似性。这样的繁杂的操作不利于手动修改和书写代码。

因此在此处合理的运用生成器就会减少很大一部分工作量,通过生成器快速生成C++代码,并且灵活的应对数据库结构的更改。

3.1 生成物和生成器

生成器使用了C#语言快速编写访问数据库结构,并生成类代码。

生成物可以设计成各种语言的操作文件,目前生成C++文件。

3.2 Mysql数据回写进程

数据回写进程又一个回写消息队列和一个回写器组成,回写消息队列缓存所有要进行回写操作,再有回写器进行回写。多线程回写消息队列操作加锁。

3.3 玩家登陆信息查询

玩家登陆时将拉取玩家数据到内存中。这个流程现在redis数据库中查询玩家数据,如果存在,返回给逻辑服务器玩家数据,如果redis数据库中不存在玩家数据,将再次在mysql中进行查询,如果存在返回给逻辑服务器,如果不存在返回查询失败。具体流程看下图

    

                图 3 玩家数据查询流程

在修改玩家数据时,需要同步三层数据。数据首先是在内存中进行修改,然后发起修改命令给数据服务器,数据服务器将修改命令分别压入redis数据库命令队列和mysql命令队列。再有两个线程异步对命令队列中的命令执行,完成数据回写。

图 4 数据回写命令执行流程

3.4 玩家活跃程度划分 

为了提高数据的访问速度和效率,将玩家进行活跃度分级。正在游戏玩家数据加载到内存,快速访问。活跃玩家加载到redis数据库,实现快速拉取。不活跃玩家存放mysql,需要时访问查询。

优点:根据数据的访问频度对数据进行分级,使得高频数据快速访问,节约了内存空间。

缺点:不活跃玩家登陆时间相对较长,但不影响游戏效率。登陆后,玩家又再次进入活跃玩家存储方案。

转自:http://www.cnblogs.com/captainl1993/p/4788236.html

基于内存,redis,mysql的高速游戏数据服务器设计架构相关推荐

  1. redis+mysql游戏数据服务器

    1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的:首先保证数据的可靠,防止数据丢失, ...

  2. Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步

    Linux企业化运维 实验所用系统为Redhat-rhel7.6. 目录 Linux企业化运维 Linux企业化运维--(7)redis服务之redis配置及主从复制.主从自动切换.集群.redis+ ...

  3. Python 基于Python从mysql表读取千万数据实践

    基于Python 从mysql表读取千万数据实践   by:授客 QQ:1033553122 场景:   有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...

  4. 揭秘《英雄联盟》的游戏数据服务器

    Hey,大家好!我是 Bill "LtRandolph" Clark,一名英雄联盟的游戏工程师.许多 Rioter 工程师关注大量的内容需要直接发送给玩家问题--这是两个我最近最喜 ...

  5. 【java毕业设计】基于javaEE+SSH+MySql+MVC的动漫论坛设计与实现(毕业论文+程序源码)——动漫论坛

    基于javaEE+SSH+MySql+MVC的动漫论坛设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+SSH+MySql+MVC的动漫论坛设计与实现,文章末尾附有本毕业设计的 ...

  6. android毕业设计——基于Android+XAMPP+MySQL的家校互动平台设计与实现(毕业论文+程序源码)——家校互动平台

    基于Android+XAMPP+MySQL的家校互动平台设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Android+XAMPP+MySQL的家校互动平台设计与实现,文章末尾附有本毕业设 ...

  7. mysql意见反馈表设计_一个基于PHP和MySQL的意见反馈模块的设计和实现

    一个基于PHP和MySQL的意见反馈模块的设计和实现杜大刚 [期刊名称]<计算机与现代化> [年(卷),期]2005(000)003 [摘要]本文涉及的意见反馈模块是一个基于PHP和MyS ...

  8. 基于Java和MySql的产业信息管理系统的设计与实现 毕业设计-附源码260839

    ssm产业信息管理系统 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势.互联网的优势和普及使得各种系统的开发成为必需. 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采 ...

  9. ssm基于Java和MySql的产业信息管理系统的设计与实现毕业设计源码260839

    ssm产业信息管理系统 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势.互联网的优势和普及使得各种系统的开发成为必需. 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采 ...

最新文章

  1. 元宇宙iwemeta: 元宇宙与数字经济
  2. linux清空文件内容的几种方式与区别
  3. 人物-商界-张茵:张茵
  4. 手动启动oracle服务教程,windows下手动启动oracle服务
  5. c语言解数独算法递归,How to think:递归和数独试探算法
  6. 【Android开发日记】妙用 RelativeLayout 实现3 段布局
  7. mysql 索引长度解释及不使用索引的一种特殊情况
  8. python数据结构-顺序表
  9. 二分类变量相关性分析spss_两个有序分类变量相关性的卡方检验-SPSS教程
  10. 【硬见小百科】数字万用表的工作原理
  11. THREE.JS 导入STL格式的模型
  12. keras中sample_weight的使用
  13. HardFault错误信息分析定位
  14. App Store,“穷人靠变异”的爬虫路
  15. 题目0121-机器人走迷宫
  16. vb酒店管理信息系统
  17. 母亲大人辛苦了(snowfall.jquery实现爱心掉落)
  18. 【论文分享】BERTifying the Hidden Markov Model for Multi-Source Weakly Supervised Named Entity Recognition
  19. InternImage
  20. 2014年发生的一些事情

热门文章

  1. python求平方值_python – Statsmodels:计算拟合值和R平方
  2. win10 wifi 时断时续 无internet 安全 解决办法
  3. 千峰JAVA逆战班Day38
  4. 一个女生骂男生不带脏字。。强得很
  5. 某mm骂他男友,都不带脏字
  6. 站在三岔路口的全面屏手机,最终会走向何方?
  7. 计算机研究生开题,计算机研究生论文开题报告
  8. 平均数、众数、中位数、极差、方差、标准差……
  9. 哈萨克斯坦各地正在进行的抗议和骚乱
  10. jQuery 自动完成