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. Redis+MySQL冷热数据交换

    场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数 ...

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

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

  4. mysql 冷热表_Redis+MySQL冷热数据交换

    场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数 ...

  5. 揭秘英雄联盟的数据服务器

    揭秘英雄联盟的数据服务器 Hey,大家好!我是 Bill "LtRandolph" Clark,一名英雄联盟的游戏工程师.许多 Rioter 工程师关注大量的内容需要直接发送给玩家 ...

  6. Redis集群——利用Gearman在Lnmp架构中做MySQL的缓存服务器

    一.概述 Redis的集群主要是使用切片技术来搭建的,简单来说就是把所有KEY分散存放到不同的redis节点上(不要把鸡蛋都放在一个篮子里). 1. 集群基本原理 Redis集群中内置了16384个槽 ...

  7. 阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用

    (原创出处为本博客,http://www.cnblogs.com/linguanh/) 目录: 一,下载 二,解压 三,配置与启动 四,测试 Redis 五,配置 phpRedis 扩展 六,综合测试 ...

  8. redis配置mysql缓存_Redis做mysql的缓存服务器

    一redis简介:redis 是一个高性能的 key-value 数据库. redis 的出现,很大程度补偿了memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好 ...

  9. Redis在游戏服务器中的应用

    https://www.cnblogs.com/agent-k/p/Redis.html Redis在游戏服务器中的应用 Agent`K 最近在使用Redis,忽然发现以前很多费神的事情都迎刃而解了, ...

最新文章

  1. End Credits
  2. python真的那么强大嘛-python强大吗
  3. Markdown编辑器攻略——字体,字号,颜色
  4. win7远程桌面连接_Windows10远程桌面使用方法
  5. 太突然!一日本上班族大叔被通知得了诺贝尔奖,他却选择消失了16年,又有重大发现!...
  6. 修改oracle实例名orcl为demo
  7. Python编程教程:用tkinter写个密码器
  8. magento 优化 php.ini,PHP.ini配置文件(中文) | Magento UI
  9. 【ElasticSearch】Es 源码之 HttpServerTransport 源码解读
  10. python自动化学习之语法学习(判断语句和循环语句)
  11. Intent以及IntentFilter详解 1
  12. python实现异步的原理_一篇文章理解Python异步编程的基本原理
  13. 【回归预测】基于matlab麻雀搜索算法优化CNN回归预测【含Matlab源码 282期】
  14. Fullscreen API
  15. 使用周期一致的对抗网络进行不成对的图像到图像转换
  16. linux怎么让cpu不自动降频,Win10 CPU自动降频怎么办?Win10下让CPU不降频设置方法
  17. 360 mysql读写分离_mysql-proxy之奇虎360 Atlas 安装实现mysql读写分离
  18. Android刘海屏适配
  19. nvm安装、下载以及nvm使用教程
  20. send函数何时返回

热门文章

  1. dnf剑魂buff等级上限_DNF玩家超时空遇神豪红眼,只穿防具秒BOSS,团长直呼:巨佬...
  2. ASP.NET项目部署(内含所有Visual Studio版本)
  3. 〖编程初学者的自我修养 - 精炼面试篇③〗- 如何通过「自我介绍」更好的推销自己
  4. wxpython问卷调查界面_评测:超级好用的4款问卷调查工具
  5. 谷粒商城-nginx
  6. 【UML类图】空心菱形和实心菱形的区别
  7. mysql 事务的好坏_mysql存储引擎:InnoDB和MyISAM的差别/优劣评价/评测/性能测试
  8. 爆笑:最近只有趴着睡才能睡着
  9. 陪孩子一起学python第二季_陪伴的句子
  10. 热血江湖数据库MYSQL修改_求更多热血江湖私服 修改数据库语句